1.dubbo多協(xié)議支持
某些場景下,可能接口是使用的老的協(xié)議去發(fā)布的,此時希望接口能夠以一種新的協(xié)議去發(fā)布,老的服務(wù)按照老的協(xié)議去調(diào)用,新的服務(wù)按照新的協(xié)議去調(diào)用 而dubbo服務(wù)就可以支持發(fā)布多種協(xié)議,如 dubbo / hessian / thrift / grps http2.0/ protobuff, rest 等,如果要切換某種協(xié)議,只需要添加該協(xié)議對應的依賴包即可
以rest協(xié)議為例,它是基于JAX-RS 來實現(xiàn)的,dubbo發(fā)布rest服務(wù)是基于 RESTEasy的,同時需要容器的支持, 先修改 配置文件,指定服務(wù)發(fā)布的協(xié)議:
然后在服務(wù)實現(xiàn)類上面指定發(fā)布的協(xié)議:
@DubboService(registry = {“shanghai”, “nanjing”}, protocol = {“dubbo”,“rest”}) 注解中配置protocol = {“dubbo”,“rest”} , 那么SayHelloServiceImpl 這個類會發(fā)布基于dubbo協(xié)議和rest協(xié)議的服務(wù),既可以通過dubbo協(xié)議來訪問服務(wù),也可以通過rest協(xié)議來訪問服務(wù),但是rest協(xié)議還需要額外加個配置:
(1) pom依賴
<!-- 基于resteasy -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.13.0.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.13.0.Final</version>
</dependency>
<!-- jetty依賴,須注意與dubbo版本兼容問題-->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.19.v20190610</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.4.19.v20190610</version>
</dependency>
添加jetty容器,注意與dubbo版本的兼容關(guān)系
通過HTTP協(xié)議發(fā)布rest風格的服務(wù):
啟動注冊中心(這里用zookeeper)和provider服務(wù),這樣就可以通過瀏覽器去訪問這個rest協(xié)議的接口了:http://localhost:8888/say
服務(wù)的消費方也可以指定使用dubbo協(xié)議來進行消費:
啟動消費方服務(wù)進行調(diào)用:
provider端消息打?。?br>
2.Dubbo負載均衡
從dubbo架構(gòu)圖中可以看到,provider如果有多個的話,consumer調(diào)用provider時必然會涉及到負載均衡,dubbo已經(jīng)默認配置了負載均衡策略,即使不配置,也會有默認的的負載均衡,從dubbo源碼中可以看到dubbo可以支持如下5種負載均衡算法:
加權(quán)隨機負載均衡(默認的負載均衡算法);
加權(quán)輪詢負載均衡—— 根據(jù)權(quán)重大小生成區(qū)間,然后生成一個隨機數(shù),根據(jù)隨機數(shù)所落的區(qū)間來決定哪個服務(wù)器來處理請求
一致性hash算法—— 解決數(shù)據(jù)分片場景下,增加/減少節(jié)點后hash計算帶來的數(shù)據(jù)遷移的問題(本質(zhì)是數(shù)據(jù)讀取不到,假設(shè)存入時hash%服務(wù)器數(shù)量后數(shù)據(jù)存到了第一臺服務(wù)器,這時擴容了,要去查詢這個數(shù)據(jù),再次用相同參數(shù)對服務(wù)器數(shù)量進行hash取模運算,得到的服務(wù)器可能就不是當初存儲數(shù)據(jù)的那臺服務(wù)器了) ,dubbo的一致性hash算法默認根據(jù)第一個參數(shù)進行取模
一致性hash算法詳細介紹: https://www.cnblogs.com/myseries/p/10956835.html
配置負載均衡算法:
如果負載均衡算法配置的是一致性hash算法,針對請求參數(shù)相同的請求,會落到同一臺服務(wù)器上。
負載均衡算法名字如果不知道的話,可以去具體的負載均衡算法類里面找:
3.集群容錯
容忍錯誤的能力(出現(xiàn)錯誤之后怎么去處理)
分布式集群下,客戶端請求會存在三態(tài)問題:成功/失敗/未知
- failover cluster(默認)
失敗自動重試(重試其他服務(wù)器)—— 失敗自動切換
@DubboService(cluster = “failover”, retries = 2, registry = {“shanghai”, “nanjing”}, version = “2.0”)
這種場景下,如果時事務(wù)型操作,需要保證冪等,多次重試的結(jié)果相同 并且最終成功 - failfast cluster
快速失敗 ,如果插入數(shù)據(jù)失敗,立即報錯,適用于不需要冪等的場景 - failsafe cluster
失敗安全,出現(xiàn)異常時直接將異常吞掉。 - failback cluster
失敗自動恢復 :記錄失敗請求,定時重發(fā),保證最終一致 - forking cluster
并行調(diào)用多個服務(wù)節(jié)點,只要其中一個節(jié)點成功返回,就直接用這個節(jié)點的結(jié)果進行返回 - broadcast cluster
廣播調(diào)用,一個請求調(diào)用所有的服務(wù)提供者,只要其中一個節(jié)點報錯,則認為這個請求失??;
比如更新服務(wù)器上的緩存等操作
4.Dubbo泛化
dubbo泛化解決的問題:針對跨語言調(diào)用dubbo服務(wù)的場景下,服務(wù)的消費端沒有公共契約(api服務(wù))時,如何去調(diào)用dubbo服務(wù);
這種場景下,接口定義直接寫在服務(wù)提供端(而不是api服務(wù)中),服務(wù)的消費端
消費方泛化調(diào)用:
啟動nacos注冊中心,訪問 demo接口:
代碼:https://gitee.com/liuch890228/dubbo-learn/tree/dubbo-protocol-rest文章來源:http://www.zghlxwxcb.cn/news/detail-438259.html
5.服務(wù)降級
dubbo的服務(wù)降級很容易實現(xiàn),只需要在DubboReference注解中加一個mock屬性,值為新增的服務(wù)降級處理類的全路徑名
啟動nacos注冊中心和provider,consumer測試:
演示代碼:https://gitee.com/liuch890228/dubbo-learn/tree/dubbo-fallback文章來源地址http://www.zghlxwxcb.cn/news/detail-438259.html
6.Dubbo常用配置
- 啟動檢查
解決服務(wù)之間相互依賴時,被依賴的服務(wù)未啟動導致當前服務(wù)無法啟動的問題
(1)對消費端服務(wù)
如上,DubboReference注解配置check=true則表示開啟啟動檢查,此時provider未啟動,則會啟動失敗,如果改為false則能夠正常啟動(consumer中所有使用 @DubboReference注解的地方 都需要加)
(2)針對注冊中心不可用的場景,配置dubbo.registry.check=false 則是 關(guān)閉注冊中心啟動時檢查。
更多啟動檢查配置,參考: dubbo啟動檢查 - 主機綁定
源碼:org.apache.dubbo.config.ServiceConfig#findConfigedHosts
(1)查找環(huán)境變量中是否存在啟動參數(shù) DUBBO_IP_TO_BIND,(-d DUBBO_IP_TO_BIND=xx )如果存在則取這個值作為服務(wù)注冊的ip
(2)讀取配置文件dubbo.protocols.dubbo.host 作為服務(wù)注冊的ip
(3)hostToBind = InetAddress.getLocalHost().getHostAddress(); 獲取本機IP地址作為服務(wù)注冊的ip
(4)如果(3)中 獲取的ip不合法,則通過socket去連接注冊中心獲取本機IP:
(5)輪詢本機網(wǎng)卡,找到合適的IP
上面獲取到的ip是bindIP, 如果需要作為服務(wù)注冊中心的ip,還會讀取環(huán)境變量 DUBBO_IP_TO_REGISTRY的值,如果這個值沒配置,才會將綁定ip作為注冊中心的ip - 配置優(yōu)先級
方法級別的配置> 接口級別的配置
客戶端沒配置,服務(wù)提供端為準
客戶端和服務(wù)端都配置,以客戶端為準
配置加載優(yōu)先級:環(huán)境變量 外部配置(application.properties) API 本地文件(dubbo.properties)
到了這里,關(guān)于dubbo高級特性分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!