微服務要解決的8大核心問題
微服務面臨的問題
- 如何發現新服務節點以及檢查服務節點的狀態?
- 如何發現服務及負載均衡如何實現?
- 服務間如何進行消息通信?
- 如何對使用者暴露服務 API?
- 如何集中管理眾多服務節點的配置文件?
- 如何收集服務節點的日志並統一管理?
- 如何實現服務間調用鏈路追蹤?
- 如何對系統進行鏈路保護,避免微服務雪崩?
行業解決方案
可以發現,上述這些問題並不是針對某種語言或某種技術的,任何軟件廠商要構建微服務架構就必須面對這些問題,要么獨立開發要么將已有多種技術整合形成整體解決方案。好在經過多年沉淀,業內已經有了標准答案,下圖清晰的說明微服務架構需要的標准組件
微服務各大組件的簡介及架構圖

注冊中心(Service Registry)
注冊中心是微服務架構最核心的組件。它起到新服務節點的注冊與狀態維護的作用,通過注冊中心解決了上述問題 1。
微服務節點在啟動時會將自身的服務名稱、IP、端口等信息在注冊中心中進行登記,注冊中心會定時檢查該節點的運行狀態。注冊中心通常會采用心跳機制最大程度保證其持有的服務節點列表都是可用的。

負載均衡(Load Balance)
負載均衡器解決了問題2
通常在微服務彼此調用時並不是直接通過IP、端口直接訪問,而是首先通過服務名在注冊中心查詢該服務擁有哪些可用節點,然后注冊中心將可用節點列表返回給服務調用者,這個過程稱為“服務發現”。因服務高可用的要求,服務調用者會接收到多個可用節點,必須要從中進行選擇,因此在服務調用者一端必須內置負載均衡器,通過負載均衡策略選擇適合的節點發起實質的通信請求。

服務通信(Communication)
服務通信組件解決了問題 3.
在微服務定義中闡述服務間通信采用輕量級協議,通常是 HTTP RESTful 風格。但因 RESTful 風格過於靈活,必須加以約束,通常在應用時對其進行上層封裝,例如在 Spring Cloud 中就提供了 Feign 和 RestTemplate 兩種技術屏蔽底層實現 RESTful 通信細節,所有開發者是基於封裝后統一的SDK進行開發,這有利於團隊間協作。
API 服務網關(API Gateway)
服務網關解決問題4。
對於最終用戶來說,微服務的通信與各種實現細節應該是透明的,用戶只需關注他要使用的 API 接口即可。因此微服務架構引入服務網關控制用戶的訪問權限。服務網關是外部環境訪問內部微服務的唯一途徑,在這個基礎上還可以擴展出其他功能,例如:用戶認證與授權、容錯限流、動態路由、A/B測試、灰度發布等。

配置中心(Config Management)
配置中心解決問題5。
微服務架構下,微服務節點都包含自己的各種配置文件,如JDBC地址、自定義配置、環境配置等。要知道互聯網公司微服務節點可能是成千上萬個,如果這些配置信息分散存儲在節點上,如發生配置變更就必須逐個調整,這必將給運維人員帶來巨大的工作量。配置中心便因此而生,通過部署配置中心服務器,將原本分散的配置文件從應用中剝離,集中轉存到配置中心。一般配置中心會提供 UI 界面,可以方便快捷的實現大規模集群的配置調整。


集中式日志管理(CentralizedLogging)
集中式日志解決問題6。
因為微服務架構默認將應用日志分散保存在每一個微服務節點上,當系統進行用戶行為分析、數據統計時必須收集所有節點日志數據。那如何有效收集所有節點的運行日志,並對其進行分析匯總呢?業內常見的方案有 ELK、EFK,通過搭建獨立的日志收集系統,定時抓取增量日志形成有效的統計報表,為決策提供數據支撐。

分布式鏈路追蹤(DistributedTracing)
分布式追蹤解決問題7。
一個復雜的業務流程可能需要連續調用多個微服務,我們需要記錄一個完整業務邏輯涉及的每一個微服務的運行狀態,再通過可視化鏈路圖展現,幫助軟件工程師在系統出錯時分析解決問題。

服務保護(Service Protection)
服務保護解決問題8。
在服務間通信過程中,如果某個微服務出現響應高延遲可能會導致線程池滿載,嚴重時會引起系統崩潰。這里就需要引入服務保護組件實現高延遲服務的快速降級,避免系統崩潰。
以上是在微服務架構過程中派生的新問題以及對應的解決方案,這些組件是微服務架構設計時必須考慮的事情。在實現層面,Java 是目前對微服務生態支持最好的編程語言,下面我們就來介紹在Java中如何實現微服務架構的。
Spring Cloud Alibaba
國產微服務生態Spring Cloud Alibaba是直接隸屬於 Spring Cloud 的子項目。官網是:https://spring.io/projects/spring-cloud-alibaba#overview。
Spring Cloud Alibaba是國產的微服務開發一站式解決方案,與原有 Spring Cloud 兼容的同時對微服務生態進行擴展,通過添加少量的配置注解,便可實現更符合國情的微服務架構。
Spring Cloud 與 Alibaba 對比表格

我將兩者從不同維度進行比對,可以發現相比 Spring Cloud,Spring Cloud Alibaba 對服務注冊、配置中心與負載均衡功能都整合進 Nacos,這樣簡化了微服務架構的復雜度,出問題的概率也會降低。原有的服務保護組件也調整為 Sentinel,相較Hystrix功能更強大,使用也更加友好。在表格最下方也可看到 Spring Cloud Alibaba 基於阿里雲強大的能力提供了更多的新特性,很多復雜的應用場景通過 Spring Cloud Alibaba 結合阿里雲便可輕松實現。
