微服務架構技術選型
綜述
微服務架構是當前主流的分布式應用系統架構體系,而 Spring Cloud 當屬其中翹楚。
SpringCloud 是一套微服務架構的規范,抽象了一套通用的開發模式,它的目的是通過抽象出這套通用的模式,讓開發者更快更好地開發業務。
Spring Cloud Netflix 是由 Netflix 公司提供的一套相對完整成熟的 Spring Cloud 微服務實現方案,包括 Ribbon、Feign、Eureka、Hystrix 等一整套組件。
Spring Cloud Alibaba 是由 Alibaba 公司 提供的新晉的 Spring Cloud 微服務實現方案,包括 Nacos、Sentinel、Dubbo、Seata 等開源套件。
微服務核心:服務注冊與發現、配置中心、客戶端代理、負載均衡、熔斷降級限流、網關、鏈路追蹤。
一、Spring Cloud
1、簡介
Spring Cloud 是一個基於 SpringBoot 實現的微服務架構開發工具。
它為微服務架構中涉及的配置管理、服務治理、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分布式會話和集群狀態管理等操作
提供了一種簡單的開發方式。
2、發展歷程
2014年10月7日 privotal 發布了第一個Spring Cloud的版本:1.0.0.M1。
2016 年 1 月發布第一個 Angel.SR5 版本,
2017 年初,Spring Cloud迭代到E版本,對應SpringBoot 4.x,達到最穩定的狀態,各個環節的變化變慢,趨於穩定。
到 2020 年 3 月發布 Hoxton.SR3 版本。
Spring Cloud 在 2019 年 12 月對外宣布后續 RoadMap:
下一個版本 Ilford 版本是一個大版本。這個版本基於 Spring Framework 5.3 & Spring Boot 2.4,會在 2020 Q4 左右發布;
3、組件
- Spring Cloud Netflix:核心組件,對多個Netflix OSS 開源套件進行整合。
- Spring Cloud Alibaba:Alibaba提供的微服務開發的一站式解決方案。
- Spring Cloud Config:配置管理工具。支持使用GIT、SVN、文件存儲配置內容,可以使用它實現應用配置的外部化存儲,並支持客戶端配置信息刷新、加密/解密配置內容等。
- Spring Cloud Bus:事件、消息總線,用於傳播集群中的狀態變化或事件,以觸發后續的處理,比如用來動態刷新配置。
- Spring Cloud Cluster:針對ZooKeeper、Redis、Hazelcast、Consul的選舉算法和通用狀態模式的實現。
- Spring Cloud Cloudfoundry:與PivotalCloudfoundry的整合支持。
- Spring Cloud Consul:服務發現與配置管理工具。
- Spring Cloud Stream:通過Redis、Rabbit、或者Kafka實現的消費微服務,可以通過簡單的聲明式模型來發送和接受消息。
- Spring Cloud AWS:用於簡化整合AmazonWebService的組件。
- Spring Cloud Security:安全工具包,提供在Zuul代理中對OAuth2 客戶端請求的中繼器。
- Spring Cloud Sleuth:Spring Cloud應用的分布式跟蹤實現,可以完美整合Zipkin。
- Spring Cloud ZooKeeper:基於Zookeeper的服務發現與配置管理組件。
- Spring Cloud Starters:Spring Cloud 的基礎組件,它是基於SpringBoot風格項目的基礎依賴模塊。
- Spring Cloud CLI: 用於在Groovy中快速創建SpringCloud應用的SpringBoot CLI 插件。
二、Spring Cloud Netflix
1、簡介
Spring Cloud Netflix 是 Netflix推出的一套基於 Spring Cloud 微服務規范的微服務架構套件的具體實現。是目前比較成熟的 Spring Cloud 微服務實現方案。
2、發展歷程
3、發展趨勢
Eureka:
1.x 開源項目維護中;
最新Release版本:v1.9.25
最新發布時間:2020.7.1
2.x 開源項目停止;
Hystrix:
維護模式:
最新Release版本:Re-release stable 1.5.11 as 1.5.18
最新發布時間:2018.11.17
Netflix 官方推薦替換方案:Resilience4j
Ribbon
最新Release版本:v2.7.17
最新發布時間:2019.5.30
Feign
停止維護
代替方案:OpenFeign
最新Release版本:OpenFeign 10.10.1
最新發布時間:2020.4.27
Zuul
最新Release版本:v2.1.5 - Minor fixes
最新發布時間:2019.7.16
4、主要功能
主要提供的功能包括:服務發現、斷路器和監控、智能路由、客戶端負載均衡等。
5、主要組件
- Eureka:服務治理組件,包含服務注冊中心,服務注冊與發現機制的實現。
- Ribbon:客戶端負載均衡的服務調用組件。
- Feign:基於Ribbon和Hystrix的聲明式服務調用組件。
- Zuul:網關組件,提供智能路由、訪問過濾等功能。
- Hystrix:容錯管理組件,實現斷路器模式,幫助服務依賴中出現的延遲和為故障提供強大的容錯能力。
- Hystrix Dashboard:監控面板,他提供了一個界面,可以監控各個服務上的服務調用所消耗的時間等。
- Turbine:監控聚合,使用Hystrix監控,我們需要打開每一個服務實例的監控信息來查看。而Turbine可以幫助我們把所有的服務實例的監控信息聚合到一個地方統一查看。這樣就不需要挨個打開一個個的頁面一個個查看。
- Archaius:外部化配置組件。
三、Spring Cloud Alibaba
1、簡介
Spring Cloud Alibaba 致力於提供微服務開發的一站式解決方案。
此項目包含開發分布式應用微服務的必需組件,方便開發者通過 Spring Cloud 編程模型輕松使用這些組件來開發分布式應用服務。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以將 Spring Cloud 應用接入阿里微服務解決方案,
通過阿里中間件來迅速搭建分布式應用系統。
2、發展歷程
- 2018年7月27日 在 Spring Cloud 孵化器倉庫提交第一次代碼;
- 2018年10月31日,Spring Cloud Alibaba正式入駐Spring Cloud官方孵化器並發布了第一個預覽版本
- 2019年8月1日 在 Alibaba 倉庫發布第一個畢業版本。
3、發展趨勢
社區活躍,持續更新中。
spring-cloud-alibaba
最新Release版本:v.2.0.2.RELEASE
最新發布時間:2020.4.15
Sentinel
最新Release版本:v1.7.2
最新發布時間:2020.4.8
Nacos
最新Release版本:1.3.1(July 10, 2020)
最新發布時間:2020.7.9
4、主要功能
- 服務限流降級:默認支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降級功能的接入,可以在運行時通過控制台實時修改限流降級規則,還支持查看限流降級 Metrics 監控。
- 服務注冊與發現:適配 Spring Cloud 服務注冊與發現標准,默認集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系統中的外部化配置,配置更改時自動刷新。
- 消息驅動能力:基於 Spring Cloud Stream 為微服務應用構建消息驅動能力。
- 分布式事務:使用 @GlobalTransactional 注解, 高效並且對業務零侵入地解決分布式事務問題。。
- 阿里雲對象存儲:阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。支持在任何應用、任何時間、任何地點存儲和訪問任意類型的數據。
- 分布式任務調度:提供秒級、精准、高可靠、高可用的定時(基於 Cron 表達式)任務調度服務。同時提供分布式的任務執行模型,如網格任務。網格任務支持海量子任務均勻分配到所有 Worker(schedulerx-client)上執行。
- 阿里雲短信服務:覆蓋全球的短信服務,友好、高效、智能的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
5、主要組件
- [開源]Sentinel:把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
- [開源]Nacos:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台。
- [開源]RocketMQ:一款開源的分布式消息系統,基於高可用分布式集群技術,提供低延時的、高可靠的消息發布與訂閱服務。
- [開源]Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
- [開源]Seata:阿里巴巴開源產品,一個易於使用的高性能微服務分布式事務解決方案。
- [商用]Alibaba Cloud ACM:一款在分布式架構環境中對應用配置進行集中管理和推送的應用配置中心產品。
- [商用]Alibaba Cloud OSS: 阿里雲對象存儲服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。您可以在任何應用、任何時間、任何地點存儲和訪問任意類型的數據。
- [商用]Alibaba Cloud SchedulerX: 阿里中間件團隊開發的一款分布式任務調度產品,提供秒級、精准、高可靠、高可用的定時(基於 Cron 表達式)任務調度服務。
- [商用]Alibaba Cloud SMS: 覆蓋全球的短信服務,友好、高效、智能的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
四、微服務每個組成部分的多種實現方式對比
服務注冊與發現:Eureka、Nacos、Consul、Zookeeper、Etcd 等等

配置中心:Spring Cloud Config、Nacos 對比
spring cloud config:
性能夠用
config: 單獨服務,是從git倉庫拉取配置信息,然后服務端從config服務里面拉取配置信息緩存到本地倉庫,
這里配置的變更比較麻煩,他需要結合bus組件,同時約束了只能用rabbitmq和kafka來進行通知服務端進行配置變更。
但是保證了數據的一致性,因為他的配置信息在git倉庫上,git倉庫只有一個,就會數據一致
nacos :
性能最好
他同時支持AP和CP模式,他根據服務注冊選擇臨時和永久來決定走AP模式還是CP模式,
他這里支持CP模式對於我的理解來說,應該是為了配置中心集群,因為nacos可以同時作為注冊中心和配置中心,
因為他的配置中心信息是保存在nacos里面的,假如因為nacos其中一台掛掉后,還沒有同步配置信息,就可能發生配置不一致的情況.,
配置中心的配置變更是服務端有監聽器,配置中心發生配置變化,然后服務端會監聽到配置發生變化,從而做出改變
熔斷、降級:Hystrix、Sentinel 對比
| 比較項 | Sentinel | Hystrix | 說明 |
|---|---|---|---|
| 隔離策略 | 信號量隔離(並發線程數限流)(模擬信號量) | 線程池隔離/信號量隔離 | Sentinel不創建線程依賴tomcat或jetty容器的線程池, 存在的問題就是運行容器的線程數量限制了sentinel設置值的上限可能設置不准。 比如tomcat線程池為10,sentinel設置100是沒有意義的,同時隔離性不好 hystrix使用自己創建的線程池,隔離性會更好 |
| 熔斷降級策略 | 基於響應時間、異常比率、異常數 | 基於異常比率 | 快速失敗的本質功能 |
| 實時統計實現 | 滑動窗口(LeapArray) | 滑動窗口(基於 RxJava) | |
| 動態規則配置 | 支持多種數據源 | 支持多種數據源 | |
| 擴展性 | 多個擴展點 | 插件的形式 | |
| 注解 | 支持 | 支持 | |
| 限流 | 基於 QPS,支持基於調用關系的限流 | 有限的支持(並發線程數或信號量大小) | 快速失敗的本質功能 |
| 流量整形 | 支持預熱模式、勻速器模式、預熱排隊模式 | 不支持(排隊) | |
| 系統自適應保護 | 支持(僅對linux/unix生效) | 不支持 | 設置一個服務器最大允許處理量的閾值 |
| 控制台 | 提供開箱即用的控制台,可配置規則、查看秒級監控、機器發現等 | 簡單的監控查看接近實時數據 | 控制台是非常有競爭力的功能,因為能集中配置限制數據更方便,但是展示數據和實時性沒有hystrix直觀。 |
| 配置持久化 | ZooKeeper, Apollo, Nacos、本地文件 | Git/svn/本地文件 | Sentinel客戶端采用直接鏈接持久化存儲,應用客戶端引用了更多的依賴,同樣的存儲鏈接可能有多個配置 |
| 動態配置 | 支持 | 支持 | |
| 黑白名單 | 支持 | 不支持 | |
| springcloud集成 | 高 | 非常高 | Spring boot使用hystrix集成度更高 |
| 整體優勢 | 集中配置設置及監控+更細的控制規則 | 漂亮的界面+接近實時的統計結果 | docker容器化部署之后sentinel可能更會發揮作用 |
網關:Zuul、Spring Cloud Gateway
Spring Cloud Gateway基於Spring 5、Project Reactor、Spring Boot 2,使用非阻塞式的API,內置限流過濾器,支持長連接(比如 websockets),
在高並發和后端服務響應慢的場景下比Zuul1的表現要好。
Zuul基於Servlet2.x構建,使用阻塞的API,沒有內置限流過濾器,不支持長連接。
Spring Cloud Gateway,使用起來比 Zuul 更簡單,配置更方便
兩者都能與Sentinel(是阿里開源的一款高性能的限流框架)集成。
五、整體方案的優勢對比
1、Spring Cloud Netflix
成熟度:推出較早,相對成熟
更新持續性:更新緩慢,部分停更
社區活躍度:社區活躍
發展趨勢:趨緩
文檔便捷性:英文為主
難易程度:一般
性能:基於http協議,性能一般
配套:無配置中心,使用 Spring Cloud Config;
商業優勢:
2、Spring Cloud Alibaba
成熟度:2019年8月1日 在 Alibaba 倉庫發布第一個畢業版本,相對較新。
更新持續性:持續更新中
社區活躍度:社區活躍
發展趨勢:發展迅猛
文檔便捷性:官方中文文檔
難易程度:一般
性能:底層基於dubbo rpc 通信,性能較高
配套:無配套網關,使用 Spring Cloud Gateway;配套分布式服務框架setea;
商業優勢:可更好的支持 阿里雲 相關商業產品,容易繼承。
總結:
1、個人意見
推薦:Spring Cloud Alibaba
理由:
具有 Alibaba 大廠背景;
經過世界上最大最復雜的電商交易場景——雙11 的有效驗證;
對阿里雲商用服務提供友好的支持;
整體易用性,性能,及后續發展趨勢更勝一籌。
六、其他基礎設施
容器管理:k8s,swarm
| 對比項 | k8s | swarm |
| 出品公司 | docker官方 | |
| 生態 | 社區活躍,支持着眾多、行業事實標准 | 遜色於k8s |
| 完善程度及功能 | 功能完善、復雜 | 功能略少、簡單 |
| 學習成本 | 高 | 低 |
| 服務器成本 | 高 | 低 |
數據庫:mysql
緩存:redis
消息隊列:kafka、RocketMQ
個人建議:kafka
原因:
1、kafka幾乎是消息隊列的行業標准
2、集成日志體系elk,也需要用到kafka
日志:elk
反向代理:nignx
監控:Prometheus、Grafana
參考資料:
精選文章
Spring Cloud Alibaba,中國 Javaer 的福音,為微服務續上 18年
Spring Cloud Alibaba 新一代微服務解決方案
太深啦!帶你“深入”Spring Cloud ALibaba微服務一探究竟
########################################################
Spring Cloud Alibaba 新一代微服務解決方案
Spring Cloud Alibaba | Dubbo 與 Spring Cloud 完美結合
springboot,dubbo,nacos,spring-cloud-alibaba的整合
用SpringCloud Alibaba搭建屬於自己的微服務系列文章
Spring Cloud Alibaba(三)Sentinel之熔斷降級
阿里P8架構師談:微服務Dubbo和SpringCloud架構設計、優劣勢比較
spring-cloud-kubernetes官方demo運行實戰
一款集成Spring Cloud Alibaba、Nacos、Sentinel等阿里巴巴中間件,實現網關和服務的灰度發布、路由、權重、限流、熔斷、降級、隔離、監控、追蹤等功能的微服務開源解決。使用指南 請參考 Nepxion Discovery Guide。
微服務:注冊中心ZooKeeper、Eureka、Consul 、Nacos對比
服務發現:Zookeeper vs etcd vs Consul
Spring Cloud Config、Apollo、Nacos配置中心選型及對比
Spring Cloud Gateway VS Zuul 比較,怎么選擇?
SpringCloudAlibaba筆記(六):Sleuth--鏈路追蹤
1-12、Spring Cloud Alibaba 鏈路追蹤
SpringCloud(第 046 篇)注解式Schedule配置定時任務,不支持任務調度
SpringCloud(第 010 篇)簡單 Quartz-Cluster 支持集群分布式且支持動態修改時間
Springcloud項目集成Quartz定時任務框架,實現批處理功能
消息隊列Kafka、RocketMQ、RabbitMQ的優劣勢、技術應用及選擇
要做技術選型,數據處理選kafka還是RocketMQ?我徹底蒙了
git
