使用Dubbo能夠將應用分佈到多個服務器上,當有訪問時,Dubbo有幫你管理自動將請求分配給合適獲得服務器去執行,即創建多個生產者,創建多個消費者,自動匹配生產者與消費者,以便達到負載均衡。關於集羣與負載均衡的一些概念的簡單解釋也能夠參考《大話集羣和負載均衡》html
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的主要做用就是幫助將服務發佈到集羣中,
官方手冊給出的架構如圖所示 http://dubbo.apache.org/en-us/docs/user/preface/architecture.html
0:服務容器負責啓動,加載,運行服務提供者
1:服務提供者在啓動時,向註冊中心註冊本身提供的服務,咱們採用的註冊中心就是Zookeeper。
2:服務消費者在啓動時,向註冊中心訂閱本身所需的服務。
3:註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。
4:服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
5:服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
採用分佈式的架構,對於代碼來講,咱們須要對代碼結構進行拆分,通常都使用Maven進行,能夠參考《 Maven的繼承與聚合——多模塊開發 》,拆分後每一部分基本內容不會改變,改變的是須要在每個拆分的單元中根據其須要加入須要的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>
而後定義一個服務接口:
1 package com.xqc.service; 2 3 /** 4 * 服務提供者接口 5 * 6 */ 7 public interface DemoProviderService { 8 9 public String sayHello(String name); 10 }
再定義實現類
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 }
配置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 }
而後啓動Zookeeper,運行測試類,便可發佈服務到Zookeeper註冊中心去。
查看控制檯輸出:服務提供者註冊成功(端口20880)
而後到Tomact-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>
編寫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 }
編寫測試類
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 }
運行消費測試類便可。
固然消費和提供者確定都是在一整個項目中的,通常咱們會將公共部分抽取到Parent中,並在Parent中對版本進行統一的管理。這些在《 Maven的繼承與聚合——多模塊開發 》中都有詳細步驟,這裏就再也不重複。
1:創建多模塊項目(這裏只是一個演示,實際項目中會根據拆分狀況進行創建項目)
其中:student-demo爲父項目
student-api用於暴露接口,消費者消費的都是從這的
student-service用於處理業務邏輯及調用數據訪問層,返回相應數據
student-web主要用於提供dubbo服務以及其餘db,spring,SpringMVC,mybatis等配置。
我也是根據晚上的教程學習了,不少,過兩天我會把一個完整的Spring+Spring+Mybatis改爲分佈式的發佈出來,也是對本身的一個任務
當某個服務併發量特別大的時候,一個服務延遲過高,咱們就須要進行服務集羣,某個項目一天註冊量10萬,這個註冊功能就必需要進行集羣了,不然一個服務沒法應付這麼大的併發量;
dubbo的服務集羣很簡單,只須要配置文件裏改個端口便可,其餘代碼不須要動;
企業級項目多個服務集羣,每一個服務都放不一樣機器,不只能實現負載均衡,也能進行容錯;就算一個機器掛了,其餘機器能夠繼續服務;
多個服務也提供權重設置,來動態設置請求分發量;