
## 一、Spring Cloud與Netflix
Netflix是一家做視頻網站的公司,之所以要說一下這個公司是因為Spring Cloud在發展之初,Netflix做了很大的貢獻。包括服務注冊中心Eureka、服務調用Ribbon、Feign,服務容錯限流Hystrix、服務網關Zuul等眾多組件都是Netflix貢獻給Spring Cloud社區的。
但這些組件在使用過程中也多多少少的暴露了一些弊病,比如:
* 服務網關Zuul是基于servlet開發的,使用阻塞IO,在高并發情況下性能表現一般。
* 公共服務組件過多,部署一個Spring Cloud微服務,公共服務組件就占用了很多的服務器資源。
所以,很多的廠商就基于Spring Cloud設計理念,開發自己的組件,其中比較著名的就是Spring Cloud Alibaba和攜程的apollo。

上圖中綠色對號的基本上都是Spring Cloud社區第二代組件,也是目前建議使用的組件。圖中紅色X號的組件,都基本上面臨著淘汰與替換。
## 二、核心事件追蹤
筆者一直關心著Spring Cloud社區的發展,下面將近兩年社區的大事件集中展現一下:
* 2018年6月底,Eureka 2.0 開源工作宣告停止,繼續使用風險自負。
* 2018年11月底,Hystrix 宣布不再在開源版本上提供新功能。
* 2018年12月,Spring官方宣布Netflix的相關項目進入維護模式(Maintenance Mode)。
從此,Spring Cloud逐漸告別netflix時代。
* 2018年10月31日,Spring Cloud Alibaba正式入駐了Spring Cloud官方孵化器,并在maven中央庫發布了第一個版本。
與此同時,Spring Cloud團隊內部維護的組件也在積極的更新換代。
## 二、服務注冊中心選型
* Eureka:Spring Cloud與Netflix的大兒子,出生的時候家里條件一般,長大后素質有限。
* Nacos:后起之秀,曾經Spring Cloud眼中“別人家的孩子”,已經納入收養范圍(Spring Cloud Alibaba孵化項目)。
* Apache Zookeeper:關系戶,與hadoop關系比較好
* etcd:關系戶,與kubernetes關系比較好
* Consul:關系戶,曾經與docker關系比較好
如果你的應用已經使用到了hadoop、kubernetes、docker,在Spring Cloud實施過程中可以考慮使用其關系戶組件,避免搭建兩套注冊中心,節省資源。但是二者兼容使用說說容易,真正用起來還需要功夫。目前看,筆者覺得最佳選擇應該是Nacos。
## 三、分布式配置管理
目前可選的分布式配置管理中心,有阿里的Nacos、攜程的Apollo、和Spring Cloud Config。
* 如果你希望完成單純的分布式配置集中管理,其實三者都能滿足你的需求。
* 如果你考慮到已經用Nacos實現了服務注冊中心,不想單獨搞出來一個配置管理中心,合二為一的話,nacoos可能是你的最佳選擇
* 攜程的Apollo與nacos很多相似之處,有頗多的亮點。從筆者的使用感受而言,目前apollo從文檔細節到方便度要好于nacos(截止2020年4月)。但是nacos畢竟開源時間較短,依托alibaba的支持,有很大的潛力和發展空間。
* spring cloud config對比其他兩者,在功能以及友好度方面都遜色。唯一的優點可能是它比較輕量級。
| 對比項目/配置中心 | spring cloud **config** | **apollo** | **nacos(重點)** |
| --- | --- | --- | --- |
| 開源時間 | 2014.9 | 2016.5 | 2018.6 |
| 配置實時推送 | 弱支持(Spring Cloud Bus) | 支持(HTTP長輪詢1s內) | 支持(HTTP長輪詢1s內) |
| 版本管理 | 支持(Git) | 自動管理 | 自動管理 |
| 配置回滾 | 弱支持(Git+Bus) | 支持 | 支持 |
| 配置的灰度發布 | 理念上支持,可操作性不強 | 支持 | 1.1.0開始支持 |
| 權限管理 | 不支持(沒有區分用戶、角色、權限的概念) | 支持 | 1.2.0開始支持 |
| 多集群多環境 | 對集群概念支持較弱 | 支持 | 支持 |
| 多語言 | 只支持Java | Go,C++,Python,Java,.net,OpenAPI | Python,Java,Nodejs,OpenAPI |
| 分布式高可用最小集群數量 | **Config**\-Server2+Git+MQ | **Config**2+Admin3+Portal\*2+Mysql=8 | **Nacos**\*3+MySql=4 |
| 配置格式校驗 | 不支持 | 支持 | 支持 |
| 通信協議 | HTTP和AMQP | HTTP | HTTP |
| 數據一致性 | Git保證數據一致性,**Config**\-Server從Git讀取數據 | 數據庫模擬消息隊列,**Apollo**定時讀消息 | HTTP異步通知 |
## 三、服務網關
服務網關這塊就不多說了,沒有任何懸念,Spring Cloud Gateway在各方面都碾壓Zuul,Zuul2也基本上是胎死腹中。還有一些第三方廠商開發的微服務網關,但基本上沒有形成氣候!
## 四、熔斷限流
#### Hystrix
2018年12月,Spring官方宣布Netflix的相關項目進入維護模式(Maintenance Mode)。不再開發新的功能,但是Hystrix整體上還是比較穩定的,對于老用戶不必更換,影響也不大。
#### resilience4j
Hystrix停更之后,Netflix官方推薦使用resilience4j(https://github.com/resilience4j/resilience4j ),它是一個輕量、易用、可組裝的高可用框架,支持熔斷、高頻控制、隔離、限流、限時、重試等多種高可用機制。
#### Sentinel(重點)
Sentinel(https://github.com/alibaba/Sentinel )是阿里中間件團隊開源的,面向分布式服務架構的輕量級高可用流量控制組件,主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助用戶保護服務的穩定性。
https://github.com/alibaba/Sentinel/wiki/Guideline:-%E4%BB%8E-Hystrix-%E8%BF%81%E7%A7%BB%E5%88%B0-Sentinel
|Sentinel | Hystrix | resilience4j |
| --- | --- | --- |
| 隔離策略 | 信號量隔離(并發線程數限流) | 線程池隔離/信號量隔離 | 信號量隔離 |
| 熔斷降級策略 | 基于響應時間、異常比率、異常數 | 基于異常比率 | 基于異常比率、響應時間 |
| 實時統計實現 | 滑動窗口(LeapArray) | 滑動窗口(基于 RxJava) | Ring Bit Buffer |
| 動態規則配置 | 支持多種數據源 | 支持多種數據源 | 有限支持 |
| 擴展性 | 多個擴展點 | 插件的形式 | 接口的形式 |
| 基于注解的支持 | 支持 | 支持 | 支持 |
| 限流 | 基于 QPS,支持基于調用關系的限流 | 有限的支持 | Rate Limiter |
| 流量整形 | 支持預熱模式、勻速器模式、預熱排隊模式 | 不支持 | 簡單的 Rate Limiter 模式 |
| 系統自適應保護 | 支持 | 不支持 | 不支持 |
| 控制臺 | 提供開箱即用的控制臺,可配置規則、查看秒級監控、機器發現等 | 簡單的監控查看 | 不提供控制臺,可對接其它監控系統 |
- 文檔內容簡介(一定要看)
- 筆者的其他作品推薦
- vue深入淺出系列
- 手摸手教你學SpringBoot2.0
- Spring Security-JWT-OAuth2一本通
- 實戰前后端分離RBAC權限管理系統
- 模塊與代碼分支說明
- dongbb-cloud項目核心架構
- 微服務架構進化論
- SpringBoot與Cloud選型兼容
- Spring Cloud組件的選型
- 單體應用拆分微服務
- 單體應用與微服務對比
- 微服務設計拆分原則
- 新建父工程及子模塊框架
- 通用微服務初始化模塊構建
- 持久層模塊單獨拆分
- 拆分rbac權限管理微服務
- Hello-microservice
- 構建eureka服務注冊中心
- 向服務注冊中心注冊服務
- 第一個微服務調用
- 遠程服務調用
- HttpClient遠程服務調用
- RestTemplate遠程服務調用
- RestTemplate多實例負載均衡
- Ribbon調用流程源碼解析
- Ribbon負載均衡策略源碼解析
- Ribbon重試機制與饑餓加載
- Ribbon自定義負載均衡策略
- Feign與OpenFeign
- Feign設計原理源碼解析
- Feign請求壓縮與超時等配置
- 服務注冊與發現
- 白話服務注冊與發現
- DiscoveryClient服務發現
- Eureka集群環境構建(linux)
- Eureka集群多網卡環境ip設置
- Eureka集群服務注冊與安全認證
- Eureka自我保護與健康檢查
- 主流服務注冊中心對比(含nacos)
- zookeeper概念及功能簡介
- zookeeper-linux集群安裝
- zookeeper服務注冊與發現
- consul概念及功能介紹
- consul-linux集群安裝
- consul服務注冊與發現
- 通用-auatator導致401問題
- 分布式配置中心-apollo
- 服務配置中心概念及使用場景
- apollo概念功能簡介
- apollo架構詳解
- apollo分布式部署之Portal
- apollo分布式部署之環境區分
- apollo項目權限管理實戰
- apollo-java客戶端基礎
- apollo與SpringCloud服務集成
- apollo實例配置熱更新
- apollo命名空間與集群
- apollo灰度發布(日志熱更新為例)
- SpringCloudConfig配置中心
- config-git配置文件倉庫
- config配置中心搭建與測試
- config客戶端基礎
- config配置安全認證
- config客戶端配置刷新
- config配置中心高可用
- BUS消息總線
- bus消息總線簡介
- docker安裝rabbitMQ
- 基于rabbitMQ的消息總線
- bus實現批量配置刷新
- alibaba-nacos
- nacos介紹與單機部署
- nacos集群部署方式(linux)
- nacos服務注冊與發現
- nacos服務注冊中心詳解
- nacos客戶端配置加載
- nacos客戶端配置刷新
- nacos服務配置隔離與共享
- nacos配置Beta發布
- 服務熔斷降級hystrix
- 服務降級&熔斷&限流
- Hystrix集成并實現服務熔斷
- Jemter模擬觸發服務熔斷
- Hystrix服務降級fallback
- Hystrix結合Feign服務降級
- 遠程服務調用異常傳遞的問題
- Hystrix-Feign異常攔截與處理
- Hystrix-DashBoard單服務監控
- Hystrix-dashboard集群監控
- 分布式系統流量衛兵sentinel
- sentinel簡介與安裝
- 客戶端集成與實時監控
- 實戰流控規則-QPS限流
- 實戰流控規則-線程數限流
- 實戰流控規則-關聯限流
- 實戰流控規則-鏈路限流
- 實戰流控效果-WarmUp
- 實戰流控效果-勻速排隊
- BlockException處理
- 實戰熔斷降級-RT
- 實戰熔斷降級-異常數與比例
- DegradeException處理
- 注解與異常的歸納總結
- Feign降級及異常傳遞攔截
- 動態規則nacos集中存儲
- 熱點參數限流
- 系統自適應限流
- 微服務網關-GateWay
- 還有必要學習Zuul么?
- 簡介與非阻塞異步IO模型
- GateWay概念與流程
- 新建一個GateWay項目
- 通用Predicate的使用
- 自定義PredicateFactory
- 編碼方式構建靜態路由
- Filter過濾器介紹與使用
- 自定義過濾器Filter
- 網關請求轉發負載均衡
- 結合nacos實現動態路由配置
- 整合Sentinel實現資源限流
- 跨域訪問配置
- 網關層面全局異常處理
- 微服務網關安全認證-JWT篇
- Gateway-JWT認證鑒權流程
- 登錄認證JWT令牌頒發
- 全局過濾器實現JWT鑒權
- 微服務自身內部的權限管理
- 微服務安全認證-OAuth篇(撰寫中)