春天顶部

通过参考资料,开始使用Spring 5和Spring Boot 2学习春天课程:

> >学习春天

1.概述

在这个快速的文章中,我们将介绍一下反应堆总线通过为反应性,事件驱动的应用程序设置真实方案。

2.反应堆工程基础

2.1。为什么反应堆?

现代应用程序需要处理大量的并发请求并处理大量数据。标准,阻塞代码不再足以满足这些要求。

反应设计图案是一个用于异步处理大量并发服务请求的基于事件的体系结构方法来自单个或多个服务处理程序。

项目反应堆是基于这种模式,并具有明确雄心勃勃的建筑物,在JVM上建造无阻塞的反应应用

2.2。示例场景

在我们开始之前,这里有一些有趣的场景,在这些场景中利用响应式架构风格是有意义的,只是为了了解我们可以在哪里应用它:

  • 像亚马逊这样大型在线购物平台的通知服务
  • 为银行业提供庞大的交易处理服务
  • 股票价格同时更改股票交易业务

3. Maven依赖项

让我们开始通过添加以下依赖来开始使用Project Reactor总线pom.xml:

<依赖项>  io.projectreaceRor   RECTOR-BUS   2.0.8.Release  

我们可以查看最新版本反应堆总线Maven Central.

4.构建演示应用程序

为了更好地了解基于反应堆的方法的好处,让我们来看看一个实际的例子。

我们将构建一个简单的应用程序,负责向在线购物平台的用户发送通知。例如,如果用户下了一份新订单,应用程序就会通过电子邮件或短信发送订单确认。

典型的同步实现自然会受到电子邮件或SMS服务吞吐量的限制。因此,流量高峰,比如节假日,通常是有问题的。

通过反应方法,我们可以将系统设计为更灵活,并更好地适应外部系统中可能发生的故障或超时,例如网关服务器。

让我们来看看应用程序 - 从更传统的方面开始,并转移到更具反应的结构。

4.1。简单的pojo

首先,让我们创建一个POJO类来表示通知数据:

公共类NotificationData {私人长ID;私有字符串名称;私有字符串电子邮件;私人弦移动;// getter和setter方法}

4.2。服务层

现在让我们定义一个简单的服务层:

公共接口Notificationservice {void IniteNotification(NotificationData NotificationData)抛出中断(NotificationData);}

和实现,模拟长时间运行:

@Service public class NotificationServiceimpl implements NotificationService {@Override public void initiateNotification(NotificationData NotificationData) throws InterruptedException {System.out。println(“通知服务启动”+“通知ID:”+ notificationData.getId());thread . sleep (5000);system . out。println("Notification service ended for " + "Notification ID: " + notificationData.getId());}}

请注意,为了说明通过SMS或电子邮件网关发送消息的现实生活场景,我们有意引入五秒钟的延迟IniteNotification.方法thread . sleep(5000)。

因此,当线程击中服务时,它将被阻止五秒钟。

4.3。消费者

现在让我们现在跳入我们的应用程序的更具反应方面并实现消费者 - 然后将映射到Reactor事件总线:

@Service公共类NotificationConsumer实现了消费者> {@autowired私有NotificationseratificationService;@override public void接受(事件 notificationdataEvent){notificationdata notificationdata = notificationdataEvent.getData();尝试{notificationservice.initiateNotification(NotificationData);catch(InterruptedException e){//ignore}}}

正如我们所看到的,我们创建的消费者实现了消费者界面。主要逻辑驻留在接受方法。

这是我们在典型的春季听众执行。

4.4。控制器

最后,现在我们能够消耗事件,让我们生成它们。

我们将在一个简单的控制器中这样做:

@Controller public class NotificationController {@Autowired private EventBus EventBus;@GetMapping("/startNotification/{param}") public void startNotification(@PathVariable Integer param) {for (int i = 0;我<参数;i++) {NotificationData data = new NotificationData();data.setId(我);eventBus。通知(“notificationConsumer Event.wrap(数据);system . out。println("通知" + i + ":通知任务提交成功");}}}

这是不言自明的,我们通过eventBus.这里。

例如,如果一个客户端使用参数值10点击URL,那么将通过事件总线发送10个事件。

4.5。Java Config.

让我们现在把一切都放在一起,创造一个简单春靴子应用。

首先,我们需要配置eventBus.环境豆子:

@configuration公共类配置{@bean公共环境env(){return environment.initializeifempty()。AssignerRorjournal();@Bean Public EventBus CreateEventBus(环境env){return eventbus.create(enview.norion.thread_pool);}}

在我们的案件中,我们实例化eventBus.使用环境中可用的默认线程池

或者,我们可以使用定制调度程序实例:

eventbus evbus = eventbus.create(enview.newdispatcher(restor_capacity,restor_consumers_count,dispatcherterype.thread_pool_execute);

现在,我们已准备好创建一个主要的应用程序代码:

导入静态reactor.bus.selector.selectors。$;@springbootapplication公共类NotificationApplication illimentImpting commandlinerunner {@autowired私有eventbus eventbus;@autowired私有通知Consumer NotificationConsumer;@override public void运行(string ... args)抛出异常{eventbus.on($(“notificationconsumer”),notificationConsumer);公共静态void main(string [] args){springapplication.run(notificationapplication.class,args);}}

在我们的运行方法我们正在注册NotificationConsumer.当通知与给定选择器匹配时要触发

控件的静态导入,请注意美元创建一个属性选择器目的。

5.测试应用程序

现在让我们创建一个测试来查看NotificationApplication在行动:

@RunWith(springgruner .class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class NotificationApplicationIntegrationTest {@LocalServerPort private int port;@Test public void givenAppStarted_whenNotificationTasksSubmitted_thenProcessed() {RestTemplate RestTemplate = new RestTemplate();创建restTemplate。getForObject("http://localhost:" + port + "/startNotification/10", String.class);}}

正如我们可以看到的那样,一旦请求执行,全部十任务立即提交而不创建任何阻塞。并在提交后,通知事件并行处理。

Notification 0:通知任务提交成功Notification 1:通知任务提交成功Notification 2:通知任务提交成功Notification 3:通知任务提交成功Notification 4:通知任务提交成功Notification 5:通知任务提交成功notification task submitted successfully notification 6:通知任务提交成功notification 7:通知任务提交成功notification 8:通知任务提交成功notification 9:通知任务提交成功notification service started for notification ID:1通知ID的通知服务启动:2通知ID的通知服务启动:3通知ID的通知服务启动:0通知ID的通知服务结束:1通知ID的通知服务结束:0通知ID的通知服务启动:4通知ID通知服务结束:3通知ID通知服务结束:2通知ID通知服务启动:6通知ID通知服务启动:5通知ID通知服务启动:7通知ID通知服务结束:4“通知ID”通知服务启动:8“通知ID”通知服务结束:6“通知ID”通知服务结束:5“通知ID”通知服务启动:9“通知ID”通知服务结束:7“通知ID”通知服务结束:8通知ID为9的通知服务结束

记住这一点很重要在我们的方案中,无需以任何特定的顺序处理这些事件。

六,结论

在这个快速的教程中,我们创建了一个简单的事件驱动应用程序。我们还看到了如何开始编写更具反应性和非阻塞代码。

然而,这种情况只是划伤了主题的表面,代表了一个良好的基础,以开始尝试反应范式

一如既往,源代码可用在github上

弹簧底部

开始使用Spring 5和Spring Boot 2,通过学习春天课程:

>>课程
2注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!