봄 부팅 RSocket 사용
1. 개요
RSocket
지원 응용 프로그램 계층 프로토콜의 Reactive Streams
의미, 예를 들어, 다음 HTTP에 대한 대안으로 RSocket. 이 튜토리얼에서, 우리는 볼 것이다 RSocket
스프링 부팅 낮은 수준의 추상적 인 RSocket API를 돕기 위해, 특히 방법, 봄 부팅에 사용.
2. 의존
이제 추가 할 수 spring-boot-starter-rsocket
에 의존 온 :
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-rsocket</artifactId> </dependency>
걸릴 것이 풀은 이적 따라 RSocket
다음과 같은 관련 종속 : rsocket-core
및 rsocket-transport-netty
응용 프로그램의 3 예
이제 우리의 간단한 응용 프로그램을 계속합니다. 강조하기 위해 RSocket
대화 형 모드를 제공, 나는, 무역 응용 프로그램을 만드는 클라이언트와 서버를 포함하는 트랜잭션 응용 프로그램을 계획입니다.
3.1. 서버 설정
첫째, 우리는 springboot 애플리케이션에 의해 부팅 설정 RSocket server
서버를. 때문에의 spring-boot-starter-rsocket dependency
의존성 때문에 자동으로 구성 springboot RSocket server
. 평소와 같이, 당신은 수정 속성 중심의 방법을 사용할 수있는 RSocket server
기본 구성 값을. 예를 들어 구조를 증가시킴으로써 application.properties
, 변성 RSocket
포트
spring.rsocket.server.port=7000
필요에 따라 추가 서버의 다른 속성을 수정할 수 있습니다
3.2. 클라이언트 설정
다음으로, 우리는 클라이언트뿐만 아니라 springboot 응용 프로그램을 설정합니다. springboot가 자동으로 가장 RSocket 관련 구성 요소를 구성 할뿐만 아니라 설치를 완료하기 위해 일부 개체를 사용자 정의 있지만.
@Configuration
public class ClientConfiguration {
@Bean
public RSocket rSocket() {
return RSocketFactory
.connect()
.mimeType(MimeTypeUtils.APPLICATION_JSON_VALUE, MimeTypeUtils.APPLICATION_JSON_VALUE)
.frameDecoder(PayloadDecoder.ZERO_COPY)
.transport(TcpClientTransport.create(7000))
.start()
.block();
}
@Bean
RSocketRequester rSocketRequester(RSocketStrategies rSocketStrategies) {
return RSocketRequester.wrap(rSocket(), MimeTypeUtils.APPLICATION_JSON, rSocketStrategies);
}
}
여기에 우리가 만드는 RSocket
클라이언트와 구성 TCP 포트 : 7000. 참고 : 우리가 이미 구성되어있는 서비스 포트를. 다음으로 우리는 RSocket의 장식 객체를 정의 RSocketRequester
. 개체는 우리가 좋아하는 RSocket server
우리에게 도움이 될 것입니다 상호 작용할 때. 이러한 개체가 구성되어 정의 후, 우리는 단지 골격을 가지고있다. 다음, 우리는 다른 상호 작용 모드에 노출이 곳에서 도움을 springboot 표시됩니다.
4. springboot RSocket
중 적 Request/Response
우리는에서 Request/Response
시작, HTTP
또한 대화 형 모드에 가장 유사한, 가장 일반적인 의사 소통의 수단을 사용합니다. 이 대화 형 모드에서 클라이언트에서 통신의 초기화와는 요청을 보냅니다. 그 후, 서버는 동작을 수행하고, 클라이언트에 응답을 회신 - 통신이 완료 될 때. 클라이언트가 특정 주식의 현재 시장 데이터를 요청 우리의 거래 응용 프로그램에서. 응답, 서버는 요청 된 데이터를 전송합니다.
4.1 서버
서버 측에서, 우리는 먼저를 생성한다 controller
우리의 가공 방법을 잡아. 우리가 사용하는 @MessageMapping
대신 같은 SpringMVC의 주석 @RequestMapping
또는 @GetMapping
주석
@Controller
public class MarketDataRSocketController {
private final MarketDataRepository marketDataRepository;
public MarketDataRSocketController(MarketDataRepository marketDataRepository) {
this.marketDataRepository = marketDataRepository;
}
@MessageMapping("currentMarketData")
public Mono<MarketData> currentMarketData(MarketDataRequest marketDataRequest) {
return marketDataRepository.getOne(marketDataRequest.getStock());
}
}
우리의 통제하에 공부합니다. 우리는 사용 @Controller
RSocket를 입력 요청을 처리하는 컨트롤러를 정의하는 주석을. 또한, 주석 @MessageMapping
우리가 경로를 정의 할 수 있습니다 그리고 우리는 요청에 응답하는 방법에 관심이 있습니다. 이 예에서, 서버는 라우터을 수신 currentMarketData
하고, 응답하여 한 결과 Mono<MarketData>
클라이언트.
4.2 클라이언트
다음으로, 우리의 RSocket 클라이언트는 주식의 가격을 물어 하나의 응답을 받아야합니다. 요청을 초기화하기 위해, 우리는 사용하는 RSocketRequester
다음과 같이 클래스를 :
@RestController
public class MarketDataRestController {
private final RSocketRequester rSocketRequester;
public MarketDataRestController(RSocketRequester rSocketRequester) {
this.rSocketRequester = rSocketRequester;
}
@GetMapping(value = "/current/{stock}")
public Publisher<MarketData> current(@PathVariable("stock") String stock) {
return rSocketRequester
.route("currentMarketData")
.data(new MarketDataRequest(stock))
.retrieveMono(MarketData.class);
}
}
주 : 예에서, RSocket
클라이언트도있다 REST
스타일 controller
, 우리에 액세스하는 방법 RSocket
서버를. 따라서, 우리는 사용 @RestController
하고 @GetMapping
우리의 요청 / 응답 엔드 포인트를 정의하는 주석. 엔드 포인트 방법에서, 우리는 클래스를 사용 RSocketRequester
하여 경로를 지정합니다. 사실, 이것은 서버 측이고 RSocket
우리는 요청 데이터를 전달하여 원하는 경로. 당신이 호출 할 때 마지막으로, retrieveMono()
방법에, springboot은 우리가 요청 / 응답 상호 작용을 시작하는 데 도움이됩니다.
5. 패턴Spring Boot RSocket
Fire And Forget
다음으로 우리는 볼 것이다 Fire And Forget
대화 형 모드. 이름이 힌트로, 같은 클라이언트는 서버에 요청을 보내지 만 서버가 다시 응답을 반환 기대하지 않습니다. 우리의 무역 프로그램에서 일부 클라이언트는 데이터 자원이 될 것입니다 및 서버 시장 데이터를 밀어 넣습니다.
5.1 서버
다음의가, 우리의 서버 응용 프로그램에서 다른 엔드 포인트를 만들어 보자 :
@MessageMapping("collectMarketData")
public Mono<Void> collectMarketData(MarketData marketData) { marketDataRepository.add(marketData); return Mono.empty(); }
다시 말하지만, 우리는 새로운 정의 @MessageMapping
의 노선을 collectMarketData
. 또한, 봄 부팅이 자동으로 들어오는 부하에게 변환 MarketData
인스턴스를. 그러나, 여기에 가장 큰 차이점은 우리가로 복귀한다는 것입니다 Mono<Void>
클라이언트가 서버에 반환 할 필요가 없기 때문에.
5.2 클라이언트
우리는 우리의 초기화 방법을 보려면 fire-and-forget
요청 모드를. 다음과 같이 우리는 다른 스타일 REST 엔드 포인트를 작성합니다 :
@GetMapping(value = "/collect")
public Publisher<Void> collect() {
return rSocketRequester
.route("collectMarketData") .data(getMarketData()) .send(); }
여기에서 우리는 경로를 지정하고있을 것이다로드 MarketData
예. 우리는 사용하기 때문에 send()
대신 방법을 retrieveMono()
하는에 모든 상호 작용 패턴 fire-and-forget
패턴.
6. Spring Boot RSocket
중 적Request Stream
요청 스트림은 시간 경과에 응답하여 상기 복수의 서버로부터 취득하여, 클라이언트가이 모드로의 요청을 전송하고, 더 복잡한 상호 작용하는 모드이다. 이 상호 작용 모델을 시뮬레이션하기 위해 클라이언트는 주어진 주식 시장의 모든 데이터를 요청합니다.
6.1 서버
우리는 서버에서 시작했다. 다음과 같이 우리는 다른 메시지 매핑 방법을 추가합니다 :
@MessageMapping("feedMarketData")
public Flux<MarketData> feedMarketData(MarketDataRequest marketDataRequest) {
return marketDataRepository.getAll(marketDataRequest.getStock());
}
당신이 볼 수 있듯이, 다른 프로세서 프로세서 방법이 방법은 매우 유사합니다. A와 우리의 반환의 다른 부분 Flux<MarketData>
의 장소 Mono<MarketData>
. 마지막으로, 우리의 RSocket 서버는 클라이언트에 복수 응답을 반환합니다.
6.2 클라이언트
다음으로 클라이언트 측에서, 우리는, 엔드 포인트 초기화 요청 / 응답 통신을 만들 :
@GetMapping(value = "/feed/{stock}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Publisher<MarketData> feed(@PathVariable("stock") String stock) {
return rSocketRequester
.route("feedMarketData")
.data(new MarketDataRequest(stock))
.retrieveFlux(MarketData.class);
}
우리는 RSocket 요청에서 공부했다. 먼저 우리는 라우팅 요청과 부하를 정의합니다. 그런 다음, 우리는의 사용을 정의 retrieveFlux()
응답 원하는 전화. 이 섹션에서는 대화 형 모드를 결정합니다. 또한주의 : 우리의 고객이기 때문에 REST
서버의 스타일, 클라이언트는 또한 미디어 유형의 응답을 정의합니다 MediaType.TEXT_EVENT_STREAM_VALUE
.
7. 취급 예외
이제 우리는 서버 프로그램의 예외를 처리하는 방법을 선언 방법을 살펴 보자. 하면 처리 요구 / 응답, I 단순 사용 @MessageExceptionHandler
은 다음과 같이 주석 :
@MessageExceptionHandler
public Mono<MarketData> handleException(Exception e) {
return Mono.just(MarketData.fromException(e));
}
여기에서 우리는 예외 처리로 표시 사항을 제공합니다 @MessageExceptionHandler
. 로 그 결과,이 방법은, 예외의 모든 유형을 처리 할 Exception
이상이 슈퍼 클래스의 모든 다른 유형이다. 우리는 명시 적 이상의 서로 다른 종류의 서로 다른 예외 처리를 만들 수 있습니다. 물론 이것은 요청 / 응답 모드이며, 우리는 반환 Mono<MarketData>
. 우리는 우리의 대화 형 모드 일치의 반환 형식으로 이러한 형태의 응답을 기대합니다.
8. 결론
이 튜토리얼에서, 우리는 RSocket 지원 springboot 제공된 다른 대화 형 모드 RSocket의 자세한 목록을 발표했다. 모든 샘플 코드를 참조 GitHub의 에 있습니다.
원본 링크 : www.baeldung.com/spring-boot ...
저자 : baeldung
번역 : 슬리브