1. Dubbo官網
Dubbo下載下傳位址1). 發展曆史
随着網際網路的不斷發展,網站的應用規模越來越大,正常的垂直架構已經無法應對,尤其是類似電商的項目,是以分布式架構和流動計算架構已經勢在必行。Dubbo就是資源排程和服務治理中心的管理工具。
① 單一應用架構(ORM)
當網站流量很小時,隻需一個應用,将所有功能如下單支付等都部署在一起,以減少部署節點和成本。 缺點:單一的系統架構,使得在開發過程中,占用的資源越來越多,而且随着流量的增加越來越難以維護
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuUGMwIzY0cjYwADOzYTYmFzYhdDOhJDMxUWZxUzYidzNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
圖1.png
② 垂直應用架構(MVC)
垂直應用架構解決了單一應用架構所面臨的擴容問題,流量能夠分散到各個子系統當中,且系統的體積可控,一定程度上降低了開發人員之間協同以及維護的成本,提升了開發效率。 缺點:但是在垂直架構中相同邏輯代碼需要不斷的複制,不能複用。
圖2.png
③ 分布式服務架構(RPC)
當垂直應用越來越多,有很多相同的業務邏輯,這樣應用直接的互動不可避免,此時将核心業務抽取出來,作為獨立的服務,逐 漸形成穩定的服務中心,以應對快速變化的外部市場環境。
圖3.png
④ 流動計算架構(SOA)
當服務越來越多,容量的評估,小服務資源浪費等問題逐漸暴露,此時需要一個服務治理工具來管理叢集容量,提高使用率。
圖4.png
2). 為什麼使用dubbo?
1.webservice:效率不高基于soap協定,項目中不建議使用,但它的優點在于跨語言通信,适用于不同公司互相調用接口。
2.使用restful形式服務:http+json。很多項目中的應用,如果服務太多,系統之間調用關系混亂,需要治療服務。
3.使用dubbo。使用rpc協定進行遠端調用,之間使用socket通信,傳輸效率高,并且可以統計出系統之間的調用關系、調用次數。
說白了dubbo就是一個服務治理工具,是一個服務的中間件,由于dubbo是通過java編寫的,dubbo最大的缺點就出現了,它隻适用于java系統間的通信。
3). Dubbo架構
角色說明:
- Provider:暴露服務的服務提供方
- Container:服務運作容器
- Consumer:調用服務的消費方
- Registry:注冊服務與發現服務中心
- Monitor:統計服務調用的監控中心(可有可無) 圖5.png
分布式--Dubbo 分布式服務
調用關系說明:
0:服務運作容器啟動,加載服務提供者
1:在啟動時告訴注冊中心服務方有什麼服務
2:消費者調用服務時,先到注冊中心訂閱所需要服務
3:注冊中心傳回結果即該服務的位址
4:消費者通過位址調用服務(此時注冊中心沒用了)
5:服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次到監控中心
4). RPC(Remote Procedure Call Protocol)
遠端過程調用: 兩台伺服器A、B,分别部署不同的應用a,b。當A伺服器想要調用B伺服器上應用b提供的函數或方法的時候,由于不在一個記憶體空間,不能直接調用,需要通過網絡來表達調用的語義傳達調用的資料。
圖6.png
RPC是一種通過網絡從遠端計算機程式上請求服務,而不需要了解底層網絡技術的協定。RPC協定假定某些傳輸協定的存在,如TCP或UDP,為通信程式之間攜帶資訊資料。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程式在内的應用程式更加容易。 RPC采用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。首先,客戶機調用程序發送一個有程序參數的調用資訊到服務程序,然後等待應答資訊。在伺服器端,程序保持睡眠狀态直到調用資訊到達為止。當一個調用資訊到達,伺服器獲得程序參數,計算結果,發送答複資訊,然後等待下一個調用資訊,最後,用戶端調用程序接收答複資訊,獲得程序結果,然後調用執行繼續進行。
5). Dubbo的注冊中心
- Multicast注冊中心
- Zookeeper注冊中心
- Redis注冊中心
- Simple注冊中心
6). Dubbo優缺點
- 優點:
- 透明化的遠端方法調用:像調用本地方法一樣調用遠端方法;隻需簡單配置,沒有任何API侵入。
- 軟負載均衡及容錯機制:可在内網替代nginx lvs等硬體負載均衡器。
- 服務注冊中心自動注冊 & 配置管理:不需要寫死服務提供者位址,注冊中心基于接口名自動查詢提供者ip。使用類似zookeeper等分布式協調服務作為服務注冊中心,可以将絕大部分項目配置移入zookeeper叢集。
- 服務接口監控與治理 :Dubbo-admin與Dubbo-monitor提供了完善的服務接口管理與監控功能,針對不同應用的不同接口,可以進行 多版本,多協定,多注冊中心管理。
- 缺點:隻支援JAVA語言
2. Spring+Dubbo+ZooKeeper執行個體
1). 準備jar包(共16個)
- ** Spring : ** commons-logging-1.2.jar、spring-aop-5.0.5.RELEASE.jar、spring-beans-5.0.5.RELEASE.jar、spring-context-5.0.5.RELEASE.jar、spring-core-5.0.5.RELEASE.jar、spring-expression-5.0.5.RELEASE.jar
- Dubbo : ** dubbo-2.6.1.jar
- ZooKeeper : ** log4j-1.2.16.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.1.jar、netty-3.10.5.Final.jar、zookeeper-3.4.10.jar
- **Other: ** curator-client-4.0.1.jar 、 curator-framework-4.0.1.jar javassist-3.22.0-GA.jar selenium-server-standalone-3.11.0.jar 圖7.png
分布式--Dubbo 分布式服務
2). 建立Dubbo-api Java項目
I. 引入jar包
右鍵項目 -> Build Path -> Configure Build Path... -> Libraries -> Add External JARs... 找到自己剛剛存放jar包的檔案夾,我的是在
E:\eclipse\libs\
檔案夾中,全選(Ctrl+A)jar包,點選打開—> OK. 導包成功.
圖8.png
II. 将解壓ZooKeeper後的檔案夾中/conf/檔案夾下的log4j.properties拷貝到工程的src目錄下
圖9.png
III. 在src下建立ItemService接口
public interface ItemService {
List<String> getList(Long id);
}
IV. Dubbo-api 工程目錄結構
圖10.png
3). 建立Dubbo-provider Java工程
I. 導包--方法同上
II. 依賴上一步完成的Dubbo-api Java工程
工程上右鍵 -> Build Path -> Configure Build Path... -> Project -> Add... ->選擇Dubbo-api 點選OK -> OK
III. 建立ItemService的實作類ItemServiceImpl
public class ItemServiceImpl implements ItemService{
@Override
public List<String> getList(Long id) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add("item" + i);
}
return list;
}
}
IV. 在src目錄下建立provider.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.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 定義了提供方應用資訊,用于計算依賴關系,在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,友善辨識 -->
<dubbo:application name="Dubbo-provider" owner="programmer" organization="mazaiting"/>
<!-- 使用ZooKeeper 注冊中心暴露服務,注意要先開啟ZooKeeper -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 使用Dubbo協定在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 使用dubbo 協定實作定義好的服務接口 -->
<dubbo:service protocol="dubbo" ref="itemService" interface="com.mazaiting.service.ItemService"/>
<!-- 具體實作該接口的bean -->
<bean id="itemService" class="com.mazaiting.service.impl.ItemServiceImpl"/>
</beans>
如果遇到無法快捷提示dubbo标簽的情況, 請
參考此文--Dubbo 無法加載dubbo.xsdV. 建立Provider類,此類中啟動此工程
public class Provider {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("provider.xml");
System.out.println(context.getDisplayName() + " : here");
context.start();
System.out.println("服務已經啟動...");
System.in.read();
}
}
VI. Dubbo-provider 工程目錄結構
圖11.png
4). 建立Dubbo-consumer Java工程
I. 導包 -- 方法同上
II. 在src下建立consumer.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.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 定義了提供方應用資訊,用于計算依賴關系,在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,友善辨識 -->
<dubbo:application name="Dubbo-consumer" owner="programmer" organization="mazaiting"/>
<!-- 向ZooKeeper 訂閱provider的位址, 由ZooKeeper定時推送 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 使用協定調用定義好的接口 -->
<dubbo:reference id="itemService" interface="com.mazaiting.service.ItemService"/>
</beans>
III. 建立Consumer類來啟動目前工程
public class Consumer {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("consumer.xml");
context.start();
System.out.println("consumer start");
ItemService demoService = context.getBean(ItemService.class);
System.out.println("consumer");
List<String> list = demoService.getList(1L);
for (String string : list) {
System.out.println(string);
}
}
}
IV. Dubbo-consumer 工程目錄結構
圖12.png
5). 測試
I. 開啟ZooKeeper --
ZooKeeper安裝及使用II. 執行Dubbo-provider工程中的Provider類
圖13.png
III. 再啟動Dubbo-consumer工程中的Consumer類
圖15.png
3. Dubbo 控制台安裝
1).
Dubbo-admin下載下傳2). 編譯項目
編譯項目需要使用到Maven指令,
Linux 安裝Maven和
Windows 安裝Maven下載下傳之後解壓,并進入incubator-dubbo-ops-master檔案夾,在指令提示符視窗中輸入
mvn clean package
編譯成功如下圖:
圖16.png
3). 安裝
Tomcat容器圖17.png
這裡我下載下傳的是zip包,下載下傳後并解壓
圖18.png
4). 複制檔案
将incubator-dubbo-ops-master\dubbo-admin\target\下的dubbo-admin-2.0.0.war複制到apache-tomcat-8.5.31\webapps\目錄下
圖19.png
5). 解壓
将dubbo-admin-2.0.0.war解壓
圖20.png
在WEB-INF/dubbo.properties檔案中可以配置ZooKeeper位址,管理者密碼
4. 使用Dubbo-admin
1). 開啟ZooKeeper
圖21.png
2). 開啟Tomcat
- 輕按兩下startup.bat批處理開發 圖22.png
分布式--Dubbo 分布式服務 - 浏覽器打開
頁面http://localhost:8080/dubbo-admin-2.0.0
分布式--Dubbo 分布式服務 圖23.png
使用者名和密碼預設的均為root,此時登入後資料為空。
圖24.png分布式--Dubbo 分布式服務
3). 在Eclipse中運作Dubbo-provider項目
程式啟動後重新整理
http://localhost:8080/dubbo-admin-2.0.0/governance/providers
圖25.png
此時提供者已有資料,再進入消費者頁面
圖26.png
4). 在Eclipse中運作Dubbo-consumer項目
程式啟動後,Eclipse控制台列印出資料,重新整理
http://localhost:8080/dubbo-admin-2.0.0/governance/consumers
圖27.png
此時消費者頁面也有資料了。