~ 基礎概述
中文文檔:https://dubbo.gitbooks.io/dubbo-user-book/content/
>> SOA
SOA(Service-Oriented Architecture):面向服務架構;
SOA是一個組件模型,它將應用程序的不同功能單元(稱爲服務)進行拆分,並通過這些服務之間定義良好的接口和契約聯繫起來;接口是採用中立的方式進行定義的,應該獨立於實現服務的硬件平臺、操作系統、編程語言;這使得構建在各種各樣的系統中的服務可以以一種統一的和通用的方式進行交互;
SOA是一種支持面向服務的架構模式,從服務、基於服務開發和服務的結果來看,面向服務是一種思考方式;SOA架構多應用於互聯網項目開發;隨着互聯網的發展,網站應用的規模不斷擴大,併發量不斷提高,常規的垂直應用架構已經無力應對,分佈式服務架構以及流動計算架構勢在必行,急需一個治理系統確保架構有條不紊的演進;Dubbo就是分佈式架構的解決方案;
-
單一應用架構:當網站量(併發訪問量)很小時,只需要一個應用,將所有代碼都寫到一個項目中,不需要進行拆分,將所有功能都部署到一起,以減少部署節點和成本;此時用於簡化增刪改查工作量的數據訪問架構(ORM)是關鍵;
-
垂直應用架構:當訪問量逐漸增大你,單一應用增加機器帶來的加速度越來越小,將應用拆分成互不相干的幾個應用,以提升效率;此時用於加速前端頁面開發的web框架(MVC)是關鍵;
-
分佈式服務架構:當垂直應用越來越多的時候,應用之間的交互不可避免,將核心業務抽取出來,作爲獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求;此時用於提高業務複用及整合的分佈式服務架構(RPC)是關鍵;
例如:購物系統拆分爲網站前臺、網站後臺、商品服務、訂單服務等;前臺、後臺都需要訪問服務,在調用時需要指定服務所在服務器的IP地址和端口號,應爲前臺和服務是兩個單獨的應用,分別部署到不同的服務器;這樣就出現分佈式服務架構在相互調用時,管理上很麻煩,都得去填寫IP地址和端口號; -
流動計算架構:當服務越來越多,容量的評估、小服務資源的浪費等問題逐漸顯現,此時需要增加一個調度中心,基於訪問壓力,實時管理集羣容量,提高集羣利用率;此時,用於提高機器利用率的資源調度和治理中心(SOA)是關鍵;
>> Dubbo
1、Dubbo是一個分佈式服務框架(遠程服務調用的分佈式框架),應用於分佈式系統架構;
Dubbo致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案;
2、Dubbo服務架構的架構模型:有5個節點角色
3、節點角色說明:
(1)Provider:暴露服務的服務提供方,發佈服務的一方;
(2)Consumer:調用遠程服務的服務消費方,服務調用的一方;
(3)Registry:服務註冊與發現的註冊中心,服務的提供方把所要發佈的服務全都發布到註冊中心上,服務的地址全都由註冊中心來管理,服務的消費方去註冊中心查找服務地址;
註冊中心負責註冊地址的註冊與查找,相當於目錄服務,服務提供者和消費者只在啓動時與註冊中心進行交互,註冊中心不轉發請求,壓力較小;
(4)Monitor:統計服務的調用次數和調用時間的監控中心;
(5)Container:服務運行容器;
4、調用關係說明:
(1)服務容器負責啓動、加載、運行服務提供者;
(2)服務提供者在啓動時,向註冊中心註冊自己提供的服務;
(3)服務消費者在啓動時,向註冊中心訂閱自己所需要的服務;
(4)註冊中心返回 服務提供者地址列表 給消費者,若有變更,註冊中心將基於長連接推送變更數據給消費者;
(5)服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若調用失敗,再選另一臺進行調用;
(6)服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心;
5、Dubbo架構特點: 連通性、健壯性、伸縮性、向未來架構的升級性;
6、Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo配置即可,Dubbo基於Spring的Schema擴展進行加載;
7、Dubbo常用使用方式:註解方式、XML配置方式、屬性配置方式、API配置方式;
8、Dubbo註冊中心有多種:Multicase註冊中心、Zookeeper註冊中心(官方推薦)、Redis註冊中心、Simple註冊中心;
>> Zookeeper
1、Zookeeper是Apache Hadoop的子項目,是一個樹型的目錄服務,支持變更推送,適合作爲Dubbo服務的註冊中心,工業強度較高,可用於生產環境;
要使用Zookeeper作爲dubbo的註冊中心,就要有一個Zookeeper的一個服務器;
2、Zookeeper安裝:
(1)安裝brew:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
;
(2)檢查安裝環境:brew info zookeeper
;
(3)安裝:brew install zookeeper
;
(4)在Zookeeper目錄下創建data文件夾;
(5)修改Zookeeper配置文件:/usr/local/etc/zookeeper
;
tickTime=2000
:ZK中的一個時間單元;ZK中所有時間都是以這個時間單元爲基礎,進行整數倍配置的;Eg:session的最小超時時間是2*tickTime;initLimit=10
:Follower在啓動過程中,會從leader同步所有最新數據,然後確定自己能夠對外服務的起始狀態;leader允許follower在initLimit時間內完成這個工作;若ZK集羣的數據量很大,follower在啓動時,從leader上同步數據的時間也會相應變長,因此在這種情況下,有必要適當調大這個參數;syncLimit=5
:在運行過程中,leader負責與ZK集羣中所有機器進行通信,例如通過一些心跳檢測機制來檢測機器的存活狀態,若leader在發出心跳包在syncLimit秒之後,還沒有從follower那裏收到響應,那麼就認爲這個follower已經不在線了;注意:這個參數值若設的過大,可能會掩蓋一些問題;dataDir=/usr/local/etc/zookeeper/data
:指定Zookeeper的數據存放路徑(存儲快照文件);默認情況下事務日誌也會存儲在這裏,建議同時設置dataLogDir參數,事務日誌的寫性能直接影響ZK性能;clientPort=2181
:客戶端連接server的端口號,即對外服務服務的端口,默認使用2181即可;server.x=slavel1:2888:3888
:Zookeeper集羣時需要添加該配置;
[server.x]中的x是一個數字,與myid文件中的id是一致的,表示集羣中集羣編號;
[slave1]表示集羣中機器的域名(可以使用IP地址);
[2888]表示集羣內機器通信的端口,用於leader和follower之間數據同步和其他通信;
[3888]表示集羣選舉時使用的端口,用於leader選舉過程中投票通信;
server.x=[hostname]:nnnnn[:nnnnn]
:server.1=127.0.0.1:2888:3888
(6)添加myid文件:cd /usr/local/var/run/zookeeper/data/zk1
(配置文件中的dataDir),vim myid 輸入 1 保存,1代表機器編號;
(7)啓動Zookeeper服務:cd /usr/local/bin
,zkServer start
zkServer
後面可寫參數:start(啓動)、stop(停止)、status(查看狀態)
zkServer status
出現這個Mode: standalone
,表示服務啓動成功;
~ Dubbo 管理端
1、Dubbo 管理端: 是一個可視化界面,通過這個可視化界面可以查看有哪些服務已經發布到註冊中心,有哪些消費者調用了服務;
也可以對錯誤進行定位:若註冊中心沒有指定服務,說明服務發佈失敗;若服務發佈成功,但是調用時失敗,說明消費方出錯;
2、官網下載地址: http://dubbo.apache.org/en-us/blog/download.html
3、dubbo-2.6.1以後的版本不再有dubbo-admin; Dubbo在2.6.1及2.6.1以後的版本當中,將一分爲二,分爲Dubbo-RPC
和Dubbo-Admin
,而在2.6.1以前的版本中Dubbo-Admin
是包含在Dubbo-RPC
當中的;新版本Dubbo-Admin
名稱改爲Dubbo-OPS
;
參考鏈接:https://blog.csdn.net/u012627861/article/details/82754027
https://blog.csdn.net/u012627861/article/details/82945068
Dubbo-OPS
目錄結構:Dubbo-Admin中包含三個子模塊;
4、2.6.1以前的版本下載dubbo-admin
和部署:
- 下載2.5.7;
- 終端進入到dubbo-admin目錄,執行
mvn package -Dmaven.skip.test=true
- 在dubbo-admin目錄下回出現target文件夾,裏面有
dubbo-admin-2.5.7.war
文件,可以改名爲dubbo-admin.war
,放到Tomcat的webapps目錄下; - 最好將管理端的工具放到ZK所在的主機上:若ZK默認端口是2181,則不需要做修改;若不在同一臺主機或端口號被修改,需要修改
WEB-INF
下的dubbo.properties
文件:dubbo.registry.address=zookeeper://127.0.0.1:2181
,修改後重啓Tomcat; - 配置修改tomcat的端口8088,到conf下的文件 server.xml,因爲zookeeper會用到8080的端口,所以爲了不衝突,把Tomcat的端口改一下,記得一定要改!!!
- 終端啓動Tomcat:
/Users/zxj/Library/apache-tomcat-9.0.17/bin/startup.sh
/sudo sh startup.sh
- 這兒有個要注意的地方,現在我們還是打包的war文件,我們還需要dubbo-admin包的相應配置,所以我們要先啓動tomcat,讓其自動解壓dubbo-admin包後再關閉tomcat,再刪除dubbo-admin.war包後修改dubbo-admin下的\WEB-INF下的dubbo.properties文件,如下圖:這裏的dubbo.regist ry.address後面對應的IP地址是我們的zookeeper對應的IP與端口地址,一定要一致;一般情況下都是不需要改的,因爲初始都是本地的IP地址;
- 一定要先啓動zookeeper啓動後再去啓動tomcat;
- 瀏覽器地址欄訪問:
http://localhost:8088/
,用戶名/密碼:root/root
5、2.6.1及2.6.1以後的版本下載dubbo-admin跟部署:
-
點擊
Dubbo-Admin
,進入github下載頁面 --> 選擇master分支
(必須是master分支纔行,因爲進入該頁面默認會選中develop分支) -
下載
dubbo-admin
;
下載後導入IDE,還有一點需要注意的是2.6.1及以後的版本dubbo-admin工程改爲了springboot的工程,在編譯和部署的時候,需要按照springboot工程的部署跟運行方式了; -
dubbo-admin/src/main/resources/application.properties
-
進入
dubbo-admin
目錄,打包項目: 執行mvn clean package
命令; -
在
dubbo-admin
目錄下出現target文件夾,cd target
-->java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
-
瀏覽器訪問:
http://localhost:7001
;
~ 入門案例
1、安裝ZK,啓動服務;
Dubbo的註冊中心ZK已經安裝好並啓動,接下來編寫入門代碼,要先編寫服務提供方的代碼,再編寫服務消費放的代碼;
2、創建Maven工程 - dubbo-service: 要想對外發布成一個服務,就要打包成war包,因爲jar包是可以單獨部署的;
3、添加web.xml
:
4、pom.xml
:
5、applicationContext-service
文件:
6、com.zxj.dubbo.service.HelloService
接口:
7、com.zxj.dubbo.service.impl.HelloService
實現類: 注意類上的@Service註解使用的是Dubbo註解,不是Spring的註解;
8、創建Maven工程 - dubbo-consumer
:
pom.xml
與dubbo-service
依賴一樣,Tomcat插件處端口號改爲8081(與dubbo-service端口號不一樣);
9、web.xml
:
10、springmvc.xml
:
11、創建com.zxj.dubbo.controller.HelloController.java
12、複製duboo-service
中的service接口包到dubbo-consumer
項目中;
13、在springmvc.xml
中配置dubbo
14、啓動dubbo-service
:Run As --> Maven build... --> Goals(Tomcat7:run)
15、啓動dubbo-consumer
:
16、瀏覽器地址欄:http://localhost:8081/hello/test.action
~ 綜合案例
1、需求: 使用SpringMVC+Mybtis+Dubbo
實現旅遊網的註冊功能;
service、dao部署到一個單獨的服務器,controller、web層部署到另一個服務中,控制層遠程調用業務層的代碼;
2、搭建環境:
aiyou-parent
:Maven Project項目,打包成pom;aiyou-pojo
、aiyou-dao
、aiyou-interface
:Maven Module項目,打包成jar;aiyou-service
、aiyou-web
:Maven Module項目,打包成war;(因爲要作爲服務對外提供)