Spring Cloud 마이크로 서비스 구조 에서 의 WebSocket 솔 루 션 을 상세 하 게 설명 합 니 다.

8310 단어 SpringCloudWebSocket
웹 소켓 은 현대 브 라 우 저 에서 의 응용 이 비교적 보편적 인 편 이다.일부 업무 장면 에서 서버 에서 클 라 이언 트 에 메 시 지 를 전송 할 수 있어 야 한다.웹 소켓 이 없 는 시대 에 우 리 는 dwr 를 사용 한 적 이 있 는데,그때 dwr 는 정말 좋 은 방안 이 었 다.그러나 웹 소켓 이 유행 한 후에 우 리 는 표준 실현 을 통 해 문 제 를 해결 하고 싶 습 니 다.
먼저 이 글 은 웹 소켓 의 설정 을 설명 하지 않 고 마이크로 서비스 구조 클 러 스 터 모델 에서 해결 방안 을 선택 하 는 것 을 말한다.
마이크로 서비스 구 조 는 모두 가 낯 설 지 않 을 것 이다.마이크로 서비스 구조 에서 서 비 스 는 분포 식 이 고 업무 의 가용성 을 확보 하기 위해 모든 서 비 스 는 군집 의 형식 으로 존재 한다.클 러 스 터 모드 에서 클 러 스 터 의 모든 노드 의 방문 이 같은 결 과 를 얻 으 려 면 캐 시,session 등 데이터 일치 성 을 가 져 야 합 니 다.
마이크로 서비스 클 러 스 터 캐 시 는 보통 분포 식 캐 시 redis 를 사용 하여 해결 되 며,session 일치 성도 redis 를 통 해 해결 되 지만,현재 더욱 유행 하 는 것 은 무 상태의 Http,즉 무 session 화 이 며,가장 흔 한 해결 방안 은 OAuth 입 니 다.
웹 소켓 은 다 릅 니 다.서버 와 긴 연결 을 만 드 는 것 입 니 다.클 러 스 터 모드 에서 전단 과 서비스 클 러 스 터 의 모든 노드 를 연결 할 수 없습니다.http session 의 공 유 를 해결 하 는 것 처럼 redis 를 통 해 웹 소켓 의 session 공 유 를 실현 하 는 것 이 가능 한 사고 입 니 다.그러나 웹 소켓 session 의 수량 은 http session 보다 훨씬 많 습 니 다.
또 다른 사고방식 은 웹 소켓 은 어쨌든 집단의 특정한 노드 와 연결 을 맺 는 다 는 것 이다.그러면 연결 이 있 는 노드 를 찾 으 면 서버 에 메 시 지 를 전송 할 수 있다.그러면 해결 해 야 할 문 제 는 웹 소켓 연결 이 있 는 노드 를 어떻게 찾 느 냐 하 는 것 이다.어느 노드 에 연결 되 어 있 는 지 찾 으 려 면 연결 을 찾 는 유일한 식별 자가 필요 합 니 다.그러나 stomp 기반 의 게시-구독 모드 에서 한 메시지 의 푸 시 는 여러 개의 연결 을 대상 으로 할 수 있 고 클 러 스 터 의 모든 노드 에 분포 할 수 있 습 니 다.이렇게 연결 을 찾 는 대가 도 높 습 니 다.기왕 이렇게 된 이상 우 리 는 사고방식 을 바 꾸 어도 무방 하 다.모든 웹 소켓 메 시 지 는 집단의 모든 노드 에서 푸 시 를 하고 이 메시지 의 연결 을 구독 했다.하나 든 만 개 든 최종 적 으로 이 소식 을 받 을 수 있 을 것 이다.이 사고방식 을 바탕 으로 우 리 는 몇 가지 기술 선택 을 했다.
  • RabbitMQ
  • Spring Cloud Stream
  • 먼저,RabbitMQ,고급 메시지 큐 는 메시지 방송(물론 kafka 처럼 할 수 있 습 니 다.여 기 는 한 가지 만 소개 합 니 다)을 실현 할 수 있 습 니 다.다른 기술 은 Spring Cloud Stream 입 니 다.stream 은 고도 로 확장 가능 한 이벤트 구동 형 마이크로 서 비 스 를 구축 하 는 프레임 워 크 이 고 RabbitMQ,Kafka 및 기타 다양한 정보 서비스 와 통합 하여 stream 을 사용 할 수 있 습 니 다.rabbitmq 를 kafka 로 바 꾸 는 것 은 설정 을 바 꾸 는 일 에 불과 합 니 다.다음은 사용법 을 중점적으로 소개 한다.
    도입 의존
    
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-stream</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
    </dependency>
    Binder 설정
    binder 는 stream 의 중요 한 개념 으로 stream 발표 와 구독 이벤트 에 사용 할 메시지 중간 부품 을 설정 하 는 데 사 용 됩 니 다.설정 먼저 보기:
    
    spring:
     cloud:
      stream:
       binders:
        defaultRabbit:
         type: rabbit
         environment:
          spring:
           rabbitmq:
            host: localhost
            username: username
            password: password
            virtual-host: /
    설정 에 있 는 defaultRabbit 는 binder 의 이름 입 니 다.잠시 후 다른 설정 에서 참조 할 것 입 니 다.type 은 메시지 미들웨어 의 종 류 를 지 정 했 습 니 다.environment 는 메시지 미들웨어 에 대한 설정 입 니 다.이 설정 구 조 는 spring.rabbitmq 네 임 스페이스 의 설정 항목 과 똑 같 습 니 다.설정 을 참조 할 수 있 습 니 다.
    
    spring:
     rabbitmq:
      host: localhost
      username: username
      password: password
      virtual-host: /
    그럼 문 을 닫 은 binder 의 environment 설정 은 완전히 지 울 수 있 습 니 다.
    메시지 흐름 과 binder 의 연결
    마이크로 서 비 스 는 발표 이벤트 메 시 지 를 받 아야 합 니 다.spring cloud stream 의 이름 에 따라 말 그대로 스 트림 을 사용 해 야 하기 때문에 설정 에서 두 개의 이벤트 흐름,하나의 입력 흐름,하나의 출력 흐름 을 설명 해 야 합 니 다.
    
    spring:
     cloud:
      stream:
       bindings:
        websocketMessageIn:
         destination: websocketMessage
         binder: defaultRabbit
        websocketMessageOut:
         destination: websocketMessage
         binder: defaultRabbit
    여기에서 우 리 는 이벤트 흐름 이 binder 를 인용 하여 이 두 흐름 이 rabbitmq 라 는 중간 부품 을 사용 한 다 는 것 을 보 았 다.
    웹 socketMessageIn,웹 socketMessageOut 은 이벤트 스 트림 의 이름 입 니 다.destination 은 두 개의 이벤트 스 트림 의 destination 을 같은 곳 으로 지정 합 니 다.이 는 기록 과 읽 기 가 같은 곳 을 가리 키 는 것 을 결정 합 니 다(같은 메시지 대기 열 이 아 닙 니 다).
    이벤트 흐름 설명
    이벤트 흐름 은 인 터 페 이 스 를 사용 하여 정의 합 니 다:
    
    /**
     * websocket       
     * Created by    on 18-11-8.
     *
     * @author   
     * @since 1.4.3
     */
    interface WebSocketMessageStream {
     companion object {
      const val INPUT: String = "webSocketMessageIn"
      const val OUTPUT: String = "webSocketMessageOut"
     }
    
     /**
      *   
      */
     @Input(INPUT)
     fun input(): SubscribableChannel
    
     /**
      *   
      */
     @Output(OUTPUT)
     fun output(): MessageChannel
    }
    이벤트 스 트림 인 터 페 이 스 를 설명 합 니 다.이 안 에는 두 개의 상수 가 정의 되 어 있 습 니 다.각각 설정 에 있 는 두 개의 스 트림 이름 에 대응 하여 input()방법 으로 입력 스 트림 을 가 져 오고 output()를 호출 하여 출력 스 트림 을 가 져 옵 니 다.
    이 인터페이스의 실현 은 spring cloud stream 에 의 해 이 루어 지 므 로 스스로 이 루어 질 필요 가 없습니다.
    이벤트 흐름 사용
    bean 설명:
    
    @Component
    @EnableBinding(WebSocketMessageStream::class)
    class WebSocketMessageService {
    ……
    이 곳 의@Enablebinding 주 해 는 이벤트 흐름 인터페이스 클래스 를 가리 키 며,이 주 해 를 추가 해야만(Spring 에 의 해 인식 되 고,입구 클래스 에 추가 할 수도 있 고,@Configuration 주해 클래스 에 추가 할 수도 있 음),이 인 터 페 이 스 는 실 현 될 수 있 으 며,Spring 의 용기 에 추가 할 수 있 습 니 다(주입 가능).
    위 웹 소켓 메시지 서비스의 내용 은 다음 과 같 습 니 다.
    
    @Autowired
     private lateinit var stream: WebSocketMessageStream
     @Autowired
     private lateinit var template: SimpMessagingTemplate
    
     @StreamListener(WebSocketMessageStream.INPUT)
     fun messageReceived(message: WebSocketMessage) {
      template.convertAndSend(message.destination, message.body)
     }
    
     fun send(destination: String, body: Any) {
      stream.output().send(
        MutableMessage(WebSocketMessage(destination, body))
      )
     }
    소식 을 받다
    @StreamListener 주 해 는 감청 할 이벤트 흐름 을 가리 키 며,방법 이 받 는 매개 변 수 는 이벤트 의 메시지 내용(jackson 반 직렬 화 사용)입 니 다.이 메시지 Received 방법 은 받 은 메 시 지 를 직접 웹 소켓 으로 전단 에 보 냅 니 다.
    소식 을 보내다
    마찬가지 로 전송 도 간단 합 니 다.입력 흐름 에 메 시 지 를 직접 보 냅 니 다.위의 send 방법 은 SimpMessaging Template 로 웹 소켓 에 보 내야 할 메 시 지 를 spring cloud stream 의 이벤트 흐름 에 보 내 는 것 입 니 다.이렇게 한 후에 프로젝트 에서 웹 소켓 메 시 지 를 전단 으로 전송 해 야 하 는 모든 작업 은 send 방법 으로 진행 해 야 합 니 다.
    여기까지 말 하면 여러분 들 이 좀 헷 갈 리 실 수도 있 고 의문 도 있 습 니 다.왜 이렇게 모든 마이크로 서비스 노드 에서 사건 소식 을 받 을 수 있 습 니까?또는 하나의 노드 가 이벤트 메 시 지 를 받 고 여러 노드 가 받 는 설정 을 어떻게 제어 합 니까?여러분 조급해 하지 마 세 요.제 가 천천히 말 할 때 까지 기 다 려 주세요.다음은 rabbit 의 지식 과 결합 하여 설명 하 겠 습 니 다.
    우선 rabbit 메시지 대기 열 을 보십시오.

    그림 에서 보 듯 이 웹 Socketmessage 로 시작 하 는 여러 개의 대기 열 이 존재 합 니 다.이것 은 모든 마이크로 서비스 노드 가 메시지 대기 열 을 만 든 다음 exchange 를 보십시오.

    exchange 바 인 딩 된 메시지 큐

    이 곳 의 exchange 이름과 위 메시지 큐 의 이름 접 두 사 는 모두 웹 Socketmessage 입 니 다.이것 은 앞의 binding 설정 에서 destination 이 지정 한 것 으로 destination 이름과 일치 합 니 다.
    입력 흐름 에 이 벤트 를 기록 할 때 destination 을 key(즉,webSocketmessage)로 사용 하여 웹 Socketmessage 라 는 exchange 에 메 시 지 를 기록 합 니 다.exchange 바 인 딩 된 메시지 큐 접 두 사 는 모두 웹 Socketmessage 이 고 routing key 는\#이기 때 문 입 니 다.따라서 exchange 는 모든 웹 Socketmessage 가 시작 하 는 메시지 대기 열 에 메 시 지 를 전달 합 니 다.
    앞에서 제기 한 문 제 를 살 펴 보 겠 습 니 다.이러한 설정 은 메 시 지 를 모든 마이크로 서비스 노드 로 보 낼 수 있 습 니 다.만약 에 하나의 메시지 가 한 노드 에 만 받 아들 여야 한다 면 어떻게 설정 해 야 합 니까?아주 간단 합 니 다.하나의 설정 항목 으로 해결 할 수 있 습 니 다.
    
    spring:
     cloud:
      stream:
       bindings:
        websocketMessageIn:
         group: test
         destination: websocketMessage
         binder: defaultRabbit
    앞의 설정 에 비해 하나의 group 설정 만 더 있 습 니 다.이렇게 설정 하면 rabbitmq 는 웹 socketMessage.test 라 는 메시지 큐 를 생 성 합 니 다.(앞에서 말 한 모든 마이크로 서비스 가 만 든 메시지 큐 는 자동 으로 삭 제 됩 니 다.즉,마이크로 서비스 가 연결 을 끊 으 면 메시지 큐 가 삭 제 됩 니 다.이 메시지 큐 는 지속 적 입 니 다.즉,모든 마이크로 서비스 노드 가 연결 을 끊 어도 삭제 되 지 않 습 니 다)모든 마이크로 서비스 노드 가 이 대기 열 을 감청 하고 대기 열 에 메시지 가 있 을 때 한 노드 에 만 소 비 됩 니 다.
    설명 할 내용 은 여기까지 입 니 다.spring cloud stream 의 설정 은 이것 뿐만 이 아 닙 니 다.그러나 이 설정 들 은 제 가 해 야 할 일 을 충분히 완성 하 였 습 니 다.다른 설정 은 spring cloud stream 공식 문 서 를 참고 하 십시오.
    http://cloud.spring.io/spring-cloud-static/spring-cloud-stream/Fishtown.RC2/single/spring-cloud-stream.html
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기