Spring Cloud or Cloud Native

基於Java的Spring Cloud是由Java最大開源生態Spring社區推出的Out-of-Box分佈式微服務解決方案,自2016年發佈起就被衆多開發者看好。Java作爲廣爲流行的服務端編程語言,Spring Cloud也就越來越多的被用於微服務開發。

Spring Cloud集成了Netflix OSS開源項目實現了很多功能(或作爲實現之一),包括服務治理、網關路由、客戶端負載均衡、服務間調用、斷路器等。Spring Cloud Netflix將很多生產級別微服務能力開箱即用的帶到了Spring Cloud架構下的微服務中,幫助開發者快速的構建滿足12要素的應用。

在去年底發佈的Spring Cloud Greenwich版本中宣佈Spring Cloud Netflix中重要的組件HystrixRibbonZuul 1等由於上游開源項目進入維護狀態,對應的Spring Cloud Netflix項目也進入到維護狀態。這些項目將不再適合用於長期維護的產品中!

同時隨着近年雲計算的發展,特別是Kubernetes成爲容器編排平臺的事實標準,加上Service Mesh(服務網格)對微服務的服務治理和流量控制,爲雲原生應用提供了更爲現代、平臺無關的解決方案。

讓我們逐一看看在Kubernetes加上Serivce Mesh(例如Istio)如何實現微服務的服務發現、路由、鏈路追蹤、斷路器等功能。

配置中心

Spring Cloud Config默認提供了多種配置管理後端,例如GitVaultJDBC Backend等。同時也有很多開源方案可以作爲替換方案,比如Alibaba Nacos

作爲部署在Kubernetes中的應用,最佳實踐是平衡ConfigmapSpring Cloud Config。將涉及程序功能的配置放置在Configmap和Secret,隨同微服務的發佈一起做版本管理,可以做到隨着應用回退的時候同時回退到歷史對應的配置版本,而不會因爲歷史版本的代碼被最新版本的配置所中斷。Spring Cloud Kuberentes項目很好的支持了Spring Cloud應用從ConfigmapSecret中讀取配置項。而涉及業務的配置選項,將可以考慮放到Spring Cloud Config後端實現統一管理。如果應用是部署在阿里雲,使用阿里雲託管的配置服務和Spring Cloud Config -- Nacos將是很好的選擇。

服務發現

Kubernetes Services提供了集羣內原生的服務發現能力,是EurekaSpring Cloud Zookeeper等服務發現服務的很好替代品。基於K8S Services的服務發現,很容易通過Service Mesh能力實現限流、A/B測試、金絲雀發佈、斷路器、chaos注入等服務治理能力。同時對微服務應用來說,不用在應用端添加對應三方庫來實現服務註冊及發現,減少了應用端開發需求。

各種流量治理場景

應用被服務化後,一定會面臨流量治理的問題。對於各種服務間如何實現限流、A/B測試、金絲雀發佈、斷路器、chaos注入測試、鏈接追蹤等,這其實是一類通用的問題。

Spring Cloud提供的是一種客戶端解決思路,需要每個應用引入對應功能的libraries的支持。即使通過spring boot starter提供了近似開箱即用的能力,但是每個應用仍然需要自行添加對應的能力,版本更新、安全漏洞fix等場景都需要手動升級、測試、打包、部署。在異構編程語言實現的微服務架構下,未必每種編程框架都能提供很好的對應能力支持。除非有特別的服務治理策略,不推薦在微服務自身來實現服務流量的控制。

Service Mesh(例如IstioLinkerd)從整個服務治理層面對上述需求提供了統一的解決方案,而不需要微服務做自身的升級或改動。在基於Kuberentes部署運行的微服務應用,Service Mesh提供了統一的服務治理方案,將用戶從不同的微服務中自身維護服務治理功能中解放出來,從平臺層面提供更加統一一致的解決方案。

在去年的SpringOne Platform 2018上也有一個Topic A Tale of Two Frameworks: Spring Cloud and Istio 探討什麼場景應該使用Service Mesh,什麼時候使用Spring Cloud服務治理組件,有興趣的朋友可以看一看。

{{< youtube AMJQO9zs2eo >}}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章