Zookeeper+Dubbox 環境搭建日記

第一章:Dubbox簡介

 

Dubbox是一個開源的RPC(Remote ProcedureCall Protocol)遠程調用框架,是由dangdang對阿里的Dubbo的升級,可以被視爲Dubbo的增強版,基本架構沒有變動,升級spring2.x到spring3.x,支持restful風格的調用調試方式,豐富了序列化的方式,提高了序列化的性能。

 

Dubbox的Github官網:

https://github.com/dangdangdotcom/dubbox



第二章 環境搭建(基於註冊中心是Zookeeper的搭建)

  

2.1 dubbo-admin控制檯的安裝

 

2.1.1打開dubbox的官網https://github.com/dangdangdotcom/dubbox

點擊Clone or download 我們選擇最原始的Download ZIP,當前的stable版本是2.8.4

2.1.2下載到某個文件夾下,解壓文件夾:

2.1.3 解壓dubbox-master.zip

2.1.4按住鍵盤shift 鼠標右擊,選擇命令窗口,進入maven編譯 :

mvn install -Dmaven.test.skip=true

編譯安裝大概需要4~5分鐘,編譯安裝成功之後顯示如下:

好了,到此爲止,dubbox2.8.4就算是編譯成功了,接下來我們要先搭建dubbox的控制檯,因爲可視化是我們最喜歡的模式了

 

2.1.5進入剛纔的文件夾D:\dubboxstudy\dubbox-master\dubbo-admin\target

找到dubbo-admin-2.8.4.war文件,因爲這是一個war文件,所以我們就使用tomcat啓動,下載apache-tomcat-7.0.40-windows-x64.zip到我們dubbox study目錄

解壓apache-tomcat.zip,然後將剛纔的dubbo-admin-2.8.4.war複製到D:\dubboxstudy\apache-tomcat-7.0.40\webapps文件夾下

因爲dubbo的註冊中心和管理控制檯是依賴zookeeper,所以我們在測試環境下,需要啓動一個zookeeper的實例,關於zookeeperwindow環境下的搭建就不贅述了,詳細參考:

http://blog.csdn.net/morning99/article/details/40426133


2.1.6啓動dubbo-admin控制檯之前,先啓動一個zookeeper實例(因爲只是測試,所以就啓動zookeeper集羣了):


2.1.7啓動tomcat,進入D:\dubbox study\apache-tomcat-7.0.40\bin,雙擊startup.bat

上圖表示啓動成功,啓動成功之後,我們會發現D:\dubbox study\apache-tomcat-7.0.40\webapps下多了一個文件夾dubbo-admin-2.8.4,進入

D:\dubboxstudy\apache-tomcat-7.0.40\webapps\dubbo-admin-2.8.4\WEB-INF,打開dubbo.properties:


可以看到dubbo默認的註冊機制是zookeeper,地址也是本地地址:127.0.0.1:2181,假如你此時zookeeper的實例的地址不是127.0.0.1:2181,或者註冊機制是Redis的話,需要修改dubbo.properties的配置,此處就不做修改了

 

 

2.1.8打開瀏覽器。輸入http://localhost:8080/dubbo-admin-2.8.4/,賬戶密碼是root/root.就可以看到頁面了

2.2 dubbo的Provider/Consumer 消費者和提供者的Demo代碼編寫

 

2.2.1環境準備JDK1.7 +Eclipse(STS) + Maven3.x

 

 

2.2.2新建WorkingSet

點擊finish:

2.2.3新建maven項目

建好之後的目錄結構:

2.2.4在bazinga-provider和bazinga-consumer的pom.xml中引入dubbox的依賴(暫時使用2.8.3的依賴,相對簡單一點):

[html] view plain copy
  1. <properties>  
  2.         <dubbox.version>2.8.3</dubbox.version>  
  3.         <slf4j.version>1.7.5</slf4j.version>  
  4.         <zookeeper.version>3.4.6</zookeeper.version>  
  5.     </properties>  
  6.     <dependencies>  
  7.         <dependency>  
  8.             <groupId>com.alibaba</groupId>  
  9.             <artifactId>dubbo</artifactId>  
  10.             <version>${dubbox.version}</version>  
  11.         </dependency>  
  12.         <dependency>  
  13.             <groupId>org.slf4j</groupId>  
  14.             <artifactId>slf4j-api</artifactId>  
  15.             <version>${slf4j.version}</version>  
  16.         </dependency>  
  17.         <dependency>  
  18.             <groupId>org.apache.zookeeper</groupId>  
  19.             <artifactId>zookeeper</artifactId>  
  20.             <version>${zookeeper.version}</version>  
  21.             <exclusions>  
  22.                 <exclusion>  
  23.                     <groupId>io.netty</groupId>  
  24.                     <artifactId>netty</artifactId>  
  25.                 </exclusion>  
  26.                 <exclusion>  
  27.                     <groupId>org.slf4j</groupId>  
  28.                     <artifactId>slf4j-api</artifactId>  
  29.                 </exclusion>  
  30.                 <exclusion>  
  31.                     <groupId>log4j</groupId>  
  32.                     <artifactId>log4j</artifactId>  
  33.                 </exclusion>  
  34.                 <exclusion>  
  35.                     <groupId>org.slf4j</groupId>  
  36.                     <artifactId>slf4j-log4j12</artifactId>  
  37.                 </exclusion>  
  38.                 <exclusion>  
  39.                     <groupId>jline</groupId>  
  40.                     <artifactId>jline</artifactId>  
  41.                 </exclusion>  
  42.             </exclusions>  
  43.         </dependency>  
  44.         <dependency>  
  45.             <groupId>org.slf4j</groupId>  
  46.             <artifactId>slf4j-api</artifactId>  
  47.             <version>${slf4j.version}</version>  
  48.         </dependency>  
  49.         <dependency>  
  50.             <groupId>com.101tec</groupId>  
  51.             <artifactId>zkclient</artifactId>  
  52.             <version>0.2</version>  
  53.         </dependency>  
  54.         <dependency>  
  55.             <groupId>ch.qos.logback</groupId>  
  56.             <artifactId>logback-classic</artifactId>  
  57.             <version>1.0.13</version>  
  58.         </dependency>  
  59.     </dependencies>  

2.2.5在bazinga-provider編寫調用接口IDemoService:

[java] view plain copy
  1. package org.bazinga.service;  
  2.   
  3. public interface IDemoService {  
  4.       
  5.     public String sayHello();  
  6.   
  7. }  
具體的實現:

[java] view plain copy
  1. package org.bazinga.service.impl;  
  2.   
  3. import org.bazinga.service.IDemoService;  
  4.   
  5. public class IDemoServiceImpl implements IDemoService {  
  6.   
  7.     public String sayHello() {  
  8.         return "hello dubbox";  
  9.     }  
  10.   
  11. }  

2.2.6在src/main/resources下配置dubbo基於Spring的配置文件spring-dubbo-provider.xml,在這裏需要配置註冊中心的地址,通信的協議方式,服務提供者的應用名,最後就是最關鍵的需要暴露的服務,我們這裏就是

[html] view plain copy
  1. <?xml version="1.1" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans    
  5.        http://www.springframework.org/schema/beans/spring-beans.xsd    
  6.        http://code.alibabatech.com/schema/dubbo    
  7.        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  8.          
  9.     <dubbo:application owner="lyncc" name="bazinga-app" />  
  10.     <!--zookeeper註冊中心 -->  
  11.     <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>   
  12.       
  13.     <dubbo:protocol name ="dubbo" port="20880" />  
  14.     <!-- 發佈這個服務 -->  
  15.     <dubbo:service  protocol="dubbo"  timeout="4000" connections="100" interface ="org.bazinga.service.IDemoService" ref="demoService" />         
  16.     <!-- 和本地bean一樣實現服務 -->  
  17.     <bean id="demoService" class="org.bazinga.service.impl.IDemoServiceImpl" />  
  18.       
  19. </beans>  

細心的你會發現左側有報錯的提示:

這個報錯是因爲不識別dubbo的命名空間,所以需要導入xsd文件,dubbo.xsd文件源碼中有,網上也可以下載到,下載好或者在源碼中找到之後,選擇Windw->Perferences->XML->XMLCatelog->User Specifed Entries

點擊add,點擊FileSystem 選擇你下載好的dubbo.xsd,輸入key值,key值要與schema值一樣,點擊OK:

一路保存剛纔的設置,重新打開spring-dubbo-provider.xml文件,可以發現報錯消失。到此爲止,dubbox的服務提供者端的代碼已經編寫完畢,我們寫個測試類測試一下:

[java] view plain copy
  1. package org.bazinga.service.test;  
  2.   
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  4.   
  5. public class DubboxProviderDemoService {  
  6.   
  7.     public static void main(String[] args) throws InterruptedException {  
  8.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
  9.                 "spring-dubbo-provider.xml");  
  10.         context.start();  
  11.         Thread.sleep(2000000l);  
  12.     }  
  13.   
  14. }  

啓動main函數之後,會發現dubbo-admin的控制檯中提供者發現了該服務:



2.2.7服務提供者模塊的編寫,服務消費者只要有服務的接口就可以了,把服務提供者的接口複製到bazinga-consumer項目的同一個package下,注意必須放在同一個package下,也就是說服務消費者和服務提供者的接口的路徑必須完全相同,因爲這是服務的唯一標識,是一一對應的:



2.2.8服務消費端dubbo的配置文件的編寫spring-dubbo-consumer.xml,因爲dubbo具有服務自動發現的功能,所以我們這邊只需要配置註冊中心,服務消費者的名字,和需要訂閱的服務接口信息,如下:

[html] view plain copy
  1. <?xml version="1.1" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans    
  5.        http://www.springframework.org/schema/beans/spring-beans.xsd    
  6.        http://code.alibabatech.com/schema/dubbo    
  7.        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  8.          
  9.     <dubbo:application owner="lyncc" name="bazinga-consumer" />  
  10.     <!--zookeeper註冊中心 -->  
  11.     <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>   
  12.       
  13.     <dubbo:reference id="demoService" interface="org.bazinga.service.IDemoService"/>   
  14.       
  15. </beans>   

2.2.9編寫測試類DubboConsumerDemoService:

[java] view plain copy
  1. package org.bazinga.service.test;  
  2.   
  3. import org.bazinga.service.IDemoService;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class DubboConsumerDemoService {  
  7.   
  8.     public static void main(String[] args) throws InterruptedException {  
  9.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
  10.                 "spring-dubbo-consumer.xml");  
  11.         context.start();  
  12.         IDemoService demoService = (IDemoService)context.getBean("demoService");  
  13.         System.out.println(demoService.sayHello());  
  14.         Thread.sleep(2000000l);  
  15.     }  
  16.   
  17. }  

先運行DubboxProviderDemoService的情況下,啓動DubboConsumerDemoService的main函數,運行結果:



同時控制檯admin頁面也會顯示消費者的信息:


好了,到此爲止,最簡單的Dubbo的Helloworld搭建完畢

 

 

2.3 本章小結

 

  本章簡單的搭建了一個Dubbo的Demo,配置了dubbo-admin控制頁面平臺,編寫了一個簡單的Hello World,服務提供者向zookeeper註冊中心註冊服務,服務消費者從註冊中心訂閱服務,發現服務的暴露地址,完成遠程調用,下一個章節,我們稍微深入體驗一下dubbo給我們帶來的豐富的RPC的一些特性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章