5.RSocket
RSocket是一个使用在字节流传输(TCP/Websocket)之上的二进制点对点通讯协议;它主要用在分布式应用上,用来替换如HTTP这种通讯协议。
RSocket提供四种交互模型:
- request/response:请求返回一条流数据(
Mono<T>
); - request/stream:请求返回多条流数据(
Flux<T>
); - fire-and-forget:请求不返回数据(
Mono<Void>
); - channel:双向流数据通讯(
Flux<R> method(Publisher<T> input
))。
5.1 新建应用
5.1.1 Server
新建应用,信息如下:
Group:top.wisely
Artifact:rsocket-server
Dependencies:RSocket
、Spring Data Reactive MongoDB
、Lombok
build.gradle
文件中的依赖如下:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-rsocket'
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//...
}
}
5.1.2 Client
新建应用,信息如下:
Group:top.wisely
Artifact:rsocket-client
Dependencies:RSocket
、Spring Reactive Web
、Lombok
build.gradle
文件中的依赖如下:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-rsocket'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//...
}
}
5.2 Spring Boot的自动配置
服务端的配置有:
RSocketServerAutoConfiguration
:通过RSocketProperties
使用spring.rsocket.server.*
配置RSocket Server;RSocketStrategiesAutoConfiguration
:使用CBOR和Jackson配置数据交互的编码和解码;RSocketMessagingAutoConfiguration
:在Spring Messaging中配置Spring RSocket的支持;
客户端配置:
RSocketRequesterAutoConfiguration
:配置一个RSocketRequester.Builder
的Bean用来定义RSocketRequester
。
5.3 示例
5.3.1 Server
-
配置RSocket Server和连接MongoDB
spring: rsocket: server: address: localhost port: 9898 transport: tcp #使用tcp协议监听localhost的9898端口 data: mongodb: host: localhost port: 27017 username: wisely password: zzzzzz database: first_db
-
领域模型和Repository
@Data @AllArgsConstructor @NoArgsConstructor @Document(collection = "people") public class Person { @Id private String id; private String name; private Integer age; public Person(String name, Integer age) { this.name = name; this.age = age; } }
public interface PersonRepository extends ReactiveMongoRepository<Person, String> { }
-
RSocket Server
RSocket是Spring Messaging集成的,同样也使用
@MessageMapping
定义消息的终点。@Controller public class PersonController { PersonRepository personRepository; public PersonController(PersonRepository personRepository) { this.personRepository = personRepository; } @MessageMapping("people.findById") Mono<Person> getOne(Person person)