Spring Cloud 마이크로 서비스 구조 에서 의 WebSocket 솔 루 션 을 상세 하 게 설명 합 니 다.
먼저 이 글 은 웹 소켓 의 설정 을 설명 하지 않 고 마이크로 서비스 구조 클 러 스 터 모델 에서 해결 방안 을 선택 하 는 것 을 말한다.
마이크로 서비스 구 조 는 모두 가 낯 설 지 않 을 것 이다.마이크로 서비스 구조 에서 서 비 스 는 분포 식 이 고 업무 의 가용성 을 확보 하기 위해 모든 서 비 스 는 군집 의 형식 으로 존재 한다.클 러 스 터 모드 에서 클 러 스 터 의 모든 노드 의 방문 이 같은 결 과 를 얻 으 려 면 캐 시,session 등 데이터 일치 성 을 가 져 야 합 니 다.
마이크로 서비스 클 러 스 터 캐 시 는 보통 분포 식 캐 시 redis 를 사용 하여 해결 되 며,session 일치 성도 redis 를 통 해 해결 되 지만,현재 더욱 유행 하 는 것 은 무 상태의 Http,즉 무 session 화 이 며,가장 흔 한 해결 방안 은 OAuth 입 니 다.
웹 소켓 은 다 릅 니 다.서버 와 긴 연결 을 만 드 는 것 입 니 다.클 러 스 터 모드 에서 전단 과 서비스 클 러 스 터 의 모든 노드 를 연결 할 수 없습니다.http session 의 공 유 를 해결 하 는 것 처럼 redis 를 통 해 웹 소켓 의 session 공 유 를 실현 하 는 것 이 가능 한 사고 입 니 다.그러나 웹 소켓 session 의 수량 은 http session 보다 훨씬 많 습 니 다.
또 다른 사고방식 은 웹 소켓 은 어쨌든 집단의 특정한 노드 와 연결 을 맺 는 다 는 것 이다.그러면 연결 이 있 는 노드 를 찾 으 면 서버 에 메 시 지 를 전송 할 수 있다.그러면 해결 해 야 할 문 제 는 웹 소켓 연결 이 있 는 노드 를 어떻게 찾 느 냐 하 는 것 이다.어느 노드 에 연결 되 어 있 는 지 찾 으 려 면 연결 을 찾 는 유일한 식별 자가 필요 합 니 다.그러나 stomp 기반 의 게시-구독 모드 에서 한 메시지 의 푸 시 는 여러 개의 연결 을 대상 으로 할 수 있 고 클 러 스 터 의 모든 노드 에 분포 할 수 있 습 니 다.이렇게 연결 을 찾 는 대가 도 높 습 니 다.기왕 이렇게 된 이상 우 리 는 사고방식 을 바 꾸 어도 무방 하 다.모든 웹 소켓 메 시 지 는 집단의 모든 노드 에서 푸 시 를 하고 이 메시지 의 연결 을 구독 했다.하나 든 만 개 든 최종 적 으로 이 소식 을 받 을 수 있 을 것 이다.이 사고방식 을 바탕 으로 우 리 는 몇 가지 기술 선택 을 했다.
도입 의존
<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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.