1.何为RRiBbit?

*一种开源事件总线技术,能够让模块(组件)之间双向通讯,也被称为请求相应总线(request-response-bus),使用简单,相对其他框架来说,RRiBbit只需要加个注解@Listener即可,不需要改变源码,上手容易.

2.RRiBbit maven依赖:

注意版本问题: 如果需要整合spring的话,根据spring版本选择适当的版本,spring版本低,建议使用低版本的rribbit

<dependency>

<groupId>org.rribbit</groupId>

<artifactId>rribbit</artifactId>

<version>5.0.0</version>

</dependency>

3.架构图:

*此图是使用Rmi作为不同服务之间通信

* local开头代表单应用通信,Rmi代表不同服务通信

4.spring配置rribbit,单个模块事件发送和监听方法

(1).配置spring配置文件

<bean id="creator" class="org.rribbit.creation.SpringBeanClassBasedListenerObjectCreator">

<property name="packageNames">

<list>

<value>com.cx</value>

</list>

</property>

</bean>

<bean id="requestResponseBus" class="org.rribbit.util.RRiBbitUtil" factory-method="createRequestResponseBusForLocalUse">

<constructor-arg ref="creator" />

<constructor-arg value="true" />

</bean>

(2),在代码注入RequestResponseBus,调用send方法,设置监听的标识符和值,监听方只需加上@listener注解,设置监听的标识符就Ok了,官方文档地址:http://www.rribbit.org/documentation/howtouse.html

5.spring配置rribbit,不同服务模块事件发送和监听方法

*rribbit不同服务之间通信有三种方法,基于RMI,基于JMS,还有一种基于http(可根据业务需求选择合适的方法使用)

官方文档地址:http://www.rribbit.org/documentation/remoting.html

(1).使用基于Rmi不同服务模块通信

*java代码实现

//设置要扫描的包

SpringBeanClassBasedListenerObjectCreator springBeanClassBasedListenerObjectCreator=new SpringBeanClassBasedListenerObjectCreator();

List<String> packageNames =new ArrayList<>();

packageNames.add("com.cx");

springBeanClassBasedListenerObjectCreator.setPackageNames(packageNames);

ListenerObjectRetriever listenerObjectRetriever=new DefaultListenerObjectRetriever(springBeanClassBasedListenerObjectCreator);

ListenerObjectExecutor listenerObjectExecutor=new MultiThreadedListenerObjectExecutor();

//设置监听的端口号

//可以把rmiRequestProcessor交给spring管理

RmiRequestProcessorImpl rmiRequestProcessor=new RmiRequestProcessorImpl(8001,listenerObjectRetriever,listenerObjectExecutor);

//设置调用的服务端口号和ip地址

RmiRequestDispatcher rmiRequestDispatcher=new RmiRequestDispatcher(8001,"127.0.0.1");

//创建发送对象

RequestResponseBus requestResponseBus=new DefaultRequestResponseBus();

((DefaultRequestResponseBus) requestResponseBus).setRequestDispatcher(rmiRequestDispatcher);

//发送的事件信息数据

requestResponseBus.send("add","123");

注意! 需要监听该事件的模块也要配置rmiRequestProcessor,方法一样的

*把rmiRequestProcessor交由spring管理,spring配置使用如下

<!--      SpringBeanClassBasedListenerObjectCreator springBeanClassBasedListenerObjectCreator=new SpringBeanClassBasedListenerObjectCreator();

List<String> packageNames =new ArrayList<>();

packageNames.add("com.cx");

springBeanClassBasedListenerObjectCreator.setPackageNames(packageNames);-->

<bean id="springBeanClassBasedListenerObjectCreator" class="org.rribbit.creation.SpringBeanClassBasedListenerObjectCreator">

<property name="packageNames">

<list>

<value>com.cx</value>

</list>

</property>

</bean>

<!--ListenerObjectRetriever listenerObjectRetriever=new DefaultListenerObjectRetriever(springBeanClassBasedListenerObjectCreator);-->

<bean id="listenerObjectRetriever" class="org.rribbit.retrieval.DefaultListenerObjectRetriever">

<property name="listenerObjectCreator" ref="springBeanClassBasedListenerObjectCreator" />

</bean>

<!--ListenerObjectExecutor listenerObjectExecutor=new MultiThreadedListenerObjectExecutor();-->

<bean id="listenerObjectExecutor" class="org.rribbit.execution.MultiThreadedListenerObjectExecutor"></bean>

<!--RmiRequestProcessorImpl rmiRequestProcessor=new RmiRequestProcessorImpl(8001,listenerObjectRetriever,listenerObjectExecutor);-->

<bean id="requestProcessor" class="org.rribbit.processing.RmiRequestProcessorImpl">

<property name="listenerObjectExecutor" ref="listenerObjectExecutor"/>

<property name="listenerObjectRetriever" ref="listenerObjectRetriever"/>

<constructor-arg name="portnumber" value="8001"/>

</bean>

<!--配置发送对象

RequestResponseBus requestResponseBus=new DefaultRequestResponseBus();-->

<bean id="requestResponseBus" class="org.rribbit.DefaultRequestResponseBus"></bean>

</beans>

使用方法:

//创建调用的服务端口号和ip地址

RmiRequestDispatcher rmiRequestDispatcher=new RmiRequestDispatcher(8001,"127.0.0.1");

注入requestResponseBus,

设置requestResponseBus.setRequestDispatcher(rmiRequestDispatcher);

使用requestResponseBus.send方法发送事件就OK了,

注意!! rribbit会返回服务监听方抛出的异常!!

RRiBbit,一个事件总线.基于spring配置不同服务通信!的更多相关文章

  1. spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中 配置的Bean,充分利用了Spring ...

  2. 通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载

    在上一篇文章里,我们通过注入sentinel component到apigateway实现了对下游服务的保护,不过受限于目前变更component需要人工的重新注入配置以及重启应用更新componen ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统

    本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...

  4. RESTLET开发实例(三)基于spring的REST服务

    http://www.lifeba.org/arch/restlet_spring_3.html 前面两篇文章,我们介绍了基于JAX-RS的REST服务以及Application的Rest服务.这里将 ...

  5. [转贴]JAVA:RESTLET开发实例(三)基于spring的REST服务

    前面两篇文章,我们介绍了基于JAX-RS的REST服务以及Application的Rest服务.这里将介绍restlet如何整合spring框架进行开发.Spring 是一个开源框架,是为了解决企业应 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

    首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护

    dapr目前更新到了1.2版本,在之前4月份的时候来自阿里的开发工程师发起了一个dapr集成Alibaba Sentinel的提案,很快被社区加入到了1.2的里程碑中并且在1.2 release 相关 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式

    在之前的系列文章中聊过分布式事务的一种实现方案,即通过在集群中暴露actor服务来实现分布式事务的本地原子化.但是actor服务本身有其特殊性,场景上并不通用.所以今天来讲讲分布式事务实现方案之sag ...

随机推荐

  1. C++ 深入浅出工厂模式(初识篇)

    初识工厂模式 我们先看工厂模式的介绍 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创 ...

  2. 【第十一篇】这一篇来说说MVC+EF+easyui datagrid的查询功能

    老规矩 直接上代码 <form class="form-horizontal"> <div class="box-body"> < ...

  3. UGUI_游戏界面开发Demo001

    1.Alt+Stretch:快速拉伸匹配至画布,与父类大小保持一致. 2.Anchors锚点:实现屏幕自适应 图片也可以实现自适应.Target Graphic (目标图),点击的时候,控件的效果用在 ...

  4. 单点登录(Single Sign On)解决方案

    单点登录(Single Sign On)解决方案 需求 多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. A 网站和 B 网站是同一家公司的关联服务.现在要求,用户只要在其中一个网 ...

  5. Kubernetes v1.16 发布 | 云原生生态周报 Vol. 20

    作者:心贵.进超.元毅.心水.衷源.洗兵 业界要闻 Kubernetes v1.16 发布 在这次发布中值得关注的一些特性和 Feature: CRD 正式进入 GA 阶段: Admission We ...

  6. Java面试-如何获取客户端真实IP

    在进行一些小游戏开发时,我们经常比较关注的一个功能便是分享.针对分享,我们希望能根据各个城市或者地区,能有不同的分享文案,辨识地区的功能如果由服务器来完成的话,我们就需要知道客户端的真实IP.今天我们 ...

  7. 多线程——Callable接口

    package pers.aaa.callable; import java.util.concurrent.Callable; public class MyCallable implements ...

  8. Java第二次作业第二题

    请编写图像界面程序,用户在第一文本行输入数字,有三个按钮,分别是计算2进制,8进制,16进制,点击其中一个按钮,第一个文本行中的数据转换为相应进制的数显示在第二个文本行中. package naizi ...

  9. 62 (OC)* leetCode 力扣 算法

    1:两数之和 1:两层for循环 2:链表的方式 视频解析 2:两数相加 两数相加 3. 无重复字符的最长子串 给定一个字符串,请找出其中长度最长且不含有重复字符的子串,计算该子串长度 无重复字符的最 ...

  10. [VB.NET Tips]对于基本数据类型的提示

    1.类型字符 有时需要直接量后面加上类型字符以明确指定类型,下面把常用的类型字符列出来 类型 字符 Short S Integer I Long L Decimal D Char c Single F ...