1. 程式人生 > >關於Maven+Springmvc+Dubbo+Zookeeper整合

關於Maven+Springmvc+Dubbo+Zookeeper整合

為什麼要用dubbo?   還是讓官方來解釋吧: http://dubbo.io/User+Guide-zh.htm    http://dubbo.io/   一般 nginx+tomcat          | ----> Controller1--------->service1 請求----->nginx  |          |----->Controller2--------->service2 請求進了Controller 就只有一條路可以走了   使用dubbo後               | ------->service1 請求------>Controller---->   |               |---------->service2 簡單的說 也就是 一個Contoller 我可以部署多個 service   。   一般的mvc專案 包含 Controller、Servicei、ServiceImpl、dao三層 使用doubbo我們可以把專案拆分: Controller 作為 “消費著” 一個專案 ServiceImpl +dao 作為 “提供者” 一個專案 Servicei “介面” 可以作為一個專案 我們可以部署多個“提供著”。。。。。。。。。。。。。。。。。。。   Zookeeper作為Dubbo服務的註冊中心,Dubbo原先基於資料庫的註冊中心,沒采用Zookeeper,Zookeeper一個分散式的服務框架,是樹型的目錄服務的資料儲存,能做到叢集管理資料 ,這裡能很好的作為Dubbo服務的註冊中心,Dubbo能與Zookeeper做到叢集部署,當提供者出現斷電等異常停機時,Zookeeper註冊中心能自動刪除提供者資訊,當提供者重啟時,能自動恢復註冊資料,以及訂閱請求。我們先在linux上安裝Zookeeper,我們安裝最簡單的單點 Windons 安裝Zookeeper   1,Zookeeper 官網下載windons 版本,(不會下載百度) 單機安裝非常簡單,只要獲取到 Zookeeper 的壓縮包並解壓到某個目錄如
  開啟目錄機構為:     Zookeeper 的啟動指令碼在 bin 目錄下,Windows 下的啟動指令碼是 zkServer.cmd。   在你執行啟動指令碼之前,還有幾個基本的配置項需要配置一下,Zookeeper 的配置檔案在 conf 目錄下,這個目錄下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是將 zoo_sample.cfg 改名為 zoo.cfg,因為 Zookeeper 在啟動時會找這個檔案作為預設配置檔案。下面詳細介紹一下,這個配置檔案中各個配置項的意義。
  開啟以後  
1 2 3 4 5 6 7 8 9 10 11 12 # The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. dataDir=/tmp/zookeeper # the port at which the clients will connect clientPort=2181

  

  • tickTime:這個時間是作為 Zookeeper 伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
  • dataDir:顧名思義就是 Zookeeper 儲存資料的目錄,預設情況下,Zookeeper 將寫資料的日誌檔案也儲存在這個目錄裡。
  • clientPort:這個埠就是客戶端連線 Zookeeper 伺服器的埠,Zookeeper 會監聽這個埠,接受客戶端的訪問請求。
二.dubbo-admin。 dubbo管控臺的安裝 下載地址  http://dubbo.io/Download-zh.htm 下載 dubbo-admin-2.5.3.war   解壓之後: 修改 META-INF/dubbo.properties檔案
1 2 3 dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest

address:zookeeper 的ip地址 後面是埠號  ,和zookeeper中配置的埠號一樣

修改完成後需要一個tomcat   開啟tomcat     \webapps\ROOT 目錄 ,此目錄放置的是tomcat的首頁,刪除所有的檔案,將解壓後修改好的所有的dubbo-admin 裡的檔案複製到 \webapps\ROOT中,

 

此時我們已經配置好了。現在可以啟動tomcat了 (主意:在啟動tomcat之前要先啟動zookeeper ,啟動zookeeper前面有介紹)。 啟動tomcat之後 在瀏覽器輸入 http://localhost:8080  (我的是8083) 進入dubbo管控臺的主頁

(備註:使用jdk1.8 tomcat啟動可能會出錯  有關 URI。。。。 的錯誤。我最後換成1.7了)

使用者名稱和密碼就是dubbo.properties 中配置的 預設的是 使用者名稱 :root, 密碼:root 

輸入使用者名稱和密碼之後 進入首頁           

 

 當然現在還沒有 消費者 和 提供者    現在我們來開發   消費者  和 提供者     配置 好 zookeeper之後 搭建 maven+springmvc+dubbo環境   新建3個maven專案 1,test-dubbo-provider ,java專案,作為提供者,serviceImpl 和dao 層 2,test-public-interface ,java專案,存放公共的介面 ,servicei        是service的介面  (備註:1要依賴2,  3也要依賴2) 3,test-web-consumer,web專案,存放 Controller 和 頁面    首先我們來開發 服務的提供者也就是 test-dubbo-provider ,目錄結構為 ApplicationContent-dubbo.xml        dubbo服務的配置檔案(名字隨意)     (待會再介紹) ApplicationContent.xml       spring的配置檔案 這兩個配置檔案 必須要放到 MATE-INF/spring/下面 (原因後面再說)   UserServiceImpl.java  藉口的實現類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package  com.cl.user.serviceImpl;   import  org.springframework.stereotype.Service;   import  com.cl.user.servicei.UserService;   @Service ( "userService" ) public  class  UserServiceImpl  implements  UserService{        @Override      public  String sayHello() {                    System.out.println( "hello world----------------------------" );                    return  "hello world" ;                } }
  有了 實現類 還需要介面  也就是專案test-public-interface      這個專案很簡單 只需要 介面 就行了
1 2 3 4 5 6 package  com.cl.user.servicei;   public  interface  UserService {      public  String sayHello();   }

當然 專案 1 要 依賴 專案 2  

所以在1 的 pom.xml 中 有

 

複製程式碼
1 <dependency>
2             <groupId>test-web</groupId>
3             <artifactId>test-pubilc-interface</artifactId>       加入專案2依賴
4             <version>0.0.1-SNAPSHOT</version>
5             <scope>test</scope>
6 </dependency>
複製程式碼

那麼 1 中的 UserServiceImpl 就可以實現 UserService介面

 當然我們用到 dubbo 就要有dubbo的核心jar包  所以在1 的 pom.xml 中 有
1 <dependency>
2     <groupId>com.alibaba</groupId> 
3     <artifactId>dubbo</artifactId>
4     <version>2.5.3</version>
5 </dependency>

還要有 zookeeper的  所以在1 的 pom.xml 中 有

1 <dependency>
2         <groupId>org.apache.zookeeper</groupId>
3         <artifactId>zookeeper</artifactId>
4         <version>3.3.3</version>
5 </dependency>

下面介紹一下專案1 中 的 ApplicationContent-dubbo.xml   和  ApplicationContent.xml 

  ApplicationContent.xml  主要是spring的配置 不多說。
1 <!-- 啟動元件掃描,排除@Controller元件,該元件由SpringMVC配置檔案掃描 -->
2     <context:component-scan base-package="com.cl.user.serviceImpl"/>

ApplicationContent-dubbo.xml   dubbo服務的配置

  複製程式碼
 1     <!-- 提供方應用資訊,用於計算依賴關係 -->
 2     <dubbo:application name="hehe_provider" />
 3     <!-- 使用zookeeper註冊中心暴露服務地址   埠是zookeeper 中配置的2181-->
 4     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
 5     <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
 6     <!-- 用dubbo協議在20880埠暴露服務 -->
 7     <dubbo:protocol name="dubbo" port="20880" />
 8     <!-- 具體的實現bean -->
 9     <bean id="userService" class="com.cl.user.serviceImpl.UserServiceImpl" />
10     <!-- 宣告需要暴露的服務介面 -->
11     <dubbo:service interface="com.cl.user.servicei.UserService" ref="userService" />
複製程式碼

 主意:有可能你的配置檔案中不識別 <dubbo:>  去網上找解決的辦法

 

到這裡我們的  “提供者” 即 服務   已經開發完了,那麼如何啟動服務呢?  在專案1中有個start.java 

複製程式碼
 1 package com.test;
 2 
 3 import org.apache.log4j.PropertyConfigurator;
 4 
 5 public class start {
 6      static{  
 7             PropertyConfigurator.configure("src/main/resources/log4j.properties");  
 8         }  
 9     public static void main(String[] args) {
10         
11         com.alibaba.dubbo.container.Main.main(args);
12     }
13 }
複製程式碼

 主意裡面有main方法,可以直接執行啟動了。別急!!! 之前還有個問題就是為什   ApplicationContent-dubbo.xml   和  ApplicationContent.xml    這兩個配置檔案 必須要放到 /MATE-INF/spring/下面

因為  com.alibaba.dubbo.container.Main.main(args)  預設就會去載入 /MATE-INF/spring/ 下的配置檔案

我們來看一下原始碼

 看完原始碼 這下明白為什麼了吧!!!!!!!!!!!!!!!!!   啟動服務後  我們在 dubbo-admin中就能看到我們剛才開發的的  “提供者”       192.168.56.1 是本地區域網 地址   這是 “提供者”  此時還沒有“消費者”   接下來我們就要開發 “消費者”   test-web-consumer        UserController.java 複製程式碼
@Controller
public class UserController {
    
    @Resource(name="userService")
    private UserService userService;
    
    
    @RequestMapping("/hello/test/world")
    public void sayHello(){
        System.out.println(userService.sayHello()+"**************************");
    }
}
複製程式碼

ApplicationContext-mvc.xml 都是springmvc的配置 如下不解釋了

複製程式碼
<mvc:annotation-driven/>
    <mvc:default-servlet-handler/>
    <context:component-scan base-package="com" />
    
    
    <!-- 對靜態資原始檔的訪問  restful-->     
    <mvc:resources mapping="/js/**" location="/js/" />
    <mvc:resources mapping="/lib/**" location="/lib/" />
    <mvc:resources mapping="/plugins/**" location="/plugins/" />
    <mvc:resources mapping="/uploadFiles/**" location="/uploadFiles/" /> 
    <mvc:resources mapping="/WEB-INF/html/**" location="/WEB-INF/html/" /> 
     
    <!-- 配置SpringMVC的檢視解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/html"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!-- 上傳攔截,如最大上傳值及最小上傳值 -->
      <bean id="multipartResolver"   class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >   
          <property name="maxUploadSize">    
              <value>104857600</value>    
           </property>   
            <property name="maxInMemorySize">    
                <value>4096</value>    
            </property>   
             <property name="defaultEncoding">    
                <value>utf-8</value>    
            </property> 
    </bean>  
複製程式碼

ApplicationContext-dubbo.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:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方一樣 -->  
    <dubbo:application name="hehe_consumer" />  
  
    <!-- 使用zookeeper註冊中心暴露服務地址 -->  
   
     <dubbo:registry address="zookeeper://127.0.0.1:2181" /> 
    
    <!-- 組播註冊 -->
   <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
  
    <!-- 生成遠端服務代理,可以像使用本地bean一樣使用userService -->  
    <dubbo:reference id="userService"    interface="com.cl.user.servicei.UserService" />
</beans>
複製程式碼

 開發完消費者後 ,啟動消費者,可以在管控臺看到

 

 完了!!      Dubbo更多詳細的東西還去官網的使用者手冊尋找吧!!   http://dubbo.io/User+Guide-zh.htm    http://dubbo.io/    使用者手冊說的挺詳細的!這裡僅供參考!   最後 ,在開發的時候為了方便,我們可以使用組播註冊!
 <!-- 組播註冊 -->
   <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->