轻量级Rpc框架设计--motan源码解析一:框架介绍及框架使用初体验

一, 框架介绍

1.1 概况 

motan是新浪微博开源出来的一套高性能、易于使用的分布式远程服务调用(RPC)框架。

1.2 功能

可以spring的配置方式与项目集成.

支持zookeeper服务发现组件, 实现集群环境下服务注册与发现.

保证高并发, 高负载场景下的稳定高性能, , 实现生产环境下的RPC服务的高可用性.

二, Hello World

本次hello world级别的演示, 采用motan源码中自带的demo示例来搭建演示项目.

1.1 server端使用示例

   使用zk作为配置注册中心

<!-- 注册中心配置 使用不同注册中心需要依赖对应的jar包。如果不使用注册中心,可以把check属性改为false,忽略注册失败。-->
<motan:registry regProtocol="zookeeper" name="registry" address="127.0.0.1:2181"/>

   配置motan rpc通信协议

<!-- 协议配置。为防止多个业务配置冲突,推荐使用id表示具体协议。-->
<motan:protocol id="demoMotan" default="true" name="motan"
                    requestTimeout="220" maxServerConnection="80000" maxContentLength="1048576"
                    maxWorkerThread="800" minWorkerThread="20"/>

  配置basicService, 该项配置指的是, 假如服务提供者有多个服务需要对外暴露, 一些公共服务属性配置项就可以在这里配置, 而每个服务需要特殊处理的服务属性, 则可以放在motan:service下进行配置, 自动就会覆盖掉此处的相同配置.

 <!-- 通用配置,多个rpc服务使用相同的基础配置. group和module定义具体的服务池。export格式为“protocol id:提供服务的端口”-->
 <!-- 即是rpc服务的公共配置, 各个服务的特殊化配置, 则具体放在该服务配置中即可, 比如这里的export=""和requestTimeout="" 属性配置 -->
 <!-- 一些公有的配置, 每个服务对应的分组group, 注册中心registry, 所属模块module等, 比如这里的配置:  -->
 <!-- group="" accessLog="" shareChannel="" module="" application="" registry="" 则说明使用到basicService的每个服务, 它们的这几项属性值是一样的-->
<motan:basicService requestTimeout="220" export="demoMotan:8002"
                        group="motan-demo-rpc1" accessLog="false" shareChannel="true" module="motan-demo-rpc"
                        application="myMotanDemo" registry="registry" id="serviceBasicConfig"/>

  配置需要暴露的服务, 这里配置两个端口8001和8002进行服务暴露, 说明该服务会在本服务器的8001和8002端口同时对外提供服务.

<!-- 具体rpc服务配置,声明实现的接口类。需要根据业务情况设置合适的超时时间 -->
    <motan:service interface="com.weibo.motan.demo.service.MotanDemoService"
                   ref="motanDemoServiceImpl" export="demoMotan:8001" basicService="serviceBasicConfig"
                   requestTimeout="200">
    </motan:service>
<motan:service interface="com.weibo.motan.demo.service.MotanDemoService"
                   ref="motanDemoServiceImpl" export="demoMotan:8002" basicService="serviceBasicConfig"
                   requestTimeout="200">
    </motan:service>

使用main方法的方式加载spring容器

 public static void main(String[] args) throws InterruptedException {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                new String[]{"classpath*:motan_demo_server.xml"});
        MotanSwitcherUtil.setSwitcher(ConsulConstants.NAMING_PROCESS_HEARTBEAT_SWITCHER, true);
        System.out.println("server start...");
        Thread.sleep(Long.MAX_VALUE);
    }

类似于dubbo提供的dubbo-admin管控台一样, motan为了方便查看以及治理每个服务, 也提供了一个管控台叫motan-manager, 下面我们就来搭建并且启动该motan-manager管控台.

1.2 motan-manager管控台

在该项目目录结构中, 有一个config.properties的配置文件, 修改其配置文件中的zk地址, 为自己对应的zk地址即可.

zookeeper_url=127.0.0.1:2181

启动motan-manager后, 使用group分组名称可以查询到该分组下所有暴露服务的ip:port, 如下图:

 

通过motan-manager, 我们就能很直观的看见某一个分组下暴露的所有服务.

1.3 服务调用者client端

  配置zk注册中心

<motan:registry regProtocol="zookeeper" name="registry" address="127.0.0.1:2181" requestTimeout="200"/>

  配置motan rpc通信协议

<!-- motan协议配置 -->
<motan:protocol default="true" name="motan" haStrategy="failover"
		loadbalance="roundrobin" maxClientConnection="10" minClientConnection="2"/>

  配置basicReferer, 与basicService的作用是相同的道理, 将多个服务调用方相同的配置, 均可放在这里进行统一配置, 特殊处理的地方将交给motan:referer就可以了

<!-- 通用referer基础配置 -->
<motan:basicReferer requestTimeout="200" accessLog="false"
		retries="2" group="motan-demo-rpc" module="motan-demo-rpc"
		application="myMotanDemo" protocol="motan" registry="registry"
		id="motantestClientBasicConfig" throwException="false" check="true" />

配置具体的服务调用者

<motan:referer id="motanDemoReferer"
		interface="com.weibo.motan.demo.service.MotanDemoService"
		connectTimeout="300" requestTimeout="300" basicReferer="motantestClientBasicConfig"/>

client端使用main()方法的方式, 加载spring容器, 使用beanId通过getBean()方法获取到远程服务的一个代理对象, 使用该对象即可完成rpc远程调用.

public static void main(String[] args) throws InterruptedException {
	    
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				new String[] { "classpath:motan_demo_client.xml" });

		MotanDemoService service = (MotanDemoService) ctx
				.getBean("motanDemoReferer");
		for(int i = 0; i < Integer.MAX_VALUE; i++){
		    System.out.println(service.hello("motan" + i));
		    Thread.sleep(500);
		}
		System.out.println("motan demo is finish.");
		System.exit(0);
		
	}

最终将得到这样的执行结果, 这样就使用motan完成了一次远程rpc调用, 执行结果如下:

在motan-manager-admin管控台查看client服务调用者:

 

好了, 以上就是使用motan+zk的方式, 完成一次rpc的通信过程, 接下来会通过源码解析, 查看进行这样一次的rpc调用, motan究竟干了些什么, 又是怎样实现这一过程的.

所以下一篇将会首先介绍motan对spring自定义标签的开发, 以及motan是怎么解析xml配置文件中的内容, 进行服务暴露的.

spring自定义标签的开发, 可以查看以前我针对spring自定义标签写过的一篇博客:

https://blog.csdn.net/xiongxianze/article/details/80544665

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值