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服務調用端。兩個項目的依賴基本上一樣的:
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><motan.version>0.2.1</motan.version></properties><dependencies><dependency><groupId>com.weibo</groupId><artifactId>motan-core</artifactId><version>${motan.version}</version></dependency><dependency><groupId>com.weibo</groupId><artifactId>motan-transport-netty</artifactId><version>${motan.version}</version></dependency><dependency><groupId>com.weibo</groupId><artifactId>motan-registry-zookeeper</artifactId><version>${motan.version}</version></dependency><dependency><groupId>com.weibo</groupId><artifactId>motan-springsupport</artifactId><version>${motan.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.4.RELEASE</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.5.8</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.5.8</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency></dependencies>
服務提供端motan-provider的編寫
1)我們寫一個簡單的介面HelloService:
package com.bazinga.study.motan.rpc.service;public interface HelloService { public String hello(String str);}HelloSerivce簡單的實作類別HelloServiceImpl:
package com.bazinga.study.motan.rpc.service;public class HelloServiceImpl implements HelloService { public String hello(String str) { return "hello " + str; } }
然後在src/main/resources下配置spring-motan-provider.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:motan="http://api.weibo.com/schema/motan" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd"> <!-- spring管理的服務具體實現 --> <bean id="serviceImpl" class="com.bazinga.study.motan.rpc.service.HelloServiceImpl" /> <!-- 註冊中心的配置 --> <motan:registry regProtocol="zookeeper" name="zkRegistry" address="127.0.0.1:2181" connectTimeout="2000"/> <!-- 協議配置。為防止多個業務配置衝突,推薦使用id表示具體協議。--> <motan:protocol id="demoMotan" default="true" name="motan" maxServerConnection="80000" maxContentLength="1048576" maxWorkerThread="800" minWorkerThread="20"/> <!-- 服務的預設配置 group:識別服務的分組 module:標識模組資訊 registry:標識service使用的註冊中心,與motan:registry中的name對應 --> <motan:basicService export="demoMotan:8002" group="lyncc-motan-demo-rpc" accessLog="true" shareChannel="true" module="motan-demo-rpc" application="myMotanDemo" registry="zkRegistry" id="serviceBasicConfig"/> <!-- 要暴露的服務,唯一標識是integerface --> <motan:service interface="com.bazinga.study.motan.rpc.service.HelloService" ref="serviceImpl" export="demoMotan:8001" basicService="serviceBasicConfig" /> </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:
package com.bazinga.study.motan.rpc.quickstart;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.weibo.api.motan.common.MotanConstants;import com.weibo.api.motan.util.MotanSwitcherUtil;public class ProviderStarter { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-motan-provider.xml"); MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true); System.out.println("server start..."); }}啟動該類:
此時再開啟motan-manager的管理頁面:
可以查詢到我們剛才註冊好的服務,並且可以看到Server的服務者的個數是1個,我們開始編寫motan-client的編寫:
1)先把motan-provider端的HelloSerivce介面複製到motan-client,package的目錄也要一樣,因為介面的絕對路徑被認為服務的唯一標識
2)在motan-client的src/main/resources檔案夾下建立檔案spring-motan-client.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:motan="http://api.weibo.com/schema/motan" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd"> <motan:registry regProtocol="zookeeper" name="registry" address="127.0.0.1:2181"/> <!-- motan協議配置 --> <motan:protocol default="true" name="motan" haStrategy="failover" loadbalance="roundrobin" maxClientConnection="10" minClientConnection="2"/> <!-- 通用referer基礎配置 --> <motan:basicReferer requestTimeout="200" accessLog="true" retries="2" group="lyncc-motan-demo-rpc" module="motan-demo-rpc" application="myMotanDemo" protocol="motan" registry="registry" id="motantestClientBasicConfig" throwException="false" check="true"/> <motan:referer id="remoteService" interface="com.bazinga.study.motan.rpc.service.HelloService" connectTimeout="300" requestTimeout="300" basicReferer="motantestClientBasicConfig"/> </beans>
3)編寫啟動類:
package com.bazinga.study.motan.rpc.quickstart;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.bazinga.study.motan.rpc.service.HelloService;public class ClientStart { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring-motan-client.xml"); HelloService service = (HelloService) ctx.getBean("remoteService"); for(int i = 0;i< 50;i++){ System.out.println(service.hello("motan " + i)); } }}
4)log4j.properties
log4j.rootLogger=warnlog4j.logger.info=info,infofilelog4j.logger.warn=warn,warnfilelog4j.logger.error=error,errorfilelog4j.logger.profile=info,profilelog4j.logger.trace=trace,tracefilelog4j.logger.accessLog=debug,accessfilelog4j.logger.serviceStatsLog=info,serviceStatsLoglog4j.appender.tracefile=org.apache.log4j.DailyRollingFileAppender log4j.appender.tracefile.file=./logs/client/trace.loglog4j.appender.tracefile.DatePattern='.'yyyyMMddlog4j.appender.tracefile.layout=org.apache.log4j.PatternLayoutlog4j.appender.tracefile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%nlog4j.appender.accessfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.accessfile.file=./logs/client/access.loglog4j.appender.accessfile.DatePattern='.'yyyyMMddlog4j.appender.accessfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.accessfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%nlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%p %d{yy/MM/dd HH:mm:ss} %-50.50c(%L) - %m%nlog4j.appender.infofile=org.apache.log4j.DailyRollingFileAppender log4j.appender.infofile.file=./logs/client/info.loglog4j.appender.infofile.DatePattern='.'yyyyMMdd-HHlog4j.appender.infofile.layout=org.apache.log4j.PatternLayoutlog4j.appender.infofile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%nlog4j.appender.warnfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.warnfile.file=./logs/client/warn.loglog4j.appender.warnfile.DatePattern='.'yyyyMMddlog4j.appender.warnfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.warnfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%nlog4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.errorfile.file=./logs/client/error.loglog4j.appender.errorfile.DatePattern='.'yyyyMMddlog4j.appender.errorfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.errorfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n#profilelog4j.appender.profile=org.apache.log4j.DailyRollingFileAppender log4j.appender.profile.file=./logs/client/profile.loglog4j.appender.profile.DatePattern='.'yyyyMMdd-HHlog4j.appender.profile.layout=org.apache.log4j.PatternLayoutlog4j.appender.profile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %m%n#serviceStatslog4j.appender.serviceStatsLog=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.serviceStatsLog.file=./logs/client/serverserviceStatsLog.loglog4j.appender.serviceStatsLog.DatePattern='.'yyyyMMddlog4j.appender.serviceStatsLog.layout=org.apache.log4j.PatternLayoutlog4j.appender.serviceStatsLog.layout.ConversionPattern=%-d{HH:mm:ss} %m%n
啟動ClientStart.java
現在已經調通了,我們再看看motan-manager:
好了,到此為此,一個簡單的motan demo已經搭建好了~
完整的項目截圖: