spring全家桶系列之spring boot 2.2-RSocket(五)

githubhttps://github.com/rsocket/rsocket-java 

注意

需要spring boot 2.2版本

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.M4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

 

需要了解下阻塞和非阻塞

  • 简单为:阻塞就是干不完不准回来,非阻塞就是你先干,我现看看有其他事没有,完了告诉我一声
  • 具体参考:链接

简介

  • 简短简介:RSocket是一种用于字节流传输的二进制协议。它通过在单个连接上传递的异步消息实现对称交互模型。 Spring Framework与Spring Messaging模块在服务器端和客户端都支持RSocket。在服务器端,它允许你创建特殊@Controllerbean来处理传入的RSocket消息。控制器中的方法通过使用@MessageMapping注释映射到RSocket路由。spring 官方提供整合的RSocket。
  • 长篇简介:是一种用于反应式应用程序的新的网络协议。RSocket是在华盛顿特区举行的SpringOne平台会议上宣布的,是一种新的第7层语言无关的应用网络协议。它是一种基于Reactive Streams背压的双向,多路复用,基于消息的二进制协议。它由Facebook,Netifi和Pivotal等工程师开发,提供Java,JavaScript,C ++和Kotlin等实现。
  • 该协议专门设计用于与Reactive风格应用配合使用,这些应用程序基本上是非阻塞的,并且通常(但不总是)与异步行为配对。使所谓Reactive背压: 即发布者无法向订户发送数据直到该订户已经准备就绪的想法,这是与“异步”的关键区别。
  • 反应式编程(响应式reactive)是Java中高效应用的下一个前沿。但有两个主要障碍 - 数据访问和网络。RSocket旨在解决后一个问题,而R2DBC旨在解决前者问题。
  • 在微服务式应用程序中,HTTP是被广泛用作通信协议。,但HTTP针对的是一个与移动世界截然不同的世界而设计的。
  • 我们有iPhone和Android手机,我们收听通知,所以我们不一定要求一些请求立即得到回复,我们在运动时使用智能手表,它与后端服务器交互,为我们提供统计数据; 我们让Smart助手与后端服务器进行交互。所有这些互动模型都是我们称之为互联体验的一部分。HTTP并不是真的为此设计的。
  • HTTP的一个重要问题是,它强迫客户端负担起所有责任来处理不同类型的错误上,包括重试逻辑,超时,断路器等。使用Reactive架构构建的应用程序可以提高效率并扩展。
  • RSocket与HTTP的不同之处在于它定义了四种交互模型:
  • Fire-and-Forget:优化请求/响应,在不需要响应时非常有用,例如非关键事件日志记录。
  • 请求/响应:当您发送一个请求并收到一个响应时,就像HTTP一样。即使在这里,该协议也具有优于HTTP的优点,因为它是异步和多路复用的。
  • 请求/流:类似于返回集合的请求/响应,集合被回送而不是查询直到完成,因此例如发送银行帐号,用实时的帐户事务流进行响应

以下代码显示了一个典型的@Controller

@Controller
public class MyRSocketController {

    @MessageMapping("chat.room.{name}")
    public Flux<ChatMessages> enterChatRoom(@DestinationVariable String chatRoom,
            Flux<ChatMessages> messages) {
        // ...
    }

    @MessageMapping("users.{user}.info")
    Mono<ChatUserInfo> getUserInfo(@DestinationVariable String user) {
        // ...
    }

}

RSocket Strategies自动配置

  • Spring Boot自动配置一个RSocketStrategiesbean,它提供编码和解码RSocket有效负载所需的所有基础结构。默认情况下,自动配置将尝试配置以下(按顺序):
  1. 与Jackson的CBOR编解码器

  2. 与Jackson的JSON编解码器

          该spring-boot-starter-rsocket入门同时提供相关性。

          开发人员可以RSocketStrategies通过创建实现该RSocketStrategiesCustomizer接口的bean来自定义组件。

           请注意,它们 @Order很重要,因为它决定了编解码器的顺序

RSocket服务器自动配置

  • Spring Boot为RSocket服务器提供自动配置。所需的依赖项由spring-boot-starter-rsocket。提供。
  • Spring Boot将启动RSocket服务器作为应用程序中的新嵌入式服务器,或者将RSocket基础结构插入现有的反应式Web服务器。这取决于应用程序的类型及其配置。
  • 对于WebFlux应用程序(即类型WebApplicationType.REACTIVE),仅当以下属性匹配时,RSocket服务器才会插入现有Web服务器:

 

spring.rsocket.server.mapping-path=/rsocket # a mapping path is defined
spring.rsocket.server.transport=websocket # websocket is chosen as a transport
#spring.rsocket.server.port= # no port is defined
  • 创建RSocket服务器的唯一方法是启动一个独立的嵌入式RSocket服务器。除了依赖性要求之外,唯一需要的配置是为该服务器定义一个端口:
spring.rsocket.server.port=9898 # the only required configuration
spring.rsocket.server.transport=tcp # you're free to configure other properties

Spring Messaging RSocket支持

  • Spring Boot将为RSocket自动配置Spring Messaging基础架构。
  • 一个RSocketStrategies豆被创建为消息方法RSocket提供编码和解码的支持。默认情况下,Spring Boot将尝试使用Jackson for application/json"application/*+json"media类型自动配置JSON支持。

使用,调用RSocket服务RSocketRequester

一旦RSocket在服务器和客户端之间建立了通道,任何一方都可以向另一方发送或接收请求。

作为服务器,你可以RSocketRequester在RSocket的任何处理程序方法上注入实例@Controller。作为客户端,你需要先配置并建立RSocket连接。Spring Boot RSocketRequester.Builder使用预期的编解码器自动配置这种情况。

RSocketRequester.Builder实例是一个原型bean,这意味着每个注入点将为你提供一个新实例 - 这是有目的的,因为此构建器是有状态的,你不应该使用相同的实例创建具有不同设置的请求者。

@Service
public class MyService {

    private final RSocketRequester rsocketRequester;

    public MyService(RSocketRequester.Builder rsocketRequesterBuilder) {
        this.rsocketRequester = rsocketRequesterBuilder
            .connectTcp("example.org", 9090).block();
    }

    public Mono<User> someRSocketCall(String name) {
        return this.requester.route("user").data(payload)
                            .retrieveMono(User.class);
    }

}

与spring boot 整合

  • maven

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>
  • application配置文件
  • TCP协议使用   mapping-path仅适用于transport:websocket
spring:
  rsocket:
    server:
      port: 9898
      transport: tcp
     
  • websocket使用
rsocket:
    server:
      port: 9898
      transport: websocket
      mapping-path: /rsocket

RSocket暂更

 

下一篇:spring security

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值