目前公司使用的 Spring Cloud 整個技術組件,基本包含了上面圖中所包含的,不得不說,Spring Cloud 整個生態真的很強大,使用起來也很方便有效。算法
後面有時間再針對每一個組件進行使用解讀,這篇文章主要說下 Spring Cloud 架構的鏈路圖,順便把本身的思路整理下來,以備查閱。數據庫
閱讀目錄:後端
1、 網關請求流程bash
在 Spring Cloud 整個組件庫中,Spring Cloud Zuul 是最容易被忽視,但也是最重要的,Spring Cloud Zuul 能夠和 Eureka 註冊中心集成,咱們目前使用 Spring Cloud Zuul 的功能以下:服務器
有些功能是 Spring Cloud Zuul 自帶的,好比 Filter 和 Router,有些是結合 Spring Cloud 其餘組件,好比 Ribbon 和 Hystrix。架構
這裏重點介紹下 Filter 過濾器,分爲四個過濾類型:app
另外,關於 oAuth2.0 JWT 的受權驗證,實現的方式有兩種:負載均衡
AccessTokenFilter
複製代碼
咱們目前採用的是第二種方式,這兩種方式都有利有弊,關鍵在於本身的取捨,爲何採用第二種方式?目的就是發揮 Zuul 的做用,對外網關進行統一受權驗證。curl
關於受權 Map,裏面存儲了全部服務接口的配置,示例配置:分佈式
這是咱們目前的配置,是一個靜態的 Map,後面會存儲在 Spring Cloud Config 配置中心,Zuul 啓動時進行加載,利用 Spring Cloud Bus 動態刷新。
關於 Zuul 網關,其實還有不少須要說的,後面有機會再進行鍼對說明。
2、 Eureka 服務治理
Eureka 遵循的是 AP 原則(服務可用性和分區容錯性),是服務治理最理想的遵循 CAP 分佈式原則。
Eureka 集羣中的節點是彼此平級,不像 Consul 有 master/worker 之分,集羣中的 Eureka 節點彼此兩兩註冊,因此,Eureka 集羣最好部署三個節點,這也是咱們目前的部署方式。
服務之間的相互調用,負載有兩種使用方式:
咱們目前打算使用 Ribbon 負載方式,爲何?看下面代碼就知道了:
3、 Config 配置中心
咱們目前配置中心使用的是 Spring Cloud Config,固然你也可使用功能更強大的 Polly(攜程開源),但 Config 目前也能知足咱們的需求,存儲倉庫咱們如今使用的是 Git。
Config 配置中心提供了數據加密功能,你可使用 RSA 的加密方式,這樣存儲在 Git 中的配置都是密文形式,Config Client 獲取加密配置的時候,Config Server 會自動進行解密返回。
配置中心的使用場景,咱們目前主要是兩個地方:
另外,須要說明的是,默認狀況下,若是 Git 中的配置更新了,Config Client 不會進行更新配置,咱們目前的解決方式是,使用 Spring Cloud Bus 進行動態刷新配置(Config Server 中配置),具體的流程:
curl -X POST http://manager1:8180/bus/refresh
複製代碼
4、Hystrix 監控
Hystrix 主要是用於服務熔斷/降級/隔離處理,Hystrix 配置在調用方,當被調用方服務不可用時,觸發 Hystrix 熔斷,會執行指定的 Fallback 方法,進行特殊處理。
我以前覺得,Hystrix 熔斷的觸發條件是服務不可用,也就是服務請求超時(好比服務掛掉了),但我本身測試了下,服務出現 500 錯誤,也會觸發 Hystrix 熔斷,並且會自動忽略 Hystrix 的超時時間設置。
咱們目前使用 Hystrix,主要有兩個地方:
上面圖中,主要畫的是 Hystrix 的監控流程,咱們目前主要使用 RabbitMQ 進行採集傳輸,turbine-server 進行數據流的聚合,hystrix-dashboard 進行圖形化的展現。
5、 服務調用鏈路
服務調用鏈路的概念,就是當服務請求發起時,記錄整個請求鏈路的數據,以備查詢。
目前市面上,幾乎全部服務調用鏈路的實現,理論基礎都是基於 Google Dapper 的那篇論文,其中最重要的概念就是 traceId 和 spanId。
下面我描述下,咱們目前的服務調用鏈路過程:
上面圖中,詳細說明了整個服務調用鏈路的過程,這邊再說下使用的技術棧:
6、ELK 日誌鏈路
上面圖中已經很詳細介紹了下 ELK 的流程,ELK 默認技術棧裏是沒有 Filebeat 的,Logstash 用做日誌收集的時候,CPU 和內存會佔用資源比較大,因此咱們使用輕量化的 Filebeat 進行日誌的收集,Filebeat 部署在每一個業務服務所在的服務器,而後將收集到的日誌數據傳輸到 Logstash,Logstash 能夠部署兩到三臺服務器上,用做日誌的過濾和分析工做,而後再將處理後的日誌數據,傳輸到 ElasticSearch 存儲。
7、統一格式返回