摘要:隨着分佈式服務框架的流行,許多公司都引入了業界流行的分佈式服務框架,本文介紹如何使用EOSPlatform+Dubbo+Zookeeper實現分佈式服務的開發與運行。java
1 環境準備web
1.1 環境選擇spring
EOSPlatform 6.7.1apache
Zookeeper 3.4.5api
Dubbo 2.5.3瀏覽器
Tomcat 5.5.27tomcat
1.2 搭建Zookeeper環境服務器
下載zookeeper-3.4.5.tar.gz解壓到自定義目錄中,以下圖:mybatis
打開conf目錄,將文件zoo_sample.cfg重命名爲zoo.cfg。mvc
打開bin目錄,用UE打開zkServer.cmd修改以下代碼。
setlocal call "%~dp0zkEnv.cmd" set JAVA_HOME=D:\Primeton\JDK1.6 set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain echo on %JAVA_HOME%\bin\java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %* endlocal
1.3 搭建服務監控平臺環境
下載dubbo-admin-2.5.3.war,部署到Tomcat5.5.27的應用目錄中,路徑以下:****\apache-tomcat-5.5.27\webapps\;
1.4 控制檯啓動運行
先啓動zookeeper,再啓動tomcat服務器。
經過瀏覽器訪問dubbo-admin應用,用戶名/密碼(root/root)
以下所示:
內存與註冊中心都運行正常說明環境準備完成。
2 EOSPlatform擴展開發
2.1 修復EOS產品中Spring容器的BUG
com.primeton.spring.context.ExtendParentApplicationContext.java中有以下兩個方法: /* (non-Javadoc) * @see org.springframework.beans.factory.ListableBeanFactory#getBeansOfType(java.lang.Class) */ public Map getBeansOfType(Class type) throws BeansException { return new HashMap();//防止空指針異常 } /* (non-Javadoc) * @see org.springframework.beans.factory.ListableBeanFactory#getBeansOfType(java.lang.Class, boolean, boolean) */ public Map getBeansOfType(Class type, boolean includePrototypes, boolean allowEagerInit) throws BeansException { return new HashMap();//防止空指針異常 }
紅色部分爲修改內容,原先返回null值,會致使空指針異常。
2.2 增長啓動時開啓Spring容器
增長一個啓動監聽類:SpringContextStartupListener,內容以下:
/** * * 因爲分佈式服務框架須要初始化Spring容器用於發佈訂閱服務,所以加入啓動過程 * * @author yujl ( yujl+@primeton.com+) */ public class SpringContextStartupListener implements IRuntimeListener { /* (非 Javadoc) * @see com.eos.runtime.core.IRuntimeListener#start(com.eos.runtime.core.RuntimeEvent) */ public void start(RuntimeEvent arg0) { ApplicationContextFactory._getContext_();//預先初始化Spring容器 } /* (非 Javadoc) * @see com.eos.runtime.core.IRuntimeListener#stop(com.eos.runtime.core.RuntimeEvent) */ public void stop(RuntimeEvent arg0) { } }
將SpringContextStartupListener添加到handler-startup.xml文件的結尾部分,以下圖所示:
<!- 初始化Spring 容器->
<handler handle-class="com.primeton.spring.context.runtime.SpringContextStartupListener" />
2.3 補充Zookeeper和Dubbo相關jar文件
netty-3.2.5.Final.jar
dubbo-2.5.3.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
zkclient-0.1.jar
zookeeper-3.4.5.jar
將上述jar包放入EOS應用的\WEB-INF\lib目錄下。
PS:後面提到的服務提供者應用和服務消費者應用都須要添加Jar包和配置啓動文件。
此時EOSPlatform擴展開發完畢。
3 服務提供者示例開發
新建一個EOS項目(項目名稱爲ProjectProvicer)對應應用爲(default_provider);新建一個構件包(名稱爲:com.primeton.dubbo.provider):
在構件包中新建一個接口示例和一個實現的示例以下:
package com.primeton.dubbo.provider;
4 服務消費者示例開發
新建一個EOS項目(項目名稱爲ProjectConsumer)對應的應用名稱爲(default_consumer);新建一個構件包(名稱爲com.primeton.dubbo.consumer),以下圖所示:
首先須要引入服務提供方接口DemoService;
而後增長一個SpringBean用於封裝DemoService接口,代碼以下:
public class TestDubboAction { private DemoService demoServiceDL; public String sayHello(String input){ if(demoServiceDL != null){ return demoServiceDL.testHelloWorld(input); } return ""; } public DemoService getDemoServiceDL() { return demoServiceDL; } public void setDemoServiceDL(DemoService demoServiceDL) { this.demoServiceDL = demoServiceDL; } }
此類不作任何工做,只是調用DemoService接口。
Spring配置文件修改以下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sca="http://www.springframework.org/schema/sca" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/sca http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方同樣 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast廣播註冊中心暴露發現服務地址 先屏蔽註冊中心,經過直連實現 <dubbo:registry address="multicast://224.5.6.7:1234" />--> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 生成遠程服務代理,能夠和本地bean同樣使用demoService --> <dubbo:reference id="demoService" interface="com.primeton.dubbo.provider.DemoService"/> <bean id="testDubboAction" class="com.primeton.dubbo.consumer.TestDubboAction"> <!-- 和本地服務同樣使用遠程服務 --> <property name="demoServiceDL" ref="demoService" /> </bean> </beans>
經過Spring配置,將遠程服務demoService注入到TestDubboAction中。
而後須要開發兩個頁面和一個頁面流用於調用上述TestDubboAction,具體相關代碼參考EOS幫助文檔中Spring的配置與開發。
至此,服務消費者也開發完成;經過導出構件包並部署到Tomcat的default_consumer應用當中。
運行服務消費者對應的Tomcat服務器,訪問以下頁面:
點擊 show Greeting按鈕,後臺經過頁面流首先進入TestDubboAction中,以下圖所示:
此時咱們能夠看到代碼堆棧爲:
Dubbo框架經過Spring配置封裝了一個DemoService實例,其實這是一個遠程調用的代理客戶端。
而後經過Dubbo的協議調用了遠端服務,服務方的調用棧爲:
服務方也屏蔽了協議的實現,經過代理間接調用了DemoServiceImple實例的testHelloWorld方法。
如此,Dubbo與EOSPlatform無縫結合完成。
查看控制檯能夠看到服務消費者信息以下:
特別提醒:開發人員在開發的時候能夠將本身的業務REST服務化或者Dubbo服務化
2. 項目依賴介紹
2.1 後臺管理系統、Rest服務系統、Scheculer定時調度系統依賴以下圖:
2.2 Dubbo獨立服務項目依賴以下圖: