RRiBbit,一个事件总线.基于spring配置不同服务通信!
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配置不同服务通信!的更多相关文章
- spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中 配置的Bean,充分利用了Spring ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载
在上一篇文章里,我们通过注入sentinel component到apigateway实现了对下游服务的保护,不过受限于目前变更component需要人工的重新注入配置以及重启应用更新componen ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统
本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...
- RESTLET开发实例(三)基于spring的REST服务
http://www.lifeba.org/arch/restlet_spring_3.html 前面两篇文章,我们介绍了基于JAX-RS的REST服务以及Application的Rest服务.这里将 ...
- [转贴]JAVA:RESTLET开发实例(三)基于spring的REST服务
前面两篇文章,我们介绍了基于JAX-RS的REST服务以及Application的Rest服务.这里将介绍restlet如何整合spring框架进行开发.Spring 是一个开源框架,是为了解决企业应 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解
首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护
dapr目前更新到了1.2版本,在之前4月份的时候来自阿里的开发工程师发起了一个dapr集成Alibaba Sentinel的提案,很快被社区加入到了1.2的里程碑中并且在1.2 release 相关 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式
在之前的系列文章中聊过分布式事务的一种实现方案,即通过在集群中暴露actor服务来实现分布式事务的本地原子化.但是actor服务本身有其特殊性,场景上并不通用.所以今天来讲讲分布式事务实现方案之sag ...
随机推荐
- 内部类实例化Serializable
昨天在做一个java项目的时候,发现下面代码中红色字体那行总是报NotSerializableException,查错误,MyRectangle这个类也明明实现了Serializable接口. 花了大 ...
- Redis缓存和数据库一致性问题
工作中,经常会遇到缓存和数据库数据一致性问题.从理论上设置过期时间,是保证最终一致性的解决方案.这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可 ...
- Linux 笔记 - 第十七章 Linux LVM 逻辑卷管理器
一.前言 在实际生产中,有时会遇到磁盘分区空间不足的情况,这时候就需要对磁盘进行扩容,普通情况下需要新加一块磁盘,重分区.格式化.数据复制.卸载旧分区.挂载新分区等繁琐的步骤,而且有可能造成数据的丢失 ...
- 创建型模式总结(2.x)
顾名思义,创建型模式的聚焦点在如何创建对象能够将对象的创建与使用最大化的分离从而降低系统的耦合度. 创建型模式可分为: 单例模式:一个类只能有一个实例对象 工厂模式: 简单工厂模式:聚焦单个产品种类的 ...
- Windows Docker 部署 Spring Boot 项目
目录 Docker Configuration Config IDEA Plugin Create Spring Boot Project Containerize It Use Dockerfile ...
- SpringBoot的注解注入功能移植到.Net平台(开源)
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- [Advanced Python] 15 - "Metaclass": ORM
From: 使用元类 动态创建类 与静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 一 .type()动态创建 我们说class的定义是运行时动态创建的: 而创建cl ...
- [Pandas] 06 - Data Preprocessing and Cleaning
From: DBWangGroup 基于该系列代码的实践与补充思考. 补充:特征工程 结合:[Scikit-learn] 4.3. Preprocessing data /* implement */
- ActiveMQ+ZooKeeper搭建高可用集群
一.说明 实际的应用中,一般为了应用的高可用性,都会搭建集群环境去处理.部署多台应用,这样,即使一台有问题,其他热备应用可以立马顶上,继续提供服务. ActiveMQ的集群部署,基于zookeeper ...
- java、python、MYSQL环境安装
JAVA的环境变量:变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 变量名:JAVA_HOME python的环境变量:变量值: %PY_HOME ...