EOSPlatform+Dubbo+Zookeeper最佳實踐

  • 摘要:隨着分佈式服務框架的流行,許多公司都引入了業界流行的分佈式服務框架,本文介紹如何使用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無縫結合完成。

     

    查看控制檯能夠看到服務消費者信息以下:

     

  • 核心技術:Maven,Springmvc mybatis shiro, Druid, Restful, Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx 
    1.     項目核心代碼結構截圖

    分佈式框架介紹 - kafkaee - kafkaee的博客

       項目模塊依賴分佈式框架介紹 - kafkaee - kafkaee的博客

    特別提醒:開發人員在開發的時候能夠將本身的業務REST服務化或者Dubbo服務化

    2.    項目依賴介紹

       2.1 後臺管理系統、Rest服務系統、Scheculer定時調度系統依賴以下圖:
     

    分佈式框架介紹 - kafkaee - kafkaee的博客

           2.2 Dubbo獨立服務項目依賴以下圖:

     分佈式框架介紹 - kafkaee - kafkaee的博客

    3.  項目功能部分截圖:

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客
     

    zookeeper、dubbo服務啓動 

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客
     

    dubbo管控臺 

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     REST服務平臺

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

     

    分佈式框架介紹 - kafkaee - kafkaee的博客

相關文章
相關標籤/搜索