在Spring Cloud體系中,開發者將微服務化后通用的能力封裝在一個開發框架中,使用這個框架開發自己的業務代碼,因此生成的微服務內置了這些能力。服務網格通過另一種形態提供治理能力,不同于SDK方式,服務治理的能力在一個獨立的代理進程中提供,完全和開發解耦。從架構和實際應用場景來分析,兩者在設計理念上的差異,可以看到前者是一個開發框架,后者是一個基礎設施。本文介紹如何實現從Spring Cloud到服務網格體系的結合與遷移。
背景信息
Spring Cloud框架為開發人員提供了快速構建分布式系統中一些常見模式的工具,例如配置管理、服務發現、斷路器、智能路由等。使用Spring Cloud的開發人員遇到的一個問題是需要管理配置服務器、服務注冊表、Spring Cloud Gateway服務和微服務應用程序。這占用了開發人員交付業務應用的寶貴時間,并降低了發布速度。下文介紹如何使用Kubernetes和服務網格技術替換微服務應用程序中的Spring Cloud模塊功能。
服務注冊與發現
Spring Cloud服務在Kubernetes運行時,可能出現服務注冊和發現不及時的問題。其根本原因是兩套服務發現導致的不一致問題,因此解決辦法較為簡單,統一服務發現即可。也就是說,Kubernetes已經在Pod調度的同時維護了服務和Endpoint間的數據,則沒有必要再單獨使用一套命名服務的機制進行服務注冊,統一收斂到Kubernetes的服務注冊與發現是最佳實踐。
服務網關
在切換到Kubernetes和服務網格體系上之后,原有的Spring Cloud Gateway上如果存在了其他私有的業務強相關的處理能力時,建議的兼容方法是將其作為一個特定的入門服務部署在網格中進行管理。但是大多數情況下推薦使用服務網格體系的Ingress Gateway直接替換這個微服務網關,以非侵入的方式提供外部TLS終止、限流、流量切分等能力。
經過以上的簡單改造,各種不同語言、各種不同開發框架開發的服務,只要業務協議相通,彼此可以互相訪問,訪問協議可以被網格管理,則均可以通過ASM進行統一的管理。
控制面上可以配置統一的服務管理規則。數據面上,統一使用Sidsecar代理進行服務發現、負載均衡和其他流量、安全、可觀察性等相關能力。在遷移過程中,也可以階段性地保留原有微服務框架的注冊中心,使Istio和其他的服務發現結合使用的中間狀態,讓網格中的服務可以訪問到微服務注冊中心的服務。
組件對比
在微服務管理中常常需要使用到的一些組件,包括服務注冊、服務發現、負載均衡等。下表列舉了從Spring Cloud體系遷移至Service Mesh體系時,所依賴的對應功能的分析。
功能分類 | 功能列表 | 功能描述 | Istio | Spring Cloud |
服務基本管理 | 配置中心 | 管理應用服務的配置信息。 | 基于K8s的configmap實現。 | 基于Spring Cloud Config組件實現。 |
服務注冊與發現 | 在部署應用服務時,自動完成注冊服務,調用方可以自動發現注冊的服務。 | 基于K8s service+Core DNS實現,支持Istio DNS Proxying能力。 | 基于Consul、Nacos等組件實現服務的注冊與發現。 | |
服務隔離 | 基于Namespace的服務隔離。 | 基于K8s Namespace實現。 | 本身不具備Namespace概念。 | |
路由管理 | 路由管理 | 應用服務之間的訪問路由。 | 基于YAML配置路由規則,Istio定義了VirtualService和DestinationRule來支持對應的路由規則和均衡策略。 | 一般基于網關層面實現,不具有Sidecar代理機制下的路由。 |
負載均衡 | 客戶端發起請求時使用的負載均衡。 | 基于YAML配置負載均衡策略,Istio定義了VirtualService和DestinationRule來支持對應的路由規則和均衡策略。 | 基于Ribbon或Feigin實現。 | |
服務高可用機制 | 支持故障注入 | 模擬應用服務的故障,增加可用性。 | 基于YAML配置支持超時和延時兩種類型的故障注入。 | 不支持。 |
支持限流、熔斷 | 避免應用服務調用時出現雪崩。 | 基于YAML配置支持限流、熔斷能力。 | 基于Hystrix實現,需要一定的代碼注入。 | |
南北向流量支持 | 入口和出口網關 | 為客戶端請求的入口,以及對外訪問的出口網關。 | 基于Istio Ingress實現入口網關功能,以及基于Istio Egress實現出口網關功能。 | 基于Spring Cloud Gateway實現入口網關。 |
可觀測能力支持 | 日志采集 | 收集應用服務的日志。 | 通常與K8s的Pod日志采集方式保持一致。 | 通常集成ELK類似系統對接。 |
分布式鏈路追蹤 | 描述應用服務之間的調用鏈路以及拓撲關系圖。 | 基于Sidecar代理與Zipkin的服務集成實現,并支持基于Kiali的服務拓撲展示。 | 基于Zipkin實現。 | |
安全 | 服務授權 | 實現應用服務訪問控制。 | 基于YAML配置Istio的認證授權策略。 | 基于Spring Security組件實現認證鑒權能力。 |
TLS/mTLS及身份認證 | 實現服務請求流量的TLS加解密及身份認證。 | 自動支持TLS和雙向TLS的加解密,基于YAML配置Istio的mTLS認證和JWT身份認證。 | 依賴于其他組件實現,本身不支持。 | |
支持黑白名單的訪問控制 | 靈活設置應用服務之間的基于黑白名單的訪問策略。 | 基于YAML配置Istio的授權策略。 | 需要一定的代碼注入。 | |
應用場景 | 應用遷移方式 | 將應用遷移到分布式微服務架構時是否需要修改源代碼。 | 通過K8s的webhook機制可以實現自動化Sidecar代理的注入,通過該Sidecar代理可以支持應用服務治理的遷移。 | 需要修改應用的源代碼。 |
灰度發布(金絲雀發布)、藍綠發布 | 實現應用服務的動態發布機制,支持上線版本的優雅發布。 | 基于YAML配置負載均衡策略,Istio定義了VirtualService和DestinationRule來支持對應的路由規則和均衡策略。 | 需要一定的代碼修改支持。 | |
擴展機制 | 支持擴展 | 提供擴展機制支持更多的應用服務管理能力。 | 提供基于EnvoyFilter和WebAssmebly的擴展機制。 | 不具備。 |