Dubbo 常见服务治理策略
1、Dubbo體系結(jié)構(gòu)
2、Dubbo容錯機(jī)制
Dubbo集群容錯架構(gòu)圖
各節(jié)點(diǎn)關(guān)系:
- 這里的Invoker是Provider的一個可調(diào)用Service的抽象,Invoker封裝了Provider地址及Service接口信息。
- Directory代表多個Invoker,可以把它看成List,但與List不同的是,它的值可能是動態(tài)變化的,比如注冊中心推送變更。
- Cluster將Directory中的多個Invoker偽裝成一個Invoker,對上層透明,偽裝過程包含了容錯邏輯,調(diào)用失敗后,重試另一個。
- Router負(fù)責(zé)從多個Invoker中按路由規(guī)則選出子集,比如讀寫分離,應(yīng)用隔離等。
- LoadBalance負(fù)責(zé)從多個Invoker中選出具體的一個用于本次調(diào)用,選的過程包含了負(fù)載均衡算法,調(diào)用失敗后,需要重選。
2.1 集群容錯模式
Failover Cluster
- 失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。(缺省)
- 通常用于讀操作,但重試會帶來更長延遲。
- 可通過retries="2"來設(shè)置重試次數(shù)(不含第一次)。
Failfast Cluster
- 快速失敗,只發(fā)起一次調(diào)用,失敗立即報(bào)錯。
- 通常用于非冪等性的寫操作,比如新增記錄。
Failsafe Cluster
- 失敗安全,出現(xiàn)異常時,直接忽略。
- 通常用于寫入審計(jì)日志等操作。
Failback Cluster
- 失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。
- 通常用于消息通知操作。
Forking Cluster
- 并行調(diào)用多個服務(wù)器,只要一個成功即返回。
- 通常用于實(shí)時性要求較高的讀操作,但需要浪費(fèi)更多服務(wù)資源。
- 可通過forks="2"來設(shè)置最大并行數(shù)。
Broadcast Cluster
- 廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報(bào)錯則報(bào)錯。(2.1.0開始支持)
- 通常用于通知所有提供者更新緩存或日志等本地資源信息。
3、Dubbo服務(wù)降級
綜述:
Dubbo服務(wù)降級主要包含兩點(diǎn):屏蔽(mock=force,Dubbo-admin配置)和容錯(mock=fail,Mock)。
使用Dubbo時,可能會遇到以下問題:
1)多個服務(wù)之間可能由于服務(wù)沒有啟動或者網(wǎng)絡(luò)不通,調(diào)用中會出現(xiàn)遠(yuǎn)程調(diào)用失敗;
mock=force:return+null 表示消費(fèi)方對該服務(wù)的方法調(diào)用都直接返回 null值,不發(fā)起遠(yuǎn)程調(diào)用。用來屏蔽不重要服務(wù)不可用時對調(diào)用方的影響。
還可以改為 mock=fail:return+null 表示消費(fèi)方對該服務(wù)的方法調(diào)用在失敗后,再返回 null值,不拋異常。用來容忍不重要服務(wù)不穩(wěn)定時對調(diào)用方的影響。
以上兩個問題可以使用Dubbo的服務(wù)降級來實(shí)現(xiàn);
即:在服務(wù)宕掉或者并發(fā)數(shù)太高導(dǎo)致的RpcException異常時,進(jìn)行友好的處理或者提示,而不是內(nèi)部報(bào)錯導(dǎo)致系統(tǒng)不可用。
查看dubbo的官方文檔,可以發(fā)現(xiàn)有個mock的配置,mock只在出現(xiàn)非業(yè)務(wù)異常(比如超時,網(wǎng)絡(luò)異常等)時執(zhí)行。mock的配置支持兩種,一種為boolean值,默認(rèn)的為false。如果配置為true,則缺省使用mock類名,即類名+Mock后綴;另外一種則是配置返回默認(rèn)字符串,如:”return null”或者"return 123456",可以很簡單的忽略掉異常。
/**接口定義*/ public interface IUser {public void addUser(User u);public User getUserById(int id);}/**實(shí)現(xiàn)類*/ public class UserImpl implements IUser {private static List<User> USER_LIST = new ArrayList<User>();static{for(int i=0;i<10;i++){User u = new User();u.setAddress("address"+i);u.setId(i);u.setName("name"+i);USER_LIST.add(u);}}public void addUser(User u) {USER_LIST.add(u);System.out.println("total:"+USER_LIST.size());}public User getUserById(int id) {for(int i=0;i<USER_LIST.size();i++){if(USER_LIST.get(i).getId() == id){return USER_LIST.get(i);}}return null;} }public class IUserMock implements IUser {@Overridepublic void addUser(User u) {throw new RuntimeException("add user fail!");}@Overridepublic User getUserById(int id) {return null;} } <dubbo:reference id="iUser" interface="com.dubbosample.iface.IUser" timeout="10000" check="false" mock="true"><dubbo:reference id="iUser" interface="com.dubbosample.iface.IUser" timeout="10000" check="false" mock="return null">以上配置還可以在dubbo-admin界面中配置
分別是屏蔽和容錯:
其中屏蔽只能在dubbo-admin中配置,不能在dubbo配置文件里配置
屏蔽:force.mock (即:屏蔽請求,直接返回某個值,如上面的字符串,mock=“return 123456”);
容錯:fail.mock (即:允許請求,在請求失敗的時候,再返回某個值,如:mock=“fail:return 123456”);
4、Dubbo服務(wù)限流
Dubbo限流主要依賴Sentinel(哨兵)中間件一起使用
服務(wù)提供端限流:
對服務(wù)提供方的限流可分為服務(wù)提供方的自我保護(hù)能力和服務(wù)提供方對服務(wù)消費(fèi)方的請求分配能力這兩個維度。
QPS & 定向限流
服務(wù)消費(fèi)端限流:
對服務(wù)提供方的限流可分為對控制并發(fā)線程數(shù),和服務(wù)降級兩個維度。
詳見:
https://yq.aliyun.com/articles/624053?utm_content=m_1000013383
拓展:
https://blog.csdn.net/world_snow/article/details/79080314
5、Dubbo負(fù)載均衡
dubbo有四種負(fù)載均衡的方式:
1)RandomLoadBalance:加權(quán)隨機(jī)算法(默認(rèn))
2)LeastActiveLoadBalance:最小活躍負(fù)載均衡
3)ConsistentHashLoadBalance:一致性hash負(fù)載均衡
4)RoundRobinLoadBalance:加權(quán)輪詢負(fù)載均衡
6、Dubbo結(jié)果緩存
https://dubbo.apache.org/zh-cn/docs/user/quick-start.html
7、
總結(jié)
以上是生活随笔為你收集整理的Dubbo 常见服务治理策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吃香蕉可以减肥吗
- 下一篇: 中药泡脚真的能减肥吗