【转】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消息协议

时间: 2024-11-02 01:17:06

【转】Spring mvc集成ZBUS--轻量级MQ、RPC、服务总线的相关文章

spring mvc集成tiles的问题

问题描述 我在spring-servlet里配置的内容: <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass"> <value> org.springframework.web.servlet.view.tiles2.TilesVi

spring mvc-Spring MVC集成velocity视图解析器问题

问题描述 Spring MVC集成velocity视图解析器问题 小弟最近学习搭建Spring MVC框架的web应用,工具是Myeclipse10,在配置velocity的视图解析器时遇见1奇怪问题,烦请高手解答.问题简述:项目搭建完毕启动访问url后,最初是报 找不到layout.vm这个文件而出错,在项目里面新建该文件后,后台无报错了,但是无论Action返回视图a或b,最终都会显示layout里面的内容,从而达不到页面跳转的目的.下面附上几张项目配置的图片供参考.项目文件结构:web.x

Spring MVC分析,知识重构(1)

Spring MVC,什么是MVC,MVC框架都能做什么. 1.mvc框架需要做什么 a)将url映射到java或者java类的方法 b)封装用户提交的数据,例如表单数据,请求. c)处理请求,调用相关的业务处理(控制器controller),封装响应的数据. d)响应的数据进行渲染(html页面,jsp页面等),用json比较多. 2.Spring MVC是一个轻量级的基于请求(get).响应(post)的框架. 3.为什么学习Spring MVC 重点:a.性能比strtuts2好,stru

使用Spring MVC统一异常处理实战

原文地址: http://cgs1999.iteye.com/blog/1547197   1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大. 那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的.下面将介绍使用Spr

jbpm4.4 集成spring mvc 怎么配置?

问题描述 jbpm4.4 集成spring mvc 怎么配置? 如题 感谢回答~大神帮我看下如题 感谢回答~大神帮我看下如题 感谢回答~大神帮我看下 解决方案 https://github.com/search?utf8=%E2%9C%93&q=+jbpm+spring&type=Repositories&ref=searchresults 解决方案二: activiti集成spring的配置请参考 : http://git.oschina.net/wangkang/llsfw

Spring MVC 4.2.2 中最好的集成静态资源的方法

Spring MVC 4.2.2 中最好的集成静态资源的方法 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. Spring MVC 4.2.2 – Best way to Add/Integra

jsp spring mvc 框架集成google kaptcha生成验证码实例教程

关于kaptcha介绍,我们就不说了,网上一堆的资料. 使用kaptcha可以方便的配置:    验证码的字体    验证码字体的大小    验证码字体的字体颜色    验证码内容的范围(数字,字母,中文汉字!)    验证码图片的大小,边框,边框粗细,边框颜色    验证码的干扰线(可以自己继承com.google.code.kaptcha.NoiseProducer写一个自定义的干扰线)    验证码的样式(鱼眼样式.3D.普通模糊--当然也可以继承com.google.code.kaptc

spring与spring mvc应该如何集成呀

问题描述 spring mvc在web.xml中的配置为:<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><s

spring mvc 实现远程服务调用的几种方式

org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter 实现远程服务调用 (1)httpinvoker方式 服务器客户端都是spring时推荐这种方式 服务端 必须要实现 bean实体类  service接口类  serviceImpl服务实现类 客户端只需拷贝 bean 实体类  service接口类(注意 ,客户端 bean,service类要和服务端bean,service类包路径相同,比如都是 com.hlz