本文來源于《華為云 DTSE?》第五期開源專刊,更多文章請查看:https://bbs.huaweicloud.com/blogs/435823
作者:聶子雄華為云高級工程師、李來華為云高級工程師
摘要:微服務是一種用于構建應用的架構方案,可使應用的各個部分既能獨立工作,又能協同配合,微服務的治理模式在適應云原生的方向也逐步在演進中。本文以汽車行業 DMS 系統在微服務應用發布時面臨的挑戰為切入點,介紹了基于微服務 SDK 框架與 JavaAgent 技術的全鏈路灰度發布,整體方案能夠有效提升微服務應用發布的效率。
1、微服務應用在發布時面臨的挑戰
微服務架構因其小而獨立的特點受到廣大開發者歡迎,我們生活中很多常見的應用也是基于微服務的架構。微服務架構強調應用拆分為一系列責任單一的小型服務單元,各個服務單元可進行獨立部署,相互協作配合,這種架構模式極大的提高了 IT 團隊的開發效率。
微服務應用在發布的時候一般會采用一種叫灰度發布的策略,它將新版本的軟件逐步地推送給一小部分用戶,以便在全面發布之前測試和驗證新版本的穩定性和可靠性。這種發布策略可以減少潛在的風險和影響,因為只有一小部分用戶受到影響,而其他用戶仍然可以使用舊版本的軟件。
常見的灰度發布一般只是針對某個單點的服務進行實施,在很多情況下,這種方法可以大大提高應用發布的效率以及穩定性。當然,單點灰度發布實際上也存在一些缺點,下面以汽車行業中的 DMS 系統為例進行分析:
DMS 全稱為汽車經銷商管理系統(Dealer Management System),專門為汽車經銷商和售后服務提供商設計的軟件系統,幫助汽車經銷商實現業務數字化、自動化和智能化,提高業務效率、降低成本、提升服務質量。很多廠商的 DMS 系統都做過微服務化改造,在提高了團隊開發效率的同時,也遇到了一些業務發布場景的挑戰:
?經銷商想在某一個門店 A 上線自己的新業務,作為業務試點門店,比如新品汽車銷售,或者打折促銷活動等。和新業務相關的流量只會流入試點門店 B。
?為了節約成本以及降低部署服務工作量,希望能夠實現邏輯上的環境隔離。例如,測試環境有部分服務復用生產環境上的模塊,開發測試人員只需要聚焦于需要測試的服務模塊。
?經銷商的交易、商品服務有新的業務要上線,新上線的功能間有依賴和交互,要在上線前做一些測試工作。
a) 計劃讓測試人員專門賬號來進行現網測試。
b) 引入少量比例的生產流量進行驗證。
針對上述問題,一般的思路是通過灰度發布去解決,通過灰度發布,可以引入部分的測試流量到新業務模塊,也能控制帶有具體特征的流量只流入到對應的測試模塊,其余流量保持原有方式不動。
但是經過仔細考慮,就會發現如果只做單點灰度發布,其實是無法完善地解決以上場景的痛點問題,主要體現在:
?業務特征時常只在第一跳,也就是特征只在入口,傳遞過程中會丟失。
?除了第一跳入口,后續微服務之間進行調用的時候也會把特征給丟失。
因此,僅僅依靠單點灰度發布的能力是不夠的,還需要能夠做到整條微服務調用鏈的可灰度,也就是全鏈路灰度的能力,這樣就可以靈活解決類似 DMS 系統遇到的問題。
后續我們將以全鏈路灰度發布的場景來展示微服務 SDK 框架和 JavaAgent 如何相互結合,解決真實場景中的服務發布問題。
2、微服務治理方案的選擇
在提出具體解決方案之前, 我們可以先了解基于微服務 SDK 框架以及基于 JavaAgent 技術的治理模式。微服務 SDK 進行治理是常見的一種形態,我們常見的 Spring Cloud、Dubbo 都屬于微服務 SDK 架構,這種方式通常可以較為方便的通過外部依賴的方式集成各種服務治理功能。JavaAgent 則可以通過非侵入的方式引入微服務治理功能,下面將對這兩種模式進行解析。
2.1 基于微服務 SDK 框架的微服務治理
2.1.1原理和優勢
服務治理是一個寬泛的概念,通常來說,保證微服務可靠運行的策略,都可以稱為服務治理。這些策略涵蓋開發態、運行態和運維態等微服務生命周期。可以從兩個不同的角度進行描述服務治理:
?從管理流程上,可以分為進行業務定義和設置治理規則兩個步驟。系統架構師將請求流量根據特征打上標記,用于區分一個或者一組代表具體含義的業務,然后對這些業務設置治理規則。
?從處理過程上,可以分為下發配置和應用治理規則兩個步驟。可以通過配置文件、配置中心、環境變量等常見的配置管理手段下發配置。微服務 SDK 框架負責讀取配置,解析治理規則,實現治理效果。
由于微服務應用是基于微服務 SDK 框架開發的,開發者可以明顯可以感知微服務 SDK 框架的存在,此外 SDK 和應用實例是運行在同一個進程中,這些特點也給微服務的治理帶來了一些好處,包括但不限于以下:
?更輕量級:微服務 SDK 框架在運行時不需要起單獨的進程,因此資源開銷較小。
?治理粒度更精細:微服務 SDK 可以直接對應用實例的某個方法直接進行管理,因此能夠滿足各種治理場景要求。
?性能高,時延低:微服務實例之間的鏈路不存在代理,訪問的時候是直接點對點的調用,因此時延低,并且微服務 SDK 框架可以提供高性能的 RPC,保障數據的高效傳輸。
華為云也致力于為開發者提供全面開放,方便高效的微服務 SDK 框架,目前對外開源的穩定成熟框架主要有 Spring Cloud Huawei 和 Java Chassis。
2.1.2Spring Cloud Huawei 框架
自從 Netflix 開源出最早的 Spring Cloud 微服務 SDK 框架,Spring Cloud 在這個領域的發展非常迅速,目前 Spring Cloud 已經是業界廣泛使用的微服務 SDK 框架之一。為了讓開發者能夠更加方便、高效地使用 Spring Cloud 開發可靠的微服務應用,基于 Spring Cloud 和華為云服務生態體系,華為云提供了 Spring Cloud Huawei 微服務 SDK 框架,為開發者提供了一站式的開發、部署、運維、監控、治理等全生命周期的服務。
使用 Spring Cloud Huawei,開發者可以不用熟悉和了解 Spring Cloud,只需要熟悉 Spring 和 Spring Boot,就能夠按照微服務架構模式開發應用。相對于 Spring Cloud,Spring Cloud Huawei 能夠更好的支持快速微服務開發,提供開箱即用的微服務治理能力。
2.1.3Java Chassis 框架
Java Chassis 框架是 Apache ServiceComb 項目下面向 Java 語言的微服務框架。ServiceComb 項目最早源于華為微服務引擎(CSE),在 2017 年 12 月捐贈給 Apache 基金會,目前已經形成了龐大的微服務生態,而 Java Chassis 是其中重要一環,著重解決微服務面臨的如下問題:
?微服務通信性能
?微服務運維和治理
?遺留系統改造
?配套 DevOps
Java Chassis 框架包含服務契約、編程模型、運行模型與通信模型四個部分,具備負載均衡、容錯熔斷、限流降級、調用鏈追蹤等全面微服務治理能力。下面是總體的架構設計圖:
為了支持軟件工程實踐,Java Chassis 的運行時架構是一個啞鈴結構,兩端分別是“編程模型”和“通信模型”,中間是“運行模型”。“編程模型”面向開發者寫服務接口的習慣,“通信模型”面向微服務之間的高效編碼和通信,“運行模型”基于“契約”,提供一種服務無關的插拔機制,能夠讓開發者獨立于業務實現開發治理功能,并且靈活的移除和增加功能,以及調整這些治理功能的處理順序。“運行模型”的核心抽象接口是 Handler,這個接口是一個異步的定義,Java Chassis 運行時模型采用純異步的實現,讓整個系統運行非常高效。
Java Chassis 和 Spring Cloud 都實現了微服務架構模式,相比而言,Java Chassis 是一個更加緊湊的實現,開箱即用,而 Spring Cloud 則是相對松散的實現,整合了大量的 Netflix 組件。
2.2 基于 JavaAgent 的非侵入微服務治理
JavaAgent 是如何實現能服務治理能力的?其技術核心在于 Java 進程啟動時,可以掛載 JavaAgent 來執行字節碼的增強邏輯。JVM 啟動后,JavaAgent 運行于 Java 應用之前,可以修改原應用的目標類和方法的字節碼,做到非侵入地增強,原應用中被增強的類在 JVM 中實例化的對象都是已經被 JavaAgent 處理過的,因此在業務應用的代碼執行時,我們的服務治理邏輯就能悄無聲息地通過這種方法實現注入。例如,我們可以增強服務發現過程,對這一過程中的某個關鍵函數進行攔截增強,插入一段路由篩選服務提供者實例的邏輯,根據服務實例的元數據和下發的路由規則選定對應的服務提供者,以此來完成灰度發布的功能。下圖簡化地介紹了字節碼 JavaAgent 字節碼增強的核心原理:
類似地,其他的服務治理能力的開發都可以通過這種方式,用戶的 Java 業務應用無需修改,業務應用的開發者也無需理解其中的深層原理,只要把實現了服務治理功能的 JavaAgent 掛載上即可一鍵非侵入接入服務治理。
基于上述原理,華為云開源團隊開發了無代理服務網格 Sermant 項目,目前已經在 Github 開源。Sermant 專注于利用 Java 字節碼增強技術為宿主應用程序提供服務治理功能,以解決大規模微服務場景中的服務治理問題。Sermant 構建了非侵入、高性能、插件化核心框架,并在框架中提供了對接動態配置中心、事件上報、鏈路標記、心跳等服務治理通用能力。當前開源倉庫中提供的插件涵蓋了服務注冊、標簽路由、流量控制、服務監控等常見的服務治理場景。Sermant 的后端觀測、動態配置中心、Agent 等組件提供的一套完整的解決方案如下:
利用 Sermant 來進行微服務治理能夠集合上文提到的各種服務架構的優勢:
?高性能:對比傳統的服務治理邊車,由于沒有邊車進程,因此有更高的性能和更低的資源損耗。
?非侵入:對比微服務 SDK 架構架構,無需代碼修改,升級云原生架構無需代碼改造。
?插件化架構:服務治理功能作為插件嵌入到 JavaAgent 內部,可動態部署,且內部充分類隔離,和業務代碼無類沖突。
3、方案詳解
結合以上兩種治理模式的各自特點,便可設計出理想的全鏈路灰度發布方案。目前要實現全鏈路灰度,一般要考慮這些問題的處理:
?在第一跳的地方(一般是網關),我們需要能選中各種類型的流量,把這部分流量染色,再路由到正確的目標。
?除了第一跳,剩下調用鏈路中的各個微服務能夠識別染色標,透傳染色標,并路由到正確的目標。
?能對異常情況進行妥善處理。
3.1、全鏈路灰度發布方案的具體流程
針對以上問題,我們有一套相對完善的全鏈路灰度發布方案,整體方案如下:
1.在前端部分,請求會統一攜帶流量標簽參數發到網關上面。
2.網關會選中各種類型的流量,將這些流量根據需求分別染色,比如通過請求 header 進行標記染色。
3.網關會將染色后的流量轉發到帶有不同 tag 的后端微服務實例,tag 可以由應用發布流水線注入到相應發布的微服務實例當中。
4.借助微服務實例上運行的 SDK / JavaAgent,接收到應用網關流量的微服務實例會通過 SDK / JavaAgent 提供的標簽路由能力將流量特征保留并轉發到合適的下一跳微服務實例。
5.對于后續鏈路上的微服務實例,都可以通過微服務實例上面的 SDK / Agent 進行特征的傳遞。
3.2、SDK / JavaAgent 如何助力全鏈路灰度發布?
由于在每個微服務實例都運行著 SDK / JavaAgent,因此 SDK / JavaAgent 可以對每個實例進行細粒度的服務治理,包括限流,熔斷,降級,標簽路由等功能。在全鏈路灰度發布過程中,對于每條鏈路上的微服務實例,可以借助 SDK / JavaAgent 的標簽路由能力實現流量特征的保留以及傳遞到下一跳微服務實例。進行標簽路由的全流程如下:
3.3、SDK / JavaAgent 如何搭配使用?
從上面的方案介紹可以知道無論是 SDK 還是 JavaAgent 的方式,其實都可以非常有效地助力全鏈路灰度發布方案的落地,那遇到具體業務場景對全鏈路灰度發布有訴求的時候,我們該如何去選擇呢?
對于用戶規劃的新業務,用戶一般會統一技術棧,因此直接使用微服務 SDK 框架自帶的能力去實現全鏈路灰度發布會更加方便高效。
對于用戶已有的業務,并且業務內部技術棧也不統一,這時候直接采用非侵入式的 JavaAgent 去做全鏈路灰度發布會極大程度地降低改造成本,因為業務代碼本身不需要做變動,只需要在運行實例上掛載一個 JavaAgent 即可。當然目前的 JavaAgent 其實是基于 Java 語言的,因此對于別的編程語言,還是得依靠微服務 SDK 框架來實現全鏈路灰度發布,但是考慮到目前 Java 屬于使用量第一的編程語言,因此 JavaAgent 這種方式基本上還是能夠覆蓋絕大多數的場景。
總的來看,兩種方式其實適用于不同的業務場景,它們之間可以相互補充,形成一整套完善的全鏈路灰度發布解決方案。
3.4、全鏈路灰度發布方案帶來的優勢
微服務應用通過全鏈路灰度發布的方式可以顯著提高發布的效率以及穩定性,關鍵優勢如下:
?在開發測試過程中,客戶可以根據需求在邏輯上劃分出一套屬于自己的服務鏈路,只需要關注自己設定的特征流量即可,這種模式可以為客戶省去搭建系統中一些共用的模塊時間以及節約環境資源。
?在發布過程中,方便地將帶有試點特征的流量引入到含有自己試點應用的鏈路環境當中。客戶還可以根據需要把一部分生產流量引入到自己的新版本業務鏈路環境當中,完成新版本的驗證。
4、總結
微服務治理架構的形態一直在演進,各種形態有其適用的場景和優缺點。對于企業用戶和開發者來說,如何盡可能以較低的成本、較好的效率來解決微服務治理過程中的各個問題是永恒的目標。以上我們主要對主流的微服務 SDK 架構和 JavaAgent 非侵入治理架構作了解析,對于 Java 應用場景來說,這兩種治理模式可以在不影響性能的前提解決絕大多數場景的治理問題。華為云在微服務治理方向的持續探索也孵化出了 Spring Cloud Huawei、Java Chassis、Sermant 等優秀的開源項目,并且將持續演進,豐富微服務治理領域的開源生態。
本文鏈接:http://www.tebozhan.com/showinfo-26-125118-0.html基于微服務 SDK 框架與 JavaAgent 技術,華為云全鏈路灰度發布方案助力應用發布效率
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com