【转】Spring mvc集成ZBUS--轻量级MQ、RPC、服务总线
本文转自:http://www.cnblogs.com/top15from/p/4899954.html
ZBUS = MQ + RPC + PROXY
- 支持消息队列, 发布订阅, RPC, 代理(TCP/DMZ)
- 亿级消息堆积能力、支持HA高可用
- 单个Jar包无依赖 ~300K
- 服务代理 -- 适配改造已有业务系统,使之具备跨平台与语言
- 丰富的API--JAVA/C/C++/C#/Python/Node.JS多语言接入
zbus-dist选择zbus.sh或者zbus.bat直接执行

总线默认占用 15555 端口, http://localhost:15555 可以直接进入监控,注意zbus因为原生兼容HTTP协议所以监控与消息队列使用同一个端口
ZBUS 角色概要

ZBUS 消息通讯基础(NET模块)
ZBUS项目不依赖其他第三方库,消息通讯基于NIO完成(NET子项目)。NET包对NIO做了简洁的封装,相对Netty而言,学习成本低几个量级,模型简单,但不失扩展性。

框架结构保持 Dispatcher + N SelectorThread + IoAdaptor
Dispatcher 负责管理N个Selector线程
SelectorThread 负责NIO读写事件分发
IoAdaptor 个性化读写事件
基于NET的服务器程序基本只要关心IoAdaptor的个性化,比如ZBUS入口就是MqAdaptor
ZBUS API
ZBUS PROXY
ZBUS 示例
Java Maven 依赖
<dependency>
<groupId>org.zbus</groupId>
<artifactId>zbus</artifactId>
<version>6.2.6</version>
</dependency>
生产者
public static void main(String[] args) throws Exception {
//创建Broker代理
BrokerConfig config = new BrokerConfig();
config.setServerAddress("127.0.0.1:15555");
final Broker broker = new SingleBroker(config);
Producer producer = new Producer(broker, "MyMQ");
producer.createMQ(); // 如果已经确定存在,不需要创建
//创建消息,消息体可以是任意binary,应用协议交给使用者
Message msg = new Message();
msg.setBody("hello world");
producer.sendSync(msg);
broker.close();
}
消费者
public static void main(String[] args) throws Exception{
//创建Broker代表
BrokerConfig brokerConfig = new BrokerConfig();
brokerConfig.setServerAddress("127.0.0.1:15555");
Broker broker = new SingleBroker(brokerConfig);
MqConfig config = new MqConfig();
config.setBroker(broker);
config.setMq("MyMQ");
//创建消费者
@SuppressWarnings("resource")
Consumer c = new Consumer(config);
c.onMessage(new MessageHandler() {
@Override
public void handle(Message msg, Session sess) throws IOException {
System.out.println(msg);
}
});
//启动消费线程
c.start();
}
RPC动态代理【各类复杂类型】
参考源码test目下的rpc部分
//1)创建Broker代表(可用高可用替代)
BrokerConfig config = new BrokerConfig();
config.setServerAddress("127.0.0.1:15555");
Broker broker = new SingleBroker(config); //2)创建基于MQ的Invoker以及Rpc工厂,指定RPC采用的MQ为MyRpc
MqInvoker invoker = new MqInvoker(broker, "MyRpc");
RpcFactory factory = new RpcFactory(invoker); //3) 动态代理出实现类
Interface hello = factory.getService(Interface.class); test(hello); broker.close();
Spring集成--服务端(RPC示例)
无任何代码侵入使得你已有的业务接口接入到zbus,获得跨平台和多语言支持
<!-- 暴露的的接口实现示例 -->
<bean id="interface" class="org.zbus.rpc.biz.InterfaceImpl"></bean> <bean id="serviceProcessor" class="org.zbus.rpc.RpcProcessor">
<constructor-arg>
<list>
<!-- 放入你需要的暴露的的接口 -->
<ref bean="interface"/>
</list>
</constructor-arg>
</bean> <bean id="broker" class="org.zbus.broker.SingleBroker">
<constructor-arg>
<bean class="org.zbus.broker.BrokerConfig">
<property name="serverAddress" value="127.0.0.1:15555" />
<property name="maxTotal" value="20"/>
<!-- 这里可以增加连接池参数配置,不配置使用默认值(参考commons-pool2) -->
</bean>
</constructor-arg>
</bean> <!-- 默认调用了start方法,由Spring容器直接带起来注册到zbus总线上 -->
<bean id="myrpcService" class="org.zbus.rpc.mq.Service" init-method="start">
<constructor-arg>
<bean class="org.zbus.rpc.mq.ServiceConfig">
<!-- 支持多总线注册 -->
<constructor-arg>
<list>
<ref bean="broker"/>
</list>
</constructor-arg>
<property name="mq" value="MyRpc"/>
<property name="consumerCount" value="2"/>
<property name="messageProcessor" ref="serviceProcessor"/>
</bean>
</constructor-arg>
</bean>
Spring集成--客户端
<bean id="broker" class="org.zbus.broker.SingleBroker">
<constructor-arg>
<bean class="org.zbus.broker.BrokerConfig">
<property name="serverAddress" value="127.0.0.1:15555" />
</bean>
</constructor-arg>
</bean> <bean id="myrpc" class="org.zbus.rpc.RpcFactory">
<constructor-arg>
<bean class="org.zbus.rpc.mq.MqInvoker">
<constructor-arg ref="broker"/>
<constructor-arg value="MyRpc"/>
</bean>
</constructor-arg>
</bean> <bean id="interface" factory-bean="myrpc" factory-method="getService">
<constructor-arg type="java.lang.Class" value="org.zbus.rpc.biz.Interface"/>
</bean>
Spring完成zbus代理透明化,zbus设施从你的应用逻辑中彻底消失
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("SpringRpcClient.xml");
Interface intf = (Interface) context.getBean("interface");
for(int i=0;i<100;i++){
System.out.println(intf.listMap());
}
}
ZBUS消息协议
【转】Spring mvc集成ZBUS--轻量级MQ、RPC、服务总线的更多相关文章
- spring mvc集成freemarker使用
freemarker作为视图技术出现的比velocity早,想当年struts风靡一时,freemarker作为视图层也风光了一把.但现在velocity作为后起之秀的轻量级模板引擎,更容易得到青睐. ...
- Spring MVC集成slf4j-logback
转自: Spring MVC集成slf4j-logback 1. Spring MVC集成slf4j-log4j 关于slf4j和log4j的相关介绍和用法,网上有很多文章可供参考,但是关于logb ...
- spring mvc集成velocity使用
目前流行的三大页面视图神器是:老牌大哥jsp.后起之秀freemarker和velocity.这里不详细比较这三者的优劣,总体来说,jsp是标配,但后面两个更严格的执行了视图与业务的分离,页面里是不允 ...
- spring mvc 集成freemarker模板
主要使用到的jar 文件:spring mvc +freemarker.jar 第一步:spring mvc 集成 freemarker <!-- 定义跳转的文件的前后缀 ,视图模式配置--&g ...
- Spring MVC集成Swagger
什么是Swagger? 大部分 Web 应用程序都支持 RESTful API,但不同于 SOAP API——REST API 依赖于 HTTP 方法,缺少与 Web 服务描述语言(Web Servi ...
- Spring MVC集成Log4j
以下示例显示如何使用Spring Web MVC框架集成LOG4J.首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: 创建一 ...
- Spring MVC集成Spring Data Reids和Spring Session实现Session共享
说明:Spring MVC中集成Spring Data Redis和Spring Session时版本是一个坑点,比如最新版本的Spring Data Redis已经不包含Jedis了,需要自行引入. ...
- Spring Boot与Spring MVC集成启动过程源码分析
开源项目推荐 Pepper Metrics是我与同事开发的一个开源工具(https://github.com/zrbcool/pepper-metrics),其通过收集jedis/mybatis/ht ...
- Spring MVC集成Swagger2.0
在集成Swagger之前,得先说说什么是Swagger,它是用来做什么的,然后再讲讲怎么集成,怎么使用,当然,在这之前,需要了解一下OpenAPI. OpenAPI OpenAPI 3.0规范定义了一 ...
随机推荐
- 如何用PowerShell列出你机器上的.NET Framework的版本号和SP服务补丁
代码下载:本文提到的脚本,可以从微软的代码库下载, How to determine versions & service pack levels of .NET Framework by P ...
- 【翻译】DotNetMQ: 一个.NET版完整的消息队列系统
在一个大型的分布式系统中,消息队列是不可缺少的中间件,能很好的解决异步消息.应用解耦.均衡并发等问题.在.net中,偶然发现一个效率不错.安全可靠.功能齐全的消息组件,忍不住翻译过来,供大家快速预览. ...
- 详解AsyncTask的使用
转载自:http://blog.csdn.net/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask. ...
- RecyclerView的使用(四)
前面我们已经实现了RecyclerView的大部分功能了,但是有个很明显的缺陷-------没有点击效果!这就坑爹了 ListView自带点击效果好嘛!连这个都要自己定义.... 话不多说,下面就来为 ...
- Django-跨站请求
//用户验证Tonken 在Html 中 设置一个Token {% csrf_token %} //在代码Views.py 中返回值添加 context_instance=RequestContext ...
- caffe中accuracy和loss用python从log日志里面获取
import re import pylab as pl import numpy as np if __name__=="__main__": accuracys=[] loss ...
- Ajax表单序列化后的数据格式转成Json发送给后台
<script> $(function(){ //表单转json函数 $.fn.serializeObject = function(){ var o = {}; var a = this ...
- bzoj4559: [JLoi2016]成绩比较
感谢丁爷爷教我做这个题的后半部分. 首先,运用一发容斥原理,求出所有人与B神每门课分数相对关系的不同方案数. 这个似乎大(wo)家(lan)都(de)会(hui)了(yi),我就不说了,详见代码里的f ...
- windows下 nvm下载node被墙了解决办法
不需要这么麻烦的,在1.1.1版本中,确实没有实现命令行设置.这点你分析的很对,但是从配置文件中读取镜像地址已经完成,所以直接在settings.txt中手工设置一下就好了,无需编译.以下是我的文件位 ...
- VsFtpd服务配置简明笔记
Ftp服务是最常用的文件传输方式,把配置步骤记录下来,以备将来使用. 1.用YUM安装VsFtpd服务:[root@Redis usr]# yum install vsftpd 2.安装完成后启动Vs ...