Springboot2.2中的RSocket体验

什么是RSocket?

RSocket是一种二进制协议,用于TCP、websocket和Aeron等字节流传输。它通过异步消息在单个连接上传递,支持以下对称交互模型:

  1. request/response (stream of 1)
  2. request/stream (finite stream of many)
  3. fire-and-forget (no response)
  4. channel (bi-directional streams)

一个发展过程

下面是一个简单的demo,包括两个模块producer和consumer供大家学习.

producer

核心pom.xml

       <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-rsocket</artifactId></dependency>

Repository

@Slf4j
@Component
public class MarketDataRepository {private static final int BOUND = 100;private Random random = new Random();public Flux<MarketData> getAll(String stock) {return Flux.fromStream(Stream.generate(() -> getMarketDataResponse(stock))).log().delayElements(Duration.ofSeconds(1));}public Mono<MarketData> getOne(String stock) {return Mono.just(getMarketDataResponse(stock));}public void add(MarketData marketData) {log.info("New market data: {}", marketData);}private MarketData getMarketDataResponse(String stock) {return new MarketData(stock, random.nextInt(BOUND));}
}

这个MarketDataRepository是一个简易模拟,当然你也可以使用R2DBC猛戳

controller

@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());}@MessageMapping("feedMarketData")public Flux<MarketData> feedMarketData(MarketDataRequest marketDataRequest) {return marketDataRepository.getAll(marketDataRequest.getStock());}@MessageMapping("collectMarketData")public Mono<Void> collectMarketData(MarketData marketData) {marketDataRepository.add(marketData);return Mono.empty();}@MessageExceptionHandlerpublic Mono<MarketData> handleException(Exception e) {return Mono.just(MarketData.fromException(e));}
}

这个Controller用来处理消费者的RSocket请求,
注意这里的@MessageMapping其实可以理解为就是@RequestMapping,其实就是提供路由.

application.properties

spring.rsocket.server.port=7000

配置,目前只有四个,可以参考这里

异常处理

@MessageExceptionHandler
public Mono<MarketData> handleException(Exception e) {return Mono.just(MarketData.fromException(e));
}

注意:不同的模式需要不同的异常处理,这里是针对请求/响应的异常处理,啦啦啦.

consumer

核心pom.xml

       <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-rsocket</artifactId></dependency>

配置Configuration

@Lazy
@Configuration
public class ConsumerConfiguration {@BeanRSocket rSocket() {return RSocketFactory.connect().dataMimeType(MimeTypeUtils.APPLICATION_JSON_VALUE).frameDecoder(PayloadDecoder.ZERO_COPY)//.transport(TcpClientTransport.create("47.96.70.206",7000)) 个人服务器已关闭.transport(TcpClientTransport.create("127.0.0.1",7000)).start().block();}@BeanRSocketRequester requester(RSocketStrategies rSocketStrategies) {//废弃版//RSocketRequester.create(this.rSocket(),MimeTypeUtils.APPLICATION_JSON, rSocketStrategies);return  RSocketRequester.wrap(this.rSocket(),MimeTypeUtils.APPLICATION_JSON, rSocketStrategies);}
}

这里,我们创建RSocket Client(消费者),并将其配置端口7000,使用TCP传输。注意,这是我们之前配置的服务器端口。
接下来,我们将定义一个RSocketRequester的实例,它是一个围绕RSocket的包装器。这个bean将帮助我们与RSocket服务器进行交互。
定义了这些bean配置之后,我们就有了一个基本的结构。

消费者Controller

@RestController
public class MarkDataRestController {private final RSocketRequester requester;public MarkDataRestController(RSocketRequester requester) {this.requester = requester;}/***功能描述 Request/Response模式,目前通用的请求/响应模式* @author KL* @date 2019/5/27* @param stock* @return org.reactivestreams.Publisher<com.github.consumer.entity.MarketData>*/@GetMapping("/current/{stock}")public Publisher<MarketData> current(@PathVariable String stock){return requester.route("currentMarketData").data(new MarketDataRequest(stock)).retrieveMono(MarketData.class);}/***功能描述 Request/Stream模式  ,一个简单的请求返回多个响应.* Request/Stream模式是一个更复杂的交互模型,其中客户机发送一个请求,但是在一段时间内从服务器获得多个响应。* @author KL* @date 2019/5/27* @param stock* @return org.reactivestreams.Publisher<com.github.consumer.entity.MarketData>*/@GetMapping(value = "/feed/{stock}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Publisher<MarketData> feed(@PathVariable("stock") String stock) {return requester.route("feedMarketData").data(new MarketDataRequest(stock)).retrieveFlux(MarketData.class);}/***功能描述 Fire And Forget模式,其实就是Client推送给Server端* @author KL* @date 2019/5/27* @param* @return org.reactivestreams.Publisher<java.lang.Void>*/@GetMapping(value = "/collect")public Publisher<Void> collect() {return requester.route("collectMarketData").data(getMarketData()).send();}private MarketData getMarketData() {return new MarketData("X", new Random().nextInt(10));}
}

总结

RSocket为我们提供了一种新的服务通信思路,我们可以将RSocket应用到微服务框架中去,尝试去替代Http的方案.
现在Springboot支持了,在过不久dubbo3.0也支持了,哈哈.学习吧.

Springboot2.2中的RSocket体验相关推荐

  1. 网站推广期间如何做好用户体验中的交互体验设计?

    在当前网站推广期间必然要充分获取用户使用体验以赢得用户好感,并吸引搜索引擎关注以此获取流量和排名等内容,让用户在该网站推广期间让自身需求的解决变得简单,并给予用户深刻印象,让用户网站访问期间获得良好的 ...

  2. 微软 python_微软推出 Pylance,改善 VS Code 中的 Python 体验

    微软宣布推出一种新的 Python 语言服务器,名为 Pylance,其可利用语言服务器协议与 VS Code 进行通信.Pylance 这个名字是对 Monty Python 的 Lancelot ...

  3. 微软推出 Pylance,改善 VS Code 中的 Python 体验

    源自:编程派 微软宣布推出一种新的 Python 语言服务器,名为 Pylance,其可利用语言服务器协议与 VS Code 进行通信.Pylance 这个名字是对 Monty Python 的 La ...

  4. 打印更无缝:微软改善Win11中通用打印体验

    微软昨日透露,将会在 Windows 11 系统中改进打印体验.从下面的截图中可以看到,用户可以直接在设置应用中添加打印机.对于使用通用打印机驱动的打印机,微软增加了为打印作业添加密码的功能. 打印更 ...

  5. 实时音视频直播带货中影响用户体验的Bug根因

    VOL 131 05 2020-06 今天距2021年209天 这是ITester软件测试小栈第131次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上  ...

  6. 一对一直播源码开发,如何改善音视频通话过程中的用户体验?

    在一对一直播源码开发中,由于是单个用户对话单个用户,所以对音视频通话质量的要求会比较高,那应该如何在开发时改善音视频通话中的用户体验呢? 一.选择播放模式 在一对一直播源码中视频通话过程中出现马赛克或 ...

  7. 在商业环境中的 UX 体验衡量指标

    本文适合(1)进入工作领域 1–3 年的 UX Designer/Product Designer(2)希望为自己的工作产出订定价值衡量的 Anybody 好的衡量指标带你上天堂,不好的衡量指标带你睡 ...

  8. java调用r实例,Spring Boot中使用RSocket的示例代码

    1. 概述 RSocket 应用层协议支持Reactive Streams 语义, 例如:用RSocket作为HTTP的一种替代方案.在本教程中, 我们将看到RSocket 用在spring boot ...

  9. Win10 新功能之 CMD中的SSH体验

    Win10 新功能之 CMD中的SSH体验录标题 在cmd中直接输入ssh即可获得SSH的使用信息 这里我通过ssh [ip] -l [username]进行连接 如图所示,接下来就是和平常的ssh工 ...

最新文章

  1. javascript优化_如何通过使用服务人员来优化JavaScript应用
  2. 非常有用的User case用例描述模板
  3. 发达国家与发展中国家编程语言技术的分布差异性
  4. H5前期知识点总结 9月12日
  5. Pytorch+Tensorboard混淆矩阵可视化
  6. 从源码分析RocketMQ系列-Producer的SendResult来自哪里?
  7. 【经验】win11上安装visio
  8. c语言做线性代数第六版答案,编程与线性代数
  9. JAVA理财管理系统(JAVA 毕业设计)
  10. 如何把标签输出为PDF文件
  11. Hihocoder 顺子
  12. 视图的作用是什么?有哪些好处?(面试题)
  13. Java8的 stream对list数据去重,使用filter()过滤列表,list转map,joining使用,统计分组合并
  14. 适用的验厂考勤工资AB账系统软件这样选择
  15. TIMESTAMP和DATETIME的区别(海信面试题)
  16. 决策树算法的 MATLAB 实践
  17. accessible: module java.base does not “opens java.lang“ to unnamed module
  18. 信号与系统 - 起始状态0- 与初始状态 0+
  19. 推荐十个精彩的Ubuntu鼠标主题
  20. OpenCV与Open3D等开源视觉库的详细笔记

热门文章

  1. 大数据的价值是如何得以彰显的?
  2. 为什么eolinker发送老是等待_eoLinker-AMS 开源版 常见问题
  3. RK3368项目首次编译
  4. M102: MongoDB for DBAs chapter 4 replication学习记录
  5. 机房收费软件需求说明书
  6. python输出古诗词_使用LSTM训练生成古诗模型,其中生成器可以指定生成风格进行输出...
  7. SQL Server | 设置默认值
  8. UVA1169 Robotruck
  9. error: VNDK library: liblog‘s ABI has EXTENDING CHANGES Please check compatiblity report at
  10. Kali Linux之ARP欺骗和DNS劫持