Dubbo使用_尚硅谷视频学习笔记
文章目錄
- Dubbo
- 基礎知識
- 分布式基礎理論
- 1.1)、什么是分布式系統?
- 1.2)、發展演變
- 1.3)、RPC
- 2、dubbo核心概念
- 2.1)、簡介
- 2.2)、基本概念
- 3、dubbo環境搭建
- 3.1)、【windows】-安裝zookeeper
- 3.2)、【windows】-安裝dubbo-admin管理控制臺
- 3.3)、【linux】-安裝zookeeper
- 3.4)、【linux】-安裝dubbo-admin管理控制臺
- 4、dubbo-helloworld
- 4.1)、提出需求
- 4.2)、工程架構
- 4.3)、創建模塊
- 4.4)、使用dubbo改造
- 5、監控中心
- 5.1)、dubbo-admin
- 5.2)、dubbo-monitor-simple
- 6、整合SpringBoot
- dubbo配置
- 1、配置原則
- 2、重試次數
- 3、超時時間
- 4、版本號
- 高可用
- 1、zookeeper宕機與dubbo直連
- 2、集群下dubbo負載均衡配置
- 3、整合hystrix,服務熔斷與降級處理
- 1、服務降級
- 2、集群容錯
- 3、整合hystrix
- dubbo原理
- 1、RPC原理
- 2、netty通信原理
- 3、dubbo原理
- 1、dubbo原理 -框架設計
- 2、dubbo原理 -啟動解析、加載配置信息
- 3、dubbo原理 -服務暴露
- 4、dubbo原理 -服務引用
- 5、dubbo原理 -服務調用
Dubbo
基礎知識
分布式基礎理論
1.1)、什么是分布式系統?
《分布式系統原理與范型》定義:
“分布式系統是若干獨立計算機的集合,這些計算機對于用戶來說就像單個相關系統”
分布式系統(distributed system)是建立在網絡之上的軟件系統。
隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分布式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。
1.2)、發展演變
單一應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。此時,用于簡化增刪改查工作量的數據訪問框架(ORM)是關鍵。
適用于小型網站,小型管理系統,將所有功能都部署到一個功能里,簡單易用。
缺點:
1、性能擴展比較難
2、協同開發問題
3、不利于升級維護
垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。此時,用于加速前端頁面開發的Web框架(MVC)是關鍵。
通過切分業務來實現各個模塊獨立部署,降低了維護和部署的難度,團隊各司其職更易管理,性能擴展也更方便,更有針對性。
缺點: 公用模塊無法重復利用,開發性的浪費
分布式服務架構
當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用于提高業務復用及整合的**分布式服務框架(RPC)**是關鍵。
流動計算架構
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基于訪問壓力實時管理集群容量,提高集群利用率。此時,用于提高機器利用率的資源調度和治理中心 (SOA)[ Service Oriented Architecture] 是關鍵。
1.3)、RPC
什么叫RPC
RPC【Remote Procedure Call】是指遠程過程調用,是一種進程間通信方式,他是一種技術的思想,而不是規范。它允許程序調用另一個地址空間(通常是共享網絡的另一臺機器上)的過程或函數,它允許程序調用另一個地址空間(通常是共享網絡的另一臺機器上)的過程或函數,編寫的調用代碼基本相同。
RPC基本原理
RPC兩個核心模塊:通訊,序列化。
2、dubbo核心概念
2.1)、簡介
Apache Dubbo (incubating) |?d?b??| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。
官網:
http://dubbo.apache.org/
2.2)、基本概念
服務提供者(Provider):暴露服務的服務提供方,服務提供者在啟動時,向注冊中心注冊自己提供的服務。
服務消費者(Consumer): 調用遠程服務的服務消費方,服務消費者在啟動時,向注冊中心訂閱自己所需的服務,服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
注冊中心(Registry):注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數據給消費者
監控中心(Monitor):服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心
? 調用關系說明
- ? 服務容器負責啟動,加載,運行服務提供者。
- ? 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
- ? 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
- ? 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數據給消費者。
- ? 服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
- ? 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
3、dubbo環境搭建
3.1)、【windows】-安裝zookeeper
下載zookeeper
網址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/
解壓zookeeper
解壓運行zkServer.cmd ,初次運行會報錯,沒有zoo.cfg配置文件
修改zoo.cfg配置文件
將conf下的zoo_sample.cfg復制一份改名為zoo.cfg即可。
注意幾個重要位置:
dataDir=./ 臨時數據存儲的目錄(可寫相對路徑)
clientPort=2181 zookeeper的端口號
修改完成后再次啟動zookeeper
使用zkCli.cmd測試
ls /:列出zookeeper根下保存的所有節點
create –e /atguigu 123:創建一個atguigu節點,值為123
get /atguigu:獲取/atguigu節點的值
3.2)、【windows】-安裝dubbo-admin管理控制臺
dubbo本身并不是一個服務軟件。它其實就是一個jar包能夠幫你的java程序連接到zookeeper,并利用zookeeper消費、提供服務。所以你不用在Linux上啟動什么dubbo服務。
但是為了讓用戶更好的管理監控眾多的dubbo服務,官方提供了一個可視化的監控程序,不過這個監控即使不裝也不影響使用。
下載dubbo-admin
https://github.com/apache/incubator-dubbo-ops
進入目錄,修改dubbo-admin配置
修改 src\main\resources\application.properties 指定zookeeper地址
打包dubbo-admin
mvn clean package -Dmaven.test.skip=true
運行dubbo-admin
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
注意:【有可能控制臺看著啟動了,但是網頁打不開,需要在控制臺按下ctrl+c即可】
默認使用root/root 登陸
3.3)、【linux】-安裝zookeeper
1、安裝jdk
下載jdk
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
不要使用wget命令獲取jdk鏈接,這是默認不同意,導致下載來的jdk壓縮內容錯誤
上傳到服務器并解壓
設置環境變量
/usr/local/java/jdk1.8.0_171
文件末尾加入下面配置
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export JRE_HOME=JAVAHOME/jreexportCLASSPATH=.:{JAVA_HOME}/jre export CLASSPATH=.:JAVAH?OME/jreexportCLASSPATH=.:{JAVA_HOME}/lib:JREHOME/libexportPATH={JRE_HOME}/lib export PATH=JREH?OME/libexportPATH={JAVA_HOME}/bin:$PATH
使環境變量生效&測試JDK
2、安裝zookeeper
下載zookeeper
網址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
解壓
移動到指定位置并改名為zookeeper
3、開機啟動zookeeper
-把腳本注冊為Service
-增加權限
4、配置zookeeper
初始化zookeeper配置文件
拷貝/usr/local/zookeeper/conf/zoo_sample.cfg
到同一個目錄下改個名字叫zoo.cfg
啟動zookeeper
3.4)、【linux】-安裝dubbo-admin管理控制臺
1、安裝Tomcat8(舊版dubbo-admin是war,新版是jar不需要安裝Tomcat)
下載Tomcat8并解壓
https://tomcat.apache.org/download-80.cgi
wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz
解壓移動到指定位置
開機啟動tomcat8
復制如下腳本
注冊服務&添加權限
啟動服務&訪問tomcat測試
2、安裝dubbo-admin
dubbo本身并不是一個服務軟件。它其實就是一個jar包能夠幫你的java程序連接到zookeeper,并利用zookeeper消費、提供服務。所以你不用在Linux上啟動什么dubbo服務。
但是為了讓用戶更好的管理監控眾多的dubbo服務,官方提供了一個可視化的監控程序,不過這個監控即使不裝也不影響使用。
下載dubbo-admin
https://github.com/apache/incubator-dubbo-ops
進入目錄,修改dubbo-admin配置
修改 src\main\resources\application.properties 指定zookeeper地址
打包dubbo-admin
mvn clean package -Dmaven.test.skip=true
運行dubbo-admin
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
默認使用root/root 登陸
4、dubbo-helloworld
4.1)、提出需求
某個電商系統,訂單服務需要調用用戶服務獲取某個用戶的所有地址;
我們現在 需要創建兩個服務模塊進行測試
| 訂單服務web模塊 | 創建訂單等 |
| 用戶服務service模塊 | 查詢用戶地址等 |
測試預期結果:
訂單服務web模塊在A服務器,用戶服務模塊在B服務器,A可以遠程調用B的功能。
4.2)、工程架構
根據 dubbo《服務化最佳實踐》
1、分包
建議將服務接口,服務模型,服務異常等均放在 API 包中,因為服務模型及異常也是 API 的一部分,同時,這樣做也符合分包原則:重用發布等價原則(REP),共同重用原則(CRP)。
如果需要,也可以考慮在 API 包中放置一份 spring 的引用配置,這樣使用方,只需在 spring 加載過程中引用此配置即可,配置建議放在模塊的包目錄下,以免沖突,如:
com/alibaba/china/xxx/dubbo-reference.xml。
2、粒度
服務接口盡可能大粒度,每個服務方法應代表一個功能,而不是某功能的一個步驟,否則將面臨分布式事務問題,Dubbo 暫未提供分布式事務支持。
服務接口建議以業務場景為單位劃分,并對相近業務做抽象,防止接口數量爆炸。
不建議使用過于抽象的通用接口,如:Map query(Map),這樣的接口沒有明確語義,會給后期維護帶來不便。
4.3)、創建模塊
1、gmall-interface:公共接口層(model,service,exception…)
作用:定義公共接口,也可以導入公共依賴
UserService
2、gmall-user:用戶模塊(對用戶接口的實現)
3 、gmall-order-web:訂單模塊(調用用戶模塊)
現在這樣是無法進行調用的。我們gmall-order-web引入了gmall-interface,但是interface的實現是gmall-user,我們并沒有引入,而且實際他可能還在別的服務器中。
4.4)、使用dubbo改造
1、改造gmall-user作為服務提供者
2、改造gmall-order-web作為服務消費者
3、測試調用
訪問gmall-order-web的initOrder請求,會調用UserService獲取用戶地址;
調用成功。說明我們order已經可以調用遠程的UserService了;
4、注解版
5、監控中心
5.1)、dubbo-admin
圖形化的服務管理頁面;安裝時需要指定注冊中心地址,即可從注冊中心中獲取到所有的提供者/消費者進行配置管理
5.2)、dubbo-monitor-simple
簡單的監控中心;
1、安裝
下載 dubbo-ops
https://github.com/apache/incubator-dubbo-ops
修改配置指定注冊中心地址
進入 dubbo-monitor-simple\src\main\resources\conf
修改 dubbo.properties文件
打包dubbo-monitor-simple
mvn clean package -Dmaven.test.skip=true
解壓 tar.gz 文件,并運行start.bat
如果缺少servlet-api,自行導入servlet-api再訪問監控中心
啟動訪問8080
2、監控中心配置
所有服務配置連接監控中心,進行監控統計
Simple Monitor 掛掉不會影響到 Consumer 和 Provider 之間的調用,所以用于生產環境不會有風險。
Simple Monitor 采用磁盤存儲統計信息,請注意安裝機器的磁盤限制,如果要集群,建議用mount共享磁盤。
6、整合SpringBoot
引入spring-boot-starter以及dubbo和curator的依賴
<dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.0</version> </dependency>注意starter版本適配:
配置application.properties
提供者配置:
application.name就是服務名,不能跟別的dubbo提供端重復
registry.protocol 是指定注冊中心協議
registry.address 是注冊中心的地址加端口號
protocol.name 是分布式固定是dubbo,不要改。
base-package 注解方式要掃描的包
消費者配置:
dubbo.application.name=gmall-order-web dubbo.registry.protocol=zookeeper dubbo.registry.address=192.168.67.159:2181 dubbo.scan.base-package=com.atguigu.gmall dubbo.protocol.name=dubbodubbo注解
@Service、@Reference
【如果沒有在配置中寫dubbo.scan.base-package,還需要使用@EnableDubbo注解】
dubbo配置
1、配置原則
JVM 啟動 -D 參數優先,這樣可以使用戶在部署和啟動時進行參數重寫,比如在啟動時需改變協議的端口。
XML 次之,如果在 XML 中有配置,則 dubbo.properties 中的相應配置項無效。
Properties 最后,相當于缺省值,只有 XML 沒有配置時,dubbo.properties 的相應配置項才會生效,通常用于共享公共配置,比如應用名。
2、重試次數
失敗自動切換,當出現失敗,重試其它服務器,但重試會帶來更長延遲。可通過 retries=“2” 來設置重試次數(不含第一次)。
重試次數配置如下:
<dubbo:service retries="2" /> 或 <dubbo:reference retries="2" /> 或 <dubbo:reference><dubbo:method name="findFoo" retries="2" /> </dubbo:reference>3、超時時間
由于網絡或服務端不可靠,會導致調用出現一種不確定的中間狀態(超時)。為了避免超時導致客戶端資源(線程)掛起耗盡,必須設置超時時間。
dubbo推薦在Provider上盡量多配置Consumer端屬性:
1、作服務的提供者,比服務使用方更清楚服務性能參數,如調用的超時時間,合理的重試次數,等等
2、在Provider配置后,Consumer不配置則會使用Provider的配置值,即Provider配置可以作為Consumer的缺省值。否則,Consumer會使用Consumer端的全局設置,這對于Provider不可控的,并且往往是不合理的
配置的覆蓋規則:
4、版本號
當一個接口實現,出現不兼容升級時,可以用版本號過渡,版本號不同的服務相互間不引用。
可以按照以下的步驟進行版本遷移:
在低壓力時間段,先升級一半提供者為新版本
再將所有消費者升級為新版本
然后將剩下的一半提供者升級為新版本
高可用
1、zookeeper宕機與dubbo直連
現象:zookeeper注冊中心宕機,還可以消費dubbo暴露的服務。
原因:
健壯性
- ? 監控中心宕掉不影響使用,只是丟失部分采樣數據
- ? 數據庫宕掉后,注冊中心仍能通過緩存提供服務列表查詢,但不能注冊新服務
- ? 注冊中心對等集群,任意一臺宕掉后,將自動切換到另一臺
- ? 注冊中心全部宕掉后,服務提供者和服務消費者仍能通過本地緩存通訊
- ? 服務提供者無狀態,任意一臺宕掉后,不影響使用
- ? 服務提供者全部宕掉后,服務消費者應用將無法使用,并無限次重連等待服務提供者恢復
高可用:通過設計,減少系統不能提供服務的時間;
2、集群下dubbo負載均衡配置
在集群負載均衡時,Dubbo 提供了多種均衡策略,缺省為 random 隨機調用。
負載均衡策略
Random LoadBalance 隨機,按權重設置隨機概率。 在一個截面上碰撞的概率高,但調用量越大分布越均勻,而且按概率使用權重后也比較均勻,有利于動態調整提供者權重。RoundRobin LoadBalance 輪循,按公約后的權重設置輪循比率。 存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。LeastActive LoadBalance 最少活躍調用數,相同活躍數的隨機,活躍數指調用前后計數差。 使慢的提供者收到更少請求,因為越慢的提供者的調用前后計數差會越大。ConsistentHash LoadBalance 一致性 Hash,相同參數的請求總是發到同一提供者。 當某一臺提供者掛時,原本發往該提供者的請求,基于虛擬節點,平攤到其它提供者,不會引起劇烈變動。算法參見:http://en.wikipedia.org/wiki/Consistent_hashing 缺省只對第一個參數 Hash,如果要修改,請配置 <dubbo:parameter key="hash.arguments" value="0,1" /> 缺省用 160 份虛擬節點,如果要修改,請配置 <dubbo:parameter key="hash.nodes" value="320" />3、整合hystrix,服務熔斷與降級處理
1、服務降級
什么是服務降級?
當服務器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務器資源以保證核心交易正常運作或高效運作。
可以通過服務降級功能臨時屏蔽某個出錯的非關鍵服務,并定義降級后的返回策略。
向注冊中心寫入動態配置覆蓋規則:
其中:
- ? mock=force:return+null 表示消費方對該服務的方法調用都直接返回 null 值,不發起遠程調用。用來屏蔽不重要服務不可用時對調用方的影響。
- ? 還可以改為 mock=fail:return+null 表示消費方對該服務的方法調用在失敗后,再返回 null 值,不拋異常。用來容忍不重要服務不穩定時對調用方的影響。
2、集群容錯
在集群調用失敗時,Dubbo 提供了多種容錯方案,缺省為 failover 重試
集群容錯模式
- Failover Cluster
失敗自動切換,當出現失敗,重試其它服務器。通常用于讀操作,但重試會帶來更長延遲。可通過 retries=“2” 來設置重試次數(不含第一次)。
- Failfast Cluster
快速失敗,只發起一次調用,失敗立即報錯。通常用于非冪等性的寫操作,比如新增記錄。 - Failsafe Cluster
失敗安全,出現異常時,直接忽略。通常用于寫入審計日志等操作。 - Failback Cluster
失敗自動恢復,后臺記錄失敗請求,定時重發。通常用于消息通知操作。 - Forking Cluster
并行調用多個服務器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks=“2” 來設置最大并行數。 - Broadcast Cluster
廣播調用所有提供者,逐個調用,任意一臺報錯則報錯 [2]。通常用于通知所有提供者更新緩存或日志等本地資源信息。
集群模式配置
按照以下示例在服務提供方和消費方配置集群模式
3、整合hystrix
Hystrix 旨在通過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監控和配置等功能
1、配置spring-cloud-starter-netflix-hystrix
spring boot官方提供了對hystrix的集成,直接在pom.xml里加入依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>1.4.4.RELEASE</version></dependency>然后在Application類上增加@EnableHystrix來啟用hystrix starter:
@SpringBootApplication @EnableHystrix public class ProviderApplication {2、配置Provider端
在Dubbo的Provider上增加@HystrixCommand配置,這樣子調用就會經過Hystrix代理。
3、配置Consumer端
對于Consumer端,則可以增加一層method調用,并在method上配置@HystrixCommand。當調用出錯時,會走到fallbackMethod = "reliable"的調用里。
dubbo原理
1、RPC原理
一次完整的RPC調用流程(同步調用,異步另說)如下:
1)服務消費方(client)調用以本地調用方式調用服務;
2)client stub接收到調用后負責將方法、參數等組裝成能夠進行網絡傳輸的消息體;
3)client stub找到服務地址,并將消息發送到服務端;
4)server stub收到消息后進行解碼;
5)server stub根據解碼結果調用本地的服務;
6)本地服務執行并將結果返回給server stub;
7)server stub將返回結果打包成消息并發送至消費方;
8)client stub接收到消息,并進行解碼;
9)服務消費方得到最終結果。
RPC框架的目標就是要2~8這些步驟都封裝起來,這些細節對用戶來說是透明的,不可見的。
2、netty通信原理
Netty是一個異步事件驅動的網絡應用程序框架, 用于快速開發可維護的高性能協議服務器和客戶端。它極大地簡化并簡化了TCP和UDP套接字服務器等網絡編程。
BIO:(Blocking IO)
NIO (Non-Blocking IO)
Selector 一般稱 為選擇器 ,也可以翻譯為 多路復用器,
Connect(連接就緒)、Accept(接受就緒)、Read(讀就緒)、Write(寫就緒)
Netty基本原理:
3、dubbo原理
1、dubbo原理 -框架設計
- ? config 配置層:對外配置接口,以 ServiceConfig, ReferenceConfig 為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類
- ? proxy 服務代理層:服務接口透明代理,生成服務的客戶端 Stub 和服務器端 Skeleton, 以 ServiceProxy 為中心,擴展接口為 ProxyFactory
- ? registry 注冊中心層:封裝服務地址的注冊與發現,以服務 URL 為中心,擴展接口為 RegistryFactory, Registry, RegistryService
- ? cluster 路由層:封裝多個提供者的路由及負載均衡,并橋接注冊中心,以 Invoker 為中心,擴展接口為 Cluster, Directory, Router, LoadBalance
- ? monitor 監控層:RPC 調用次數和調用時間監控,以 Statistics 為中心,擴展接口為 MonitorFactory, Monitor, MonitorService
- ? protocol 遠程調用層:封裝 RPC 調用,以 Invocation, Result 為中心,擴展接口為 Protocol, Invoker, Exporter
- ? exchange 信息交換層:封裝請求響應模式,同步轉異步,以 Request, Response 為中心,擴展接口為 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
- ? transport 網絡傳輸層:抽象 mina 和 netty 為統一接口,以 Message 為中心,擴展接口為 Channel, Transporter, Client, Server, Codec
- ? serialize 數據序列化層:可復用的一些工具,擴展接口為 Serialization, ObjectInput, ObjectOutput, ThreadPool
2、dubbo原理 -啟動解析、加載配置信息
3、dubbo原理 -服務暴露
4、dubbo原理 -服務引用
5、dubbo原理 -服務調用
總結
以上是生活随笔為你收集整理的Dubbo使用_尚硅谷视频学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反射的学习(参考尚硅谷视频)
- 下一篇: 哲理故事300篇 下