Springboot2.2中的RSocket体验
Springboot2.2中的RSocket体验
什么是RSocket?
RSocket是一种二进制协议,用于TCP、websocket和Aeron等字节流传输。它通过异步消息在单个连接上传递,支持以下对称交互模型:
- request/response (stream of 1)
- request/stream (finite stream of many)
- fire-and-forget (no response)
- 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体验相关推荐
- 网站推广期间如何做好用户体验中的交互体验设计?
在当前网站推广期间必然要充分获取用户使用体验以赢得用户好感,并吸引搜索引擎关注以此获取流量和排名等内容,让用户在该网站推广期间让自身需求的解决变得简单,并给予用户深刻印象,让用户网站访问期间获得良好的 ...
- 微软 python_微软推出 Pylance,改善 VS Code 中的 Python 体验
微软宣布推出一种新的 Python 语言服务器,名为 Pylance,其可利用语言服务器协议与 VS Code 进行通信.Pylance 这个名字是对 Monty Python 的 Lancelot ...
- 微软推出 Pylance,改善 VS Code 中的 Python 体验
源自:编程派 微软宣布推出一种新的 Python 语言服务器,名为 Pylance,其可利用语言服务器协议与 VS Code 进行通信.Pylance 这个名字是对 Monty Python 的 La ...
- 打印更无缝:微软改善Win11中通用打印体验
微软昨日透露,将会在 Windows 11 系统中改进打印体验.从下面的截图中可以看到,用户可以直接在设置应用中添加打印机.对于使用通用打印机驱动的打印机,微软增加了为打印作业添加密码的功能. 打印更 ...
- 实时音视频直播带货中影响用户体验的Bug根因
VOL 131 05 2020-06 今天距2021年209天 这是ITester软件测试小栈第131次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上 ...
- 一对一直播源码开发,如何改善音视频通话过程中的用户体验?
在一对一直播源码开发中,由于是单个用户对话单个用户,所以对音视频通话质量的要求会比较高,那应该如何在开发时改善音视频通话中的用户体验呢? 一.选择播放模式 在一对一直播源码中视频通话过程中出现马赛克或 ...
- 在商业环境中的 UX 体验衡量指标
本文适合(1)进入工作领域 1–3 年的 UX Designer/Product Designer(2)希望为自己的工作产出订定价值衡量的 Anybody 好的衡量指标带你上天堂,不好的衡量指标带你睡 ...
- java调用r实例,Spring Boot中使用RSocket的示例代码
1. 概述 RSocket 应用层协议支持Reactive Streams 语义, 例如:用RSocket作为HTTP的一种替代方案.在本教程中, 我们将看到RSocket 用在spring boot ...
- Win10 新功能之 CMD中的SSH体验
Win10 新功能之 CMD中的SSH体验录标题 在cmd中直接输入ssh即可获得SSH的使用信息 这里我通过ssh [ip] -l [username]进行连接 如图所示,接下来就是和平常的ssh工 ...
最新文章
- javascript优化_如何通过使用服务人员来优化JavaScript应用
- 非常有用的User case用例描述模板
- 发达国家与发展中国家编程语言技术的分布差异性
- H5前期知识点总结 9月12日
- Pytorch+Tensorboard混淆矩阵可视化
- 从源码分析RocketMQ系列-Producer的SendResult来自哪里?
- 【经验】win11上安装visio
- c语言做线性代数第六版答案,编程与线性代数
- JAVA理财管理系统(JAVA 毕业设计)
- 如何把标签输出为PDF文件
- Hihocoder 顺子
- 视图的作用是什么?有哪些好处?(面试题)
- Java8的 stream对list数据去重,使用filter()过滤列表,list转map,joining使用,统计分组合并
- 适用的验厂考勤工资AB账系统软件这样选择
- TIMESTAMP和DATETIME的区别(海信面试题)
- 决策树算法的 MATLAB 实践
- accessible: module java.base does not “opens java.lang“ to unnamed module
- 信号与系统 - 起始状态0- 与初始状态 0+
- 推荐十个精彩的Ubuntu鼠标主题
- OpenCV与Open3D等开源视觉库的详细笔记
热门文章
- 大数据的价值是如何得以彰显的?
- 为什么eolinker发送老是等待_eoLinker-AMS 开源版 常见问题
- RK3368项目首次编译
- M102: MongoDB for DBAs chapter 4 replication学习记录
- 机房收费软件需求说明书
- python输出古诗词_使用LSTM训练生成古诗模型,其中生成器可以指定生成风格进行输出...
- SQL Server | 设置默认值
- UVA1169 Robotruck
- error: VNDK library: liblog‘s ABI has EXTENDING CHANGES Please check compatiblity report at
- Kali Linux之ARP欺骗和DNS劫持