motan与zookeeper框架

http://tech.sina.com.cn/i/2016-05-10/doc-ifxryhhh1869879.shtml

 新浪科技讯 5月10日消息,微博方面宣布,支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan。微博技术团队希望未来能有更多优秀的开源人入驻,并进一步完善优化。

Motan 项目地址: https://github.com/weibocom/motan


 

搭建新浪RPC框架motan Demo  

http://blog.csdn.net/linuu/article/details/53115290





motan是新浪微博开源的RPC框架,github官网是:https://github.com/weibocom/motan


今天就先搭建一个Hello world demo,本demo基于motan 0.2.1版本


首先先去github下载源代码(motan-manager报错请忽略,eclipse的web Module不兼容):

选中motan下的pom.xml,进行编译打包:

下载源码编译打包的目的有三个:

1)下载源代码可以方便源代码阅读学习

2)下载到motan.xsd,因为motan与spring进行了继承,有了自己的schema,eclipse会不识别,会导致xml报错,跟dubbo的配置文件报错一个道理

3)打包获取到motan-manager的页面管理端的war包



3)在motan-manager的target文件下找到打好的war包:


单独找一个tomcat,将其放入webapp文件下

然后进入bin文件下,启动tomcat

打开浏览器http://localhost:8080/motan-manager-0.2.2-SNAPSHOT:




到此为止motan的管理平台就搭建好了,下面就搭建基于zookeeper为注册中心的RPC demo

1)首先先启动一个简单的zookeeper实例,在windows下简单的启动一个,写个demo,不需要集群



打开eclipse,搭建两个简单的maven项目:

motan-provider为服务提供端,motan-client服务调用端。两个项目的依赖基本上一样的:

[html]  view plain  copy
  1.        <properties>  
  2.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  3.     <motan.version>0.2.1</motan.version>  
  4. </properties>  
  5.   
  6. <dependencies>  
  7.     <dependency>  
  8.         <groupId>com.weibo</groupId>  
  9.         <artifactId>motan-core</artifactId>  
  10.         <version>${motan.version}</version>  
  11.     </dependency>  
  12.     <dependency>  
  13.         <groupId>com.weibo</groupId>  
  14.         <artifactId>motan-transport-netty</artifactId>  
  15.         <version>${motan.version}</version>  
  16.     </dependency>  
  17.   
  18.     <dependency>  
  19.         <groupId>com.weibo</groupId>  
  20.         <artifactId>motan-registry-zookeeper</artifactId>  
  21.         <version>${motan.version}</version>  
  22.     </dependency>  
  23.   
  24.     <dependency>  
  25.         <groupId>com.weibo</groupId>  
  26.         <artifactId>motan-springsupport</artifactId>  
  27.         <version>${motan.version}</version>  
  28.     </dependency>  
  29.     <dependency>  
  30.         <groupId>org.springframework</groupId>  
  31.         <artifactId>spring-context</artifactId>  
  32.         <version>4.2.4.RELEASE</version>  
  33.     </dependency>  
  34.     <dependency>  
  35.         <groupId>org.slf4j</groupId>  
  36.         <artifactId>slf4j-api</artifactId>  
  37.         <version>1.5.8</version>  
  38.     </dependency>  
  39.   
  40.     <dependency>  
  41.         <groupId>org.slf4j</groupId>  
  42.         <artifactId>slf4j-log4j12</artifactId>  
  43.         <version>1.5.8</version>  
  44.     </dependency>  
  45.   
  46.     <dependency>  
  47.         <groupId>log4j</groupId>  
  48.         <artifactId>log4j</artifactId>  
  49.         <version>1.2.14</version>  
  50.     </dependency>  
  51. </dependencies>  

服务提供端motan-provider的编写

1)我们写一个简单的接口HelloService:

[java]  view plain  copy
  1. package com.bazinga.study.motan.rpc.service;  
  2.   
  3. public interface HelloService {  
  4.       
  5.     public String hello(String str);  
  6.   
  7. }  
HelloSerivce简单的实现类HelloServiceImpl:

[java]  view plain  copy
  1. package com.bazinga.study.motan.rpc.service;  
  2.   
  3. public class HelloServiceImpl implements HelloService {  
  4.   
  5.     public String hello(String str) {  
  6.         return "hello " + str;  
  7.     }  
  8.       
  9.   
  10. }  

然后在src/main/resources下配置spring-motan-provider.xml

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:motan="http://api.weibo.com/schema/motan"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  6.    http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd">  
  7.   
  8.     <!-- spring管理的服务具体实现 -->  
  9.     <bean id="serviceImpl" class="com.bazinga.study.motan.rpc.service.HelloServiceImpl" />  
  10.     <!-- 注册中心的配置 -->  
  11.     <motan:registry regProtocol="zookeeper" name="zkRegistry" address="127.0.0.1:2181" connectTimeout="2000"/>  
  12.       
  13.     <!-- 协议配置。为防止多个业务配置冲突,推荐使用id表示具体协议。-->  
  14.     <motan:protocol id="demoMotan" default="true" name="motan" maxServerConnection="80000" maxContentLength="1048576"  
  15.                     maxWorkerThread="800" minWorkerThread="20"/>  
  16.     <!-- 服务的默认配置 group:标识服务的分组 module:标识模块信息 registry:标识service使用的注册中心,与motan:registry中的name对应  -->             
  17.    <motan:basicService export="demoMotan:8002"  
  18.                         group="lyncc-motan-demo-rpc" accessLog="true" shareChannel="true" module="motan-demo-rpc"  
  19.                         application="myMotanDemo" registry="zkRegistry" id="serviceBasicConfig"/>  
  20.     <!-- 要暴露的服务,唯一标识是integerface -->  
  21.     <motan:service interface="com.bazinga.study.motan.rpc.service.HelloService" ref="serviceImpl" export="demoMotan:8001" basicService="serviceBasicConfig" />  
  22.       
  23.       
  24. </beans>  

注意此时你的IDE可能会报错,不识别<motan:registry>这些标签,解决方案:

Window-->Preferences--->XML:



选中我们刚才冲源码包中获取到的motan.xsd,然后key type选择Schema location 最最关键的就是key值了:http://api.weibo.com/schema/motan.xsd


这个值要与你命名空间中的值一样:


重新打开spring-motan-provider.xml文件就不报错了~


好了,我们继续,编写provider的启动类ProviderStarter:

[java]  view plain  copy
  1. package com.bazinga.study.motan.rpc.quickstart;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. import com.weibo.api.motan.common.MotanConstants;  
  7. import com.weibo.api.motan.util.MotanSwitcherUtil;  
  8.   
  9. public class ProviderStarter {  
  10.       
  11.     public static void main(String[] args) {  
  12.         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-motan-provider.xml");  
  13.         MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);  
  14.         System.out.println("server start...");  
  15.     }  
  16.   
  17. }  
启动该类:

此时再打开motan-manager的管理页面:


可以查询到我们刚才注册好的服务,并且可以看到Server的服务者的个数是1个,我们开始编写motan-client的编写:

1)先把motan-provider端的HelloSerivce接口复制到motan-client,package的目录也要一样,因为接口的绝对路径被认为服务的唯一标识


2)在motan-client的src/main/resources文件夹下新建文件spring-motan-client.xml

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:motan="http://api.weibo.com/schema/motan"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  6.    http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd">  
  7.   
  8.       
  9.     <motan:registry regProtocol="zookeeper" name="registry" address="127.0.0.1:2181"/>  
  10.       
  11.     <!-- motan协议配置 -->  
  12.     <motan:protocol default="true" name="motan" haStrategy="failover"  
  13.                     loadbalance="roundrobin" maxClientConnection="10" minClientConnection="2"/>  
  14.                       
  15.     <!-- 通用referer基础配置 -->  
  16.     <motan:basicReferer requestTimeout="200" accessLog="true"  
  17.                         retries="2" group="lyncc-motan-demo-rpc" module="motan-demo-rpc"  
  18.                         application="myMotanDemo" protocol="motan" registry="registry"  
  19.                         id="motantestClientBasicConfig" throwException="false" check="true"/>  
  20.       
  21.     <motan:referer id="remoteService" interface="com.bazinga.study.motan.rpc.service.HelloService" connectTimeout="300" requestTimeout="300" basicReferer="motantestClientBasicConfig"/>  
  22.       
  23.       
  24. </beans>  

3)编写启动类:

[java]  view plain  copy
  1. package com.bazinga.study.motan.rpc.quickstart;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. import com.bazinga.study.motan.rpc.service.HelloService;  
  7.   
  8. public class ClientStart {  
  9.       
  10.     public static void main(String[] args) {  
  11.         ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring-motan-client.xml");  
  12.         HelloService service = (HelloService) ctx.getBean("remoteService");  
  13.         for(int i = 0;i< 50;i++){  
  14.             System.out.println(service.hello("motan " + i));  
  15.         }  
  16.     }  
  17.   
  18. }  


4)log4j.properties

[plain]  view plain  copy
  1. log4j.rootLogger=warn  
  2. log4j.logger.info=info,infofile  
  3. log4j.logger.warn=warn,warnfile  
  4. log4j.logger.error=error,errorfile  
  5. log4j.logger.profile=info,profile  
  6.   
  7. log4j.logger.trace=trace,tracefile  
  8. log4j.logger.accessLog=debug,accessfile  
  9. log4j.logger.serviceStatsLog=info,serviceStatsLog  
  10.   
  11. log4j.appender.tracefile=org.apache.log4j.DailyRollingFileAppender   
  12. log4j.appender.tracefile.file=./logs/client/trace.log  
  13. log4j.appender.tracefile.DatePattern='.'yyyyMMdd  
  14. log4j.appender.tracefile.layout=org.apache.log4j.PatternLayout  
  15. log4j.appender.tracefile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  16.   
  17. log4j.appender.accessfile=org.apache.log4j.DailyRollingFileAppender   
  18. log4j.appender.accessfile.file=./logs/client/access.log  
  19. log4j.appender.accessfile.DatePattern='.'yyyyMMdd  
  20. log4j.appender.accessfile.layout=org.apache.log4j.PatternLayout  
  21. log4j.appender.accessfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  22.   
  23. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  24. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  25. log4j.appender.stdout.layout.ConversionPattern=%p %d{yy/MM/dd HH:mm:ss} %-50.50c(%L) - %m%n  
  26.   
  27. log4j.appender.infofile=org.apache.log4j.DailyRollingFileAppender   
  28. log4j.appender.infofile.file=./logs/client/info.log  
  29. log4j.appender.infofile.DatePattern='.'yyyyMMdd-HH  
  30. log4j.appender.infofile.layout=org.apache.log4j.PatternLayout  
  31. log4j.appender.infofile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  32.   
  33. log4j.appender.warnfile=org.apache.log4j.DailyRollingFileAppender   
  34. log4j.appender.warnfile.file=./logs/client/warn.log  
  35. log4j.appender.warnfile.DatePattern='.'yyyyMMdd  
  36. log4j.appender.warnfile.layout=org.apache.log4j.PatternLayout  
  37. log4j.appender.warnfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  38.   
  39. log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender   
  40. log4j.appender.errorfile.file=./logs/client/error.log  
  41. log4j.appender.errorfile.DatePattern='.'yyyyMMdd  
  42. log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout  
  43. log4j.appender.errorfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  44.   
  45.   
  46. #profile  
  47. log4j.appender.profile=org.apache.log4j.DailyRollingFileAppender   
  48. log4j.appender.profile.file=./logs/client/profile.log  
  49. log4j.appender.profile.DatePattern='.'yyyyMMdd-HH  
  50. log4j.appender.profile.layout=org.apache.log4j.PatternLayout  
  51. log4j.appender.profile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %m%n  
  52.   
  53. #serviceStats  
  54. log4j.appender.serviceStatsLog=org.apache.log4j.DailyRollingFileAppender  
  55. log4j.appender.serviceStatsLog.file=./logs/client/serverserviceStatsLog.log  
  56. log4j.appender.serviceStatsLog.DatePattern='.'yyyyMMdd  
  57. log4j.appender.serviceStatsLog.layout=org.apache.log4j.PatternLayout  
  58. log4j.appender.serviceStatsLog.layout.ConversionPattern=%-d{HH:mm:ss} %m%n  

启动ClientStart.java



现在已经调通了,我们再看看motan-manager:


好了,到此为此,一个简单的motan demo已经搭建好了~


完整的项目截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值