【转】Spring mvc集成ZBUS--轻量级MQ、RPC、服务总线

简介: 本文转自:http://www.cnblogs.com/top15from/p/4899954.html ZBUS = MQ + RPC + PROXY 支持消息队列, 发布订阅, RPC, 代理(TCP/DMZ) 亿级消息堆积能力、支持HA高可用 单个Jar包无依赖 ~300K 服务代...

本文转自: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-arch

ZBUS 消息通讯基础(NET模块)

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

znet-arch

框架结构保持 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消息协议

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
Java Spring 容器
Spring系列文章:Spring6集成MyBatis3.5
Spring系列文章:Spring6集成MyBatis3.5
|
3月前
|
消息中间件 Java Maven
一文搞懂Spring Boot整合RocketMQ
一文搞懂Spring Boot整合RocketMQ
117 0
|
2月前
|
NoSQL Java Redis
小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!
小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!
333 1
|
11天前
|
安全 Java 测试技术
Spring Boot集成支付宝支付:概念与实战
【4月更文挑战第29天】在电子商务和在线业务应用中,集成有效且安全的支付解决方案是至关重要的。支付宝作为中国领先的支付服务提供商,其支付功能的集成可以显著提升用户体验。本篇博客将详细介绍如何在Spring Boot应用中集成支付宝支付功能,并提供一个实战示例。
35 2
|
1天前
|
安全 Java 数据库连接
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
|
12天前
|
消息中间件 Java RocketMQ
Spring Cloud RocketMQ:构建可靠消息驱动的微服务架构
【4月更文挑战第28天】消息队列在微服务架构中扮演着至关重要的角色,能够实现服务之间的解耦、异步通信以及数据分发。Spring Cloud RocketMQ作为Apache RocketMQ的Spring Cloud集成,为微服务架构提供了可靠的消息传输机制。
27 1
|
14天前
|
消息中间件 人工智能 Java
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
25 1
|
25天前
|
缓存 Java Spring
单体项目中资源管理模块集成Spring Cache
该内容是关于将Spring Cache集成到资源管理模块以实现缓存同步的说明。主要策略包括:查询时添加到缓存,增删改时删除相关缓存。示例代码展示了@Service类中使用@Transactional和@Cacheable注解进行缓存操作,以及在RedisTemplate中处理缓存的示例。
24 5
|
1月前
|
Java 测试技术 Spring
Spring系列文章:Spring集成Log4j2⽇志框架、整合JUnit
Spring系列文章:Spring集成Log4j2⽇志框架、整合JUnit
|
1月前
|
消息中间件 Java Linux
RabbitMQ教程:Linux下安装、基本命令与Spring Boot集成
RabbitMQ教程:Linux下安装、基本命令与Spring Boot集成