springboot controller里出现异常会导致服务器宕机_教你如何在Spring Boot中使用RSocket...

news/2024/7/3 1:16:24

1. 概述

RSocket应用层协议支持 Reactive Streams语义, 例如:用RSocket作为HTTP的一种替代方案。在本教程中, 我们将看到RSocket用在spring boot中,特别是spring boot 如何帮助抽象出更低级别的RSocket API。

2. 依赖

让我们从添加spring-boot-starter-rsocket依赖开始:

4b8fadc08df10963ecdaf78d438d2c8d.png

这个依赖会传递性的拉取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端口

80da3a328afa301a841ce1ade8f55a49.png

也可以根据需要进一步修改服务器的其他属性

3.2.设置客户端

接下来,我们来设置客户端,也是一个springboot应用程序。虽然springboot自动配置大部分RSocket相关的组件,但还要自定义一些对象来完成设置。

1adf6e3c217d74b3108b0290b6376e42.png

这儿我们正在创建RSocket客户端并且配置TCP端口为:7000。注意: 该服务端口我们在前面已经配置过。 接下来我们定义了一个RSocket的装饰器对象RSocketRequester。 这个对象在我们跟RSocket server交互时会为我们提供帮助。 定义这些对象配置后,我们还只是有了一个骨架。在接下来,我们将暴露不同的交互模式, 并看看springboot在这个地方提供帮助的。

4. springboot RSocket 中的 Request/Response

我们从Request/Response开始,HTTP也使用这种通信方式,这也是最常见的、最相似的交互模式。 在这种交互模式里, 由客户端初始化通信并发送一个请求。之后,服务器端执行操作并返回一个响应给客户端--这时通信完成。 在我们的交易应用程序里, 一个客户端询问一个给定的股票的当前的市场数据。 作为回复,服务器会传递请求的数据。

4.1.服务器

在服务器这边,我们首先应该创建一个controller 来持有我们的处理器方法。 我们会使用 @MessageMapping注解来代替像SpringMVC中的@RequestMapping或者@GetMapping注解

16e5248f73aeeb7f7834c2ae3495cac8.png

来研究下我们的控制器。 我们将使用@Controller注解来定义一个控制器来处理进入RSocket的请求。 另外,注解@MessageMapping让我们定义我们感兴趣的路由和如何响应一个请求。 在这个示例中, 服务器监听路由currentMarketData, 并响应一个单一的结果Mono给客户端。

4.2. 客户端

接下来, 我们的RSocket客户端应该询问一只股票的价格并得到一个单一的响应。 为了初始化请求, 我们该使用RSocketRequester类,如下:

54899ccc1460be6ae2c601d5101be0cb.png

注意:在示例中,RSocket客户端也是一个REST风格的controller,以此来访问我们的RSocket服务器。因此,我们使用@RestController和@GetMapping注解来定义我们的请求/响应端点。 在端点方法中, 我们使用的是类RSocketRequester并指定了路由。 事实上,这个是服务器端RSocket所期望的路由,然后我们传递请求数据。最后,当调用retrieveMono()方法时,springboot会帮我们初始化一个请求/响应交互。

5. Spring Boot RSocket中的Fire And Forget模式

接下来我们将查看 Fire And Forget交互模式。正如名字提示的一样,客户端发送一个请求给服务器,但是不期望服务器的返回响应回来。 在我们的交易程序中, 一些客户端会作为数据资源服务,并且推送市场数据给服务器端。

5.1.服务器端

我们来创建另外一个端点在我们的服务器应用程序中,如下:

80dc6e38ec8b7946ed09ecf278257237.png

我们又一次定义了一个新的@MessageMapping路由为collectMarketData。此外, Spring Boot自动转换传入的负载为一个MarketData实例。 但是,这儿最大的不同是我们返回一个Mono,因为客户端不需要服务器的返回。

5.2. 客户端

来看看我们如何初始化我们的fire-and-forget模式的请求。 我们将创建另外一个REST风格的端点,如下:

1e79fd841d48a040e1374713aad70ee2.png

这儿我们指定路由和负载将是一个MarketData实例。 由于我们使用send()方法来代替retrieveMono(),所有交互模式变成了fire-and-forget模式。

6.Spring Boot RSocket中的Request Stream

请求流是一种更复杂的交互模式, 这个模式中客户端发送一个请求,但是在一段时间内从服务器端获取到多个响应。 为了模拟这种交互模式, 客户端会询问给定股票的所有市场数据。

6.1.服务器端

我们从服务器端开始。 我们将添加另外一个消息映射方法,如下:

40771269415c887701cd11283f09c113.png

正如所见, 这个处理器方法跟其他的处理器方法非常类似。 不同的部分是我们返回一个Flux来代替Mono。 最后我们的RSocket服务器会返回多个响应给客户端。

6.2.客户端

在客户端这边, 我们该创建一个端点来初始化请求/响应通信,如下:

97c11077343691eecfc3263f190461c3.png

我们来研究下RSocket请求。 首先我们定义了路由和请求负载。 然后,我们定义了使用retrieveFlux()调用的响应期望。这部分决定了交互模式。 另外注意:由于我们的客户端也是REST风格的服务器,客户端也定义了响应媒介类型MediaType.TEXT_EVENT_STREAM_VALUE。

7.异常的处理

现在让我们看看在服务器程序中,如何以声明式的方式处理异常。 当处理请求/响应式, 我可以简单的使用@MessageExceptionHandler注解,如下:

114d38bb524b3742fbe66f805af7d264.png

这里我们给异常处理方法标记注解为@MessageExceptionHandler。作为结果, 这个方法将处理所有类型的异常, 因为Exception是所有其他类型的异常的超类。 我们也可以明确地创建更多的不同类型的,不同的异常处理方法。 这当然是请求/响应模式,并且我们返回的是Mono。我们期望这里的响应类型跟我们的交互模式的返回类型相匹配。


http://www.niftyadmin.cn/n/3661299.html

相关文章

带网格的_最美网格员丨船只撞坏防洪墙就跑,有他在,妥妥的解决问题!

你好,我们是:网格员!网格是基层社会治理最小的单元,是社会治理精细化、精准化的重要载体。有一群人,上管天,下管地,中间管空气,他们每天奔波在大街小巷、田间地头,不惧重…

[啃书]身体使用手册 --《You:The owner's manual》

2006年12月16日 21:48:00 去济南会老铁,顺便去泉城路书店逛逛,给豆豆也给自己相本书。挑来挑去,选了本据说是欧美第一健康书,钟南山院士作序的,中文翻译成《You:身体使用手册》。在回泰安的路上,迫不及待的…

[瞭望]RoR 在国内难以建立大型应用

2006年12月14日 20:49:00 这段时间,在使用RoR框架来实现PPA项目。通过这段时间的使用,对RoR有了比较深入的了解,为它的那种卓而不群所折服,所钦佩。但是,也正是因为它的特立独行,我才深深的为它的将来惋惜。…

byte数组转blob类型_Java基础知识之标识符、数据类型和类型转换

1.标识符标识符:变量名,方法名,类名命名规则:由字母,数字,下划线,美元符$ 组成 不能以数字开头 驼峰式命名:myDemo 自明性:应该具有特定的意义 严格区分大小写&#xff1…

[个人]回归

2006年12月12日 17:51:00 我回来了。虽然,经年尘土满征衣。事情在朝好的方向发展,事情或许也有些糟糕,看从哪个角度用哪种心态去看。不过还好,我和我的小组挺过来了,而且有信心坚持下去。整个一个月,blog都…

stream流倒序排序_java排序之中文排序

一前言前天公司有个同事有一个这样的一个需求,就是按照中文排序。看似很普通的需求,但是要实现的话,还是有一点点的困难,因为网上的例子不多,都是那种清一色的copy,答案都一样,只能应用于英文的…

使用动态链表实现字符的频度统计_Redis系列专题5-- Redis支持的数据结构及底层实现详解...

Redis除了常用的数据结构String,Hash,List,Set,Zset(sorted set),bit(位图)外,还有 HyperLogLog(2.8.9版本增加),以及Stream(5.0版本新增),下面针对他们的特性一一讲解。String(字符串)String是一组字节。在Redis数据库中&#xf…

领域]在实践中展望。。。(写给DDD注释版)

2006年11月09日 15:44:00 在实践中展望。。。曾经跟朋友戏点读者眼中的图书类型:外文原版和影印版,不是嫌价格太高,就是说外文影响阅读理解;翻译的中文版往往惹来骂声一片;原创的要么说内容浮浅,要么说故事…