봄 부팅 RSocket 사용

봄 부팅 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());
    }
}

우리의 통제하에 공부합니다. 우리는 사용 @ControllerRSocket를 입력 요청을 처리하는 컨트롤러를 정의하는 주석을. 또한, 주석 @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 RSocketFire 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

번역 : 슬리브

 

추천

출처www.cnblogs.com/liululee/p/10978601.html