1. 程式人生 > >微服務中的熔斷機制

微服務中的熔斷機制

一般在微服架構中,有一個元件角色叫熔斷器。顧名思義,熔斷器起的作用就是在特定的場景下關掉當前的通路,從而起到保護整個系統的效果。

在微服務架構中,一般我們的獨立服務是比較多的,每個獨立服務之間劃分責任邊界,並通過約定協議介面來進行通訊。當我們的呼叫鏈路複雜依賴多時,很可能會發生雪崩效應。

假設有這麼一個場景,有A, B, C, D四個獨立服務,A會依賴B,C,D;當D發生負載過高或網路異常等導致響應過慢或超時時,很可能A會因此堆積過多的等待連結,從而導致A的狀態也轉為異常,後面依賴到A的其他服務跟著發生鏈式反應,這將會導致大面積的服務不可用,即使本來是一些沒有依賴到B,C,D的服務。如下圖所示:  

這不是我們希望看到的結果,所以這個時候熔斷器可以派上用場。最簡單的做法,我們為每個依賴服務配置一個熔斷器開關,正常情況下是關閉的,也就是可以正常發起請求;當請求失敗(超時或者其他異常)次數超過預設值時,熔斷器自動開啟,這時所有經過這個熔斷器的請求都會直接返回失敗,並沒有真正到達所依賴的服務上。這時服務A本身仍然是能正常服務的, 如下圖所示: 


那麼熔斷器具體又是怎麼工作的呢?來看下,一個擁有基本功能的熔斷器的狀態機大體是這樣子的: 

主要在三種狀態中轉換:
關閉狀態 :
 當熔斷器處於關閉狀態時,請求是可以被放行的; 
當熔斷器統計的失敗次數觸發開關時,轉為開啟狀態。
開啟狀態 :
當熔斷器處於開啟狀態時,所有請求都是不被放行的,直接返回失敗; 
只有在經過一個設定的時間視窗週期後,熔斷器才會轉換到半開狀態
半開狀態 :
當熔斷器處於半開狀態時,當前只能有一個請求被放行; 
這個被放行的請求獲得遠端服務的響應後,假如是成功的,熔斷器轉換為關閉狀態,否則轉換到開啟狀態。


最後,基於這個狀態機,用Golang實現了一個只包含最基本功能的熔斷器:github.com/moxiaomomo/circuitbreaker, 有興趣可以參考一下,也歡迎指正。

主要用法如下:

// 建立一個熔斷器例項,指定熔斷時間視窗和失敗觸發開關閾值等
cbs := NewCirucuitBreaker(time.Second, 150, 20)
// 向熔斷器註冊command(可以理解為對應的服務請求id)
testcmd := "call_serviceB"
suc := cbs.RegisterCommandAsDefault(testcmd)

// 向熔斷器報告當前command的執行結果(成功或失敗)
cbs.Report(testcmd, false)
cbs.Report(testcmd, true)
// ...

// 向熔斷器詢問當前該command是否能被執行
execAllow := cbs.AllowExec(testcmd)
--------------------- 
作者:moxiaomomo 
來源:CSDN 
原文:https://blog.csdn.net/moxiaomomo/article/details/80776906 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

相關推薦

服務熔斷機制

一般在微服架構中,有一個元件角色叫熔斷器。顧名思義,熔斷器起的作用就是在特定的場景下關掉當前的通路,從而起到保護整個系統的效果。 在微服務架構中,一般我們的獨立服務是比較多的,每個獨立服務之間劃分責任邊界,並通過約定協議介面來進行通訊。當我們的呼叫鏈路複雜依賴多時,很可能會

服務的rpc 請求寫法

ref true reference result bject zed div urn .class 1、采用restmplate 的postForObject RestTemplate template = new RestTemplate();

服務基於Spring Boot的maven分散式專案框架的搭建

專案介紹 在微服務架構中,傳統的 maven 專案已經無法滿足,開始走向分散式架構,本專案主要搭建一個空的 maven 分散式架構,可以運用到實際專案中進行擴充套件,可以在文末獲取原始碼和更多資源。 這裡搭建的是基於 maven 的分散式工程,因為在一個專案中,多個微服務是屬於同

服務基於Spring Boot的maven分布式項目框架的搭建

struct batis tmpl 接收 modules 展現 子模塊 server face 項目介紹 這裏搭建的是基於 maven 的分布式工程,因為在一個項目中,多個微服務是屬於同一個工程,只不過是提供不同的服務而已,再加上 IDEA 是默認一個窗口打開一個項目工程(

Java專案服務新增攔截器實現

目的:專案中需要攔截器的實現,讓沒有登陸的使用者無法通過url來實現頁面的渲染。 實現: 一、繼承HandlerInterceptorAdapter public class LoginInterceptor extends HandlerInterceptorAdapter 二

服務的設計模式

          說到設計模式,大家一般會想到,工廠、單例等24種基本設計模式,當然也會想到併發型模式,生產-消費者模式,執行緒池模式等,但是微服務中用到什麼設計模式了?前兩篇介紹了,挎鬥模式和代表模式,當然這一類設計模式屬於雲設計模式。AzureCAT

Spring Cloud與服務的父Maven模組

文章目錄 專案結構 springcloud-parent中pom.xml springcloud-parent中pom.xml的作用 原始碼 專案結構   接下來我將開始嘗試建立基於SpringCloud的

服務使用領域事件

稍微回想一下計算機硬體的工作原理我們便不難發現,整個計算機的工作過程其實就是一個對事件的處理過程。當你點選滑鼠、敲擊鍵盤或者插上U盤時,計算機便以中斷的形式處理各種外部事件。在軟體開發領域,事件驅動架構(Event Driven Architecture,EDA)早

服務springboot啟動問題

log4j:WARN No appenders could be found for logger (org.springframework.web.context.support.StandardServletEnvironment).log4j:WARN Please i

Chris Richardson 服務系列 第四篇 服務服務發現

這是使用微服務構建應用的第四篇文章。第一篇文章介紹了微服務架構模式並討論了使用微服務的優勢和劣勢,該系列的第二和第三篇文章 描述了微服務架構中通訊的不同方面,本篇文章我們將密切討論下服務發現的問題。 為什麼使用服務發現 設想下,我們寫了一些通過REST API或者Thrift API呼叫某個服務的程式碼,為了

談談服務的 API 閘道器(API Gateway)

前言 又是很久沒寫部落格了,最近一段時間換了新工作,比較忙,所以沒有抽出來太多的時間寫給關注我的粉絲寫一些乾貨了,就有人問我怎麼最近沒有更新部落格了,在這裡給大家抱歉。 那麼,在本篇文章中,我們就一起來探討一下 API 閘道器在整個微服務分散式架構中的一個作用。 背景 我們知道在微服務架構風格中,一個大應用被

服務的模式和反模式

微服務中的常見設計模式 軟體開發者對“四人幫”的《設計模式》一書應該都很熟悉,微服務中也會有一些常見的模式: 部署模式 多服務共享主機/虛機單服務部署單一主機/虛機單服務部署單一容器(Docker)無服務部署(serverless),例如AWS Lambda使用服務部署平

服務的Bad Request

場景描述 我們的系統是基於rest的微服務架構,各個子系統的呼叫都是通過HTTP請求來互動的,並且請求引數要經過base64編碼。 前端時間在做一個數據遷移需求的時候時候,發現總是有一些資料莫名其妙的丟失,當初是根據資料的自增id分段做的遷移,一次遷移一部分。遷移過程會去另

Pod 在服務的運用

本文主要包括 Pod 的基本概念、使用場景,以及如何在時速雲平臺上進行 Pod 的編排部署,希望對大家在進行微服務架構實踐時有所幫助。1.我們先來看一下 Pod 的基本特性Pod 是 Kubernetes 為部署、管理、編排容器化應用提出的概念,也是 Kubernetes 中

Elasticsearch實踐(二)在Springboot服務整合搜尋服務

關於如何用Docker搭建Elasticsearch叢集環境可以參考前一篇:Elasticsearch實踐(一)用Docker搭建Elasticsearch叢集。本文主要介紹,如果在Springboot體系中整合Elasticsearch服務。本文基於:Elas

【原創】大話服務的邊車模式

imp 方式 網格 註冊中心 code -a pri 程序 cat (以下故事純屬虛構,如有雷同純屬巧合) 概念 自從微服務的浪潮席卷了煙哥的公司之後,煙哥的領導內心蠢蠢欲動,指派煙哥去將公司的傳統服務架構改成微服務架構!於是煙哥就喊上了小劉到了一個僻靜的角落探討如何實施!

HTTP同步客戶端類RestTemplate在服務的使用

在Spring Cloud中使用 依賴 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spr

服務臺落地 臺誤區

目前 架構師 資源 決策 lin 特定 上線 git 負載均衡 小結: 1、 微服務中臺不是 /1堆砌技術組件就是中臺 /2擁有服務治理就是中臺 /3增加部分業務功能就是中臺 /4Cloud Native 就是中臺 https://mp.weixin.q

Micronaut 服務使用 Kafka

今天,我們將通過Apache Kafkatopic構建一些彼此非同步通訊的微服務。我們使用Micronaut框架,它為與Kafka整合提供專門的庫。讓我們簡要介紹一下示例系統的架構。我們有四個微型服務:訂單服務,行程服務,司機服務和乘客服務。這些應用程式的實現非常簡單。它們都有記憶體儲存,並連線到同一個Kaf

服務的Kafka與Micronaut

今天,我們將通過Apache Kafka主題構建一些彼此非同步通訊的微服務。我們使用Micronaut框架,它為與Kafka整合提供專門的庫。讓我們簡要介紹一下示例系統的體系結構。我們有四個微型服務:訂單服務,行程服務,司機服務和乘客服務。這些應用程式的實現非常簡單。它們都有記憶體儲存,並連線到同一個Kafk