現象:zookeeper註冊中心宕機,還可以消費dubbo暴露的服務。
原因:健壯性
l 監控中心宕掉不影響使用,只是丟失部分取樣資料
l 資料庫宕掉後,註冊中心仍能通過快取提供服務列表查詢,但不能註冊新服務
l 註冊中心對等集群,任意一台宕掉後,將自動切換到另一台
l註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地快取通訊
l 服務提供者無狀態,任意一台宕掉後,不影響使用
l 服務提供者全部宕掉後,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復
高可用:通過設計,減少系統不能提供服務的時間;
dubbo直連:
直接連線到伺服器ip位址,繞過zookeeper
在集群負載均衡時,dubbo 提供了多種均衡策略,預設為 random 隨機呼叫。
負載均衡策略
random loadbalance
隨機,按權重設定隨機概率。
在乙個截面上碰撞的概率高,但呼叫量越大分布越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。
roundrobin loadbalance
輪循,按公約後的權重設定輪循比率。
存在慢的提供者累積請求的問題,比如:第二台機器很慢,但沒掛,當請求調到第二台時就卡在那,久而久之,所有請求都卡在調到第二台上。
leastactive loadbalance
最少活躍呼叫數,相同活躍數的隨機,活躍數指呼叫前後計數差。
使慢的提供者收到更少請求,因為越慢的提供者的呼叫前後計數差會越大。
consistenthash loadbalance
一致性 hash,相同引數的請求總是發到同一提供者。
當某一台提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。演算法參見:
預設只對第乙個引數 hash,如果要修改,請配置
預設用 160 份虛擬節點,如果要修改,請配置
什麼是服務降級?
當伺服器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放伺服器資源以保證核心交易正常運作或高效運作。
可以通過服務降級功能臨時遮蔽某個出錯的非關鍵服務,並定義降級後的返回策略。
向註冊中心寫入動態配置覆蓋規則:
其中:l mock=force:return+null 表示消費方對該服務的方法呼叫都直接返回 null 值,不發起遠端呼叫。用來遮蔽不重要服務不可用時對呼叫方的影響。【控制台,遮蔽】
l 還可以改為 mock=fail:return+null 表示消費方對該服務的方法呼叫在失敗後,再返回 null 值,不拋異常。用來容忍不重要服務不穩定時對呼叫方的影響。【控制台,容錯】
在集群呼叫失敗時,dubbo 提供了多種容錯方案,預設為 failover 重試。
集群容錯模式
failover cluster
失敗自動切換,當出現失敗,重試其它伺服器。通常用於讀操作,但重試會帶來更長延遲。可通過 retries="2" 來設定重試次數(不含第一次)。
重試次數配置如下:或或
failfast cluster
快速失敗,只發起一次呼叫,失敗立即報錯。通常用於非冪等性的寫操作,比如新增記錄。
failsafe cluster
失敗安全,出現異常時,直接忽略。通常用於寫入審計日誌等操作。
failback cluster
失敗自動恢復,後台記錄失敗請求,定時重發。通常用於訊息通知操作。
forking cluster
並行呼叫多個伺服器,只要乙個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設定最大並行數。
broadcast cluster
廣播呼叫所有提供者,逐個呼叫,任意一台報錯則報錯 [2]。通常用於通知所有提供者更新快取或日誌等本地資源資訊。
集群模式配置
按照以下示例在服務提供方和消費方配置集群模式
或hystrix 旨在通過控制那些訪問遠端系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。hystrix具備擁有回退機制和斷路器功能的執行緒和訊號隔離,請求快取和請求打包,以及監控和配置等功能
1、配置spring-cloud-starter-netflix-hystrix
spring boot官方提供了對hystrix的整合,直接在pom.xml裡加入依賴:
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
1.4.4.release
@enablehystrix
2、配置provider端
在dubbo的provider上增加@hystrixcommand配置,這樣子呼叫就會經過hystrix**。
@service(version = "1.0.0")
public class helloserviceimpl implements helloservice )
@override
public string sayhello(string name) {
// system.out.println("async provider received: " + name);
// return "annotation: hello, " + name;
throw new runtimeexception("exception to show hystrix enabled.");
3、配置consumer端
對於consumer端,則可以增加一層method呼叫,並在method上配置@hystrixcommand。當呼叫出錯時,會走到fallbackmethod = "reliable"的呼叫裡。
@reference(version = "1.0.0")
private helloservice demoservice;
@hystrixcommand(fallbackmethod = "reliable")
public string dosayhello(string name) {
return demoservice.sayhello(name);
public string reliable(string name) {
return "hystrix fallback value";
架構要素 高可用性
實現高可用架構的主要手段是資料和服務的冗餘備份及失效轉移。高可用的應用 應用層主要處理 應用的業務邏輯,因此也稱業務邏輯層,應用的乙個顯著特點是應用的無狀態。所謂無狀態的應用是指應用伺服器不儲存業務的上下文資訊,而僅根據每次請求提交的資料進行相應的業務邏輯處理,多個服務例項 伺服器 之間完全對等,請...
三 vault 高可用性
高可用 vault用於生產環境的私密資訊管理,基於此,vault服務死機會影響到下游的所有使用者,vault被設計的支援高可用部署,降低一台機器或乙個程序宕掉時的破壞性,設計概述 vault的設計目的在於使其在短時間宕機時能保障vault的高可用,而不是水平可伸縮性。vault通常受限於與儲存庫 s...
高可用性Cache池
前段時間開發上線了乙個cache池,使用雙層cache池冗餘,宕掉一台機器的cache失效從1 n降到1 n 2。如果2層cache池分開機器部署,失效率將會降到0。上線不久剛好碰上一次宕機事故,效果很好。該應用有16臺cache伺服器,高峰時每秒訪問約20萬次,平時的命中率約為99.95 宕掉一台...