Dubbo與Zookeeper在Window上的安裝與簡單使用

一:Dubbo是什麼?有什麼用途??

  使用Dubbo能夠將應用分佈到多個服務器上,當有訪問時,Dubbo有幫你管理自動將請求分配給合適獲得服務器去執行,即創建多個生產者,創建多個消費者,自動匹配生產者與消費者,以便達到負載均衡。關於集羣與負載均衡的一些概念的簡單解釋也能夠參考《大話集羣和負載均衡html

二:Dubbo與Zookeeper的安裝

1:官網 【https://www.apache.org/dyn/closer.cgi/zookeeper/ 】下載Zookeeper穩定版java

2:官網【  http://dubbo.apache.org/en-us/ 】去 github 下載穩定版,()git

2:解壓Zookeeper到目錄【D:\Zookeeper】修改目錄【D:\Zookeeper\zookeeper-3.4.12\zookeeper-3.4.12\conf】 下的【 zoo_sample.cfg 】文件爲【zoo.cfg】github

3:點擊【D:\Zookeeper\zookeeper-3.4.12\zookeeper-3.4.12\bin】目錄下的【 zkServer.cmd】啓動Zookeeper,顯示以下即成功web

4:參考《 solr服務器搭建與Tomact整合及使用 》配置一臺專門管理的Dubbo服務器算法

5:配置好後,將 Dubbo-admin的 war 包解壓放到你給Dubbo配置的服務器的根目錄下【D:\Tomact\apache-tomcat-8.0.53-dubbo\webapps\ROOT】war包能夠本身導入下載的Dubbo的maven文件生成。這是我生成的2.6.0版本的war包。連接:https://pan.baidu.com/s/1WHJKemdyLb8Sveq7a1PCuw 密碼:1w2wspring

6:而後啓動   Tomact-Dubbo   服務器,啓動時必定要保持Zookeeper開啓。而後等帶啓動成功。打開瀏覽器輸入你配置的端口apache

注意:第一次輸入的時候會讓你登錄,Dubbo默認的用戶名是root 密碼是rootjson

之後就能夠在這裏管理生產者和消費者了。api

 三:Dubbo的具體使用

Dubbo的主要做用就是幫助將服務發佈到集羣中,

1:Dubbo的執行過程:

官方手冊給出的架構如圖所示   http://dubbo.apache.org/en-us/docs/user/preface/architecture.html

0:服務容器負責啓動,加載,運行服務提供者

1:服務提供者在啓動時,向註冊中心註冊本身提供的服務,咱們採用的註冊中心就是Zookeeper。

2:服務消費者在啓動時,向註冊中心訂閱本身所需的服務。

3:註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。

4:服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。

5:服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

2:Dubbo分佈式在代碼中的體現:

採用分佈式的架構,對於代碼來講,咱們須要對代碼結構進行拆分,通常都使用Maven進行,能夠參考《  Maven的繼承與聚合——多模塊開發   》,拆分後每一部分基本內容不會改變,改變的是須要在每個拆分的單元中根據其須要加入須要的Dubbo成分,接下來就針對拆分後不一樣的角色進行實例:

3:Dubbo發佈服務:

即上述途中的步驟:1 即對於服務提供者

首先建立一個maven項目dubbo-demo-provider

pom.xml加入依賴:

 1 <dependencies>
 2     <dependency>
 3         <groupId>com.alibaba</groupId>
 4         <artifactId>dubbo</artifactId>
 5         <version>2.6.0</version>
 6     </dependency>
 7     <dependency>
 8         <groupId>com.101tec</groupId>
 9         <artifactId>zkclient</artifactId>
10         <version>0.10</version>
11     </dependency>
12     <dependency>
13         <groupId>org.apache.curator</groupId>
14         <artifactId>curator-framework</artifactId>
15         <version>4.0.1</version>
16     </dependency>
17     <dependency>
18         <groupId>com.alibaba</groupId>
19         <artifactId>fastjson</artifactId>
20         <version>1.2.46</version>
21     </dependency>
22     <dependency>
23         <groupId>log4j</groupId>
24         <artifactId>log4j</artifactId>
25         <version>1.2.17</version>
26     </dependency>
27     <dependency>
28         <groupId>org.slf4j</groupId>
29         <artifactId>slf4j-api</artifactId>
30         <version>1.7.25</version>
31     </dependency>
32     <dependency>
33         <groupId>org.apache.commons</groupId>
34         <artifactId>commons-lang3</artifactId>
35         <version>3.4</version>
36     </dependency>
37     <dependency>
38         <groupId>io.netty</groupId>
39         <artifactId>netty-all</artifactId>
40         <version>4.0.35.Final</version>
41     </dependency>
42 </dependencies>
pom.xml

而後定義一個服務接口: 

 1 package com.xqc.service;  2  
 3 /**
 4  * 服務提供者接口  5  *  6  */
 7 public interface DemoProviderService {  8  
 9     public String sayHello(String name); 10 }
DemoProviderService

再定義實現類

 1 package com.xqc.service.impl;  2  
 3 import com.xqc.service.DemoProviderService;  4  
 5 /**
 6  * 服務提供者接口實現類  7  *  8  */
 9 public class DemoProviderServiceImpl implements DemoProviderService{ 10  
11     public String sayHello(String name) { 12         return "服務  1 "; 13  } 14  
15 }
DemoProviderServiceImpl

配置Dubbo的配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3  xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 4  xmlns="http://www.springframework.org/schema/beans"
 5  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  6  http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 7  
 8     <!-- 提供方應用名稱, 用於計算依賴關係 -->
 9     <dubbo:application name="demo-provider"/>
10  
11     <!-- 使用zookeeper註冊中心暴露服務地址 -->
12     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
13  
14     <!-- 使用dubbo協議在20880端口暴露服務 -->
15     <dubbo:protocol name="dubbo" port="20880"/>
16  
17     <!-- service實現類做爲本地的一個bean -->
18     <bean id="demoProviderService" class="com.xqc.service.impl.DemoProviderServiceImpl"/>
19  
20     <!-- 聲明須要暴露的服務接口 -->
21     <dubbo:service interface="com.xqc.service.DemoProviderService" ref="demoProviderService"/>
22      
23  
24 </beans>

編寫測試類:

 1 import java.io.IOException;  2  
 3 import org.springframework.context.support.ClassPathXmlApplicationContext;  4  
 5 public class ProviderTest {  6  
 7     public static void main(String[] args) {  8         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-demo-provider.xml"});  9  context.start(); 10         System.out.println("服務提供者註冊成功(端口:20880)"); 11         try { 12  System.in.read(); 13         } catch (IOException e) { 14             // TODO Auto-generated catch block
15  e.printStackTrace(); 16  } 17  context.close(); 18  } 19 }
ProviderTest

而後啓動Zookeeper,運行測試類,便可發佈服務到Zookeeper註冊中心去。

查看控制檯輸出:服務提供者註冊成功(端口20880)

而後到Tomact-Dubbo的管理控制中心:【首頁>服務治理>服務 】  便可查看到發佈的服務

4:消費Dubbo服務:

即上述途中的步驟:2 3  即對於服務消費者

建立maven項目 dubbo-demo-consumer

pom.xml配置下:

 1 <dependencies>
 2     <dependency>
 3         <groupId>com.alibaba</groupId>
 4         <artifactId>dubbo</artifactId>
 5         <version>2.6.0</version>
 6     </dependency>
 7     <dependency>
 8         <groupId>com.101tec</groupId>
 9         <artifactId>zkclient</artifactId>
10         <version>0.10</version>
11     </dependency>
12     <dependency>
13         <groupId>org.apache.curator</groupId>
14         <artifactId>curator-framework</artifactId>
15         <version>4.0.1</version>
16     </dependency>
17     <dependency>
18         <groupId>com.alibaba</groupId>
19         <artifactId>fastjson</artifactId>
20         <version>1.2.46</version>
21     </dependency>
22     <dependency>
23         <groupId>log4j</groupId>
24         <artifactId>log4j</artifactId>
25         <version>1.2.17</version>
26     </dependency>
27     <dependency>
28         <groupId>org.slf4j</groupId>
29         <artifactId>slf4j-api</artifactId>
30         <version>1.7.25</version>
31     </dependency>
32     <dependency>
33         <groupId>org.apache.commons</groupId>
34         <artifactId>commons-lang3</artifactId>
35         <version>3.4</version>
36     </dependency>
37     <dependency>
38         <groupId>io.netty</groupId>
39         <artifactId>netty-all</artifactId>
40         <version>4.0.35.Final</version>
41     </dependency>
42 </dependencies>
pom.xml

編寫Dubbo的配置文件  dubbo-demo-consumer.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3  xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 4  xmlns="http://www.springframework.org/schema/beans"
 5  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  6  http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 7  
 8     <!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方同樣 -->
 9     <dubbo:application name="demo-consumer"/>
10  
11     <!-- 使用zookeeper註冊中心暴露服務地址 -->
12     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
13  
14     <!-- 生成遠程服務代理,能夠和本地bean同樣使用demoProviderService check屬性,啓動的時候是否檢查 通常設置爲false 啓動的時候不檢查-->
15     <dubbo:reference id="demoProviderService" check="false" interface="com.xqc.service.DemoProviderService"/>
16  
17 </beans>

而後建立所需的服務提供者的接口

 1 package com.xqc.service;  2  
 3 /**
 4  * 服務提供者接口  5  *  6  */
 7 public interface DemoProviderService {  8  
 9     public String sayHello(String name); 10 }
DemoProviderService

編寫測試類

 1 import java.io.IOException;  2  
 3 import org.springframework.context.support.ClassPathXmlApplicationContext;  4  
 5 import com.xqc.service.DemoProviderService;  6  
 7 public class ConsumerTest {  8  
 9     public static void main(String[] args) { 10         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-demo-consumer.xml"}); 11  context.start(); 12         DemoProviderService demoProviderService=(DemoProviderService) context.getBean("demoProviderService"); 13         String result=demoProviderService.sayHello("你好"); 14         System.out.println("遠程調用結果:"+result); 15         try { 16  System.in.read(); 17         } catch (IOException e) { 18             // TODO Auto-generated catch block
19  e.printStackTrace(); 20  } 21  context.close(); 22  } 23 }
ConsumerTest

運行消費測試類便可。

固然消費和提供者確定都是在一整個項目中的,通常咱們會將公共部分抽取到Parent中,並在Parent中對版本進行統一的管理。這些在《  Maven的繼承與聚合——多模塊開發   》中都有詳細步驟,這裏就再也不重複。

四:Dubbo整合流行框架開發Web項目實現分佈式開發樣例

1:創建多模塊項目(這裏只是一個演示,實際項目中會根據拆分狀況進行創建項目)

其中:student-demo爲父項目

student-api用於暴露接口,消費者消費的都是從這的

student-service用於處理業務邏輯及調用數據訪問層,返回相應數據

student-web主要用於提供dubbo服務以及其餘db,spring,SpringMVC,mybatis等配置。

我也是根據晚上的教程學習了,不少,過兩天我會把一個完整的Spring+Spring+Mybatis改爲分佈式的發佈出來,也是對本身的一個任務

五:Dubbo服務集羣實現負載均衡

當某個服務併發量特別大的時候,一個服務延遲過高,咱們就須要進行服務集羣,某個項目一天註冊量10萬,這個註冊功能就必需要進行集羣了,不然一個服務沒法應付這麼大的併發量;

dubbo的服務集羣很簡單,只須要配置文件裏改個端口便可,其餘代碼不須要動;

企業級項目多個服務集羣,每一個服務都放不一樣機器,不只能實現負載均衡,也能進行容錯;就算一個機器掛了,其餘機器能夠繼續服務;

多個服務也提供權重設置,來動態設置請求分發量;

相關文章
相關標籤/搜索