四步輕松玩轉微服務敏捷開發(fā)
01 微服務敏捷開發(fā)不簡單
1 安得環(huán)境千萬套,大庇開發(fā)小哥俱歡笑
微服務給大家?guī)砹嗣艚蓍_發(fā)的特性,基于敏捷開發(fā)帶來的便利,讓我們可以在同一個時間內多個迭代/feature 并行開發(fā)。但微服務架構本身也給開發(fā)環(huán)境帶來了一定的復雜性:每個 feature 的修改點都可能會被分散在多個應用中,需要多個應用互相配合才能完成整體的邏輯。這些應用既需要互相配合好,又不能讓他們互相影響,故敏捷開發(fā)有時候也不是那么容易。
相信實踐過微服務敏捷開發(fā)的同學曾經都遇到過以下情況:
1.開發(fā)接口時,應用無法獨立地聯調測試,需要依賴于下游的返回,所以一般都需要一個完整的開發(fā)環(huán)境,這個環(huán)境需要包含所有的其他應用。
2.A 同學辛辛苦苦,終于開發(fā)好了一個接口,但是部署到開發(fā)環(huán)境后,發(fā)現返回值一直是錯的,就是不符合預期,百思不得其解。最終根據日志、arthas 層層跟蹤下去,發(fā)現原來是另一個同事更新了下游應用的代碼,導致原有邏輯發(fā)生了變更。
3.A 同學準備開始聯調測試了,這時候他要找到開發(fā) B 和 C 吼一嗓子確認:“我要開始測試了哈兄弟們,你們都別動環(huán)境,不要重啟和 debug 哈”。B 同學 和 C 同學一臉懵逼:“我自己這還有個邏輯沒理清楚呢,剛改完代碼準備測一發(fā),你這一測試聯調我就不能動環(huán)境了,我這功能得等到什么時候才能開發(fā)好”。
4.排查問題好麻煩啊,要不直接 debug 一下吧,這 IDEA 遠程 debug 剛連上去呢,立馬就傳來了同事的聲音:“誰 XX 又在瞎動環(huán)境啊,怎么剛剛還能跑的接口現在就出錯了”。
以上這些問題顯然會影響項目的進度,非常容易造成項目延期。對于此刻的開發(fā)小哥哥而言,擁有一套屬于自己的獨立環(huán)境,帶來的幸福感也許比有一套屬于自己的小房子還大。
2 流量閉環(huán)是微服務敏捷開發(fā)的基礎
上文中提到的問題,其實都是因為沒有在開發(fā)環(huán)境中,精準地控制流量在 feature 環(huán)境內流轉。
為什么精準地控制流量如此重要?舉個最簡單的微服務架構圖來說明,這里假設應用的調用鏈路為 A ---> B ---> C ---> D ,現在同時開發(fā)兩個 feature, feature1 和 feature2 。feature1 需要修改 A 和 C 的代碼, feature2 需要修改 B、C 和 D 的代碼。
為了方便表述,我們用 A、B、C、D 來代指 A、B、C、D 的線上穩(wěn)定版本,也叫做基線版本;A1、C1 來代指 feature1 環(huán)境中的 A 和 C ;B2、C2、D2 來來代指 feature2 環(huán)境中 B、C、D。
那么開發(fā)測試 feature1 的同學會要求他的請求,準確地在 A1 ---> B ---> C1 ---> D 中流轉。為什么一定要這樣,我們來簡單分析一下:
1.如果流量走到 A 或者 C 的基線環(huán)境,因為他們都沒有包含 feature1 相關的代碼,所以肯定是無法正常測試和聯調 feature1 對應的功能。
2.如果流量走到 B2、D2 環(huán)境,大多數情況下是可以正常工作的,因為正常情況下 B2 和 D2 中的修改是不會影響 feature1 的。但是因為 feature1 和 feature2 可能是由不同的同學開發(fā)的,或者有不同的開發(fā)排期和節(jié)奏,他們有自己的開發(fā)、重啟、debug 節(jié)奏,所以大概率還是會出現上文中提到的場景。
綜上所述,讓流量在 feature 環(huán)境內流轉非常重要,是微服務敏捷開發(fā)的基礎。
如何準確地讓請求在 feature 環(huán)境內流轉呢?最簡單的辦法是每個迭代/feature 的都享有一套獨立的完整環(huán)境,這套獨立的環(huán)境包含了整個微服務應用集所有的應用,包含注冊中心和接入層,這樣就能確保流量在 feature 環(huán)境里閉環(huán),不用擔心應用之間互相影響。
這個解決方案雖然簡單,但是問題也很顯而易見,成本比較大。我們假設微服務應用有10 個,每個應用只部署一臺,以 java 為例,部署一個 java 應用按 2C4G 的 共享標準型 ECS 進行計算,維護一套環(huán)境一年的成本是 10 × 140 × 12 = 16800 元,如果同時有 4 套環(huán)境,即只支持兩個迭代并行開發(fā),每個迭代只有 2 個 feature,這樣一年的成本就是 67200 元,而且我們可以發(fā)現,這里面計算公式使用的是乘法,當應用增加和環(huán)境增加時,成本的增加是成倍的。
注意,這里只是單純地計算了應用使用的 ECS 的成本,其他周邊的配套設施我們還沒有計算,因為我們的開發(fā)、聯調、測試是需要確保端到端的全流程都是足夠順利的,那這里就還會涉及到 域名/SLB/網關/注冊中心這些資源,這些資源一般比較固定,不會需要進行大的修改,但是在多套環(huán)境的方案下這些資源也需要維護多套,成本還會進一步上升。
那么,有沒有一個比較優(yōu)雅地方式,既能享受到微服務架構帶來的敏捷開發(fā)的便利,又不會給日常開發(fā)環(huán)境的搭建帶來很大的成本呢?基于 MSE(微服務引擎 MSE,以下簡稱 MSE)標簽路由功能使用開發(fā)環(huán)境隔離方案是您的不二之選。
3 如何低成本玩轉敏捷開發(fā)
什么是 MSE 開發(fā)環(huán)境隔離,簡單地說就是將 feature 環(huán)境的隔離方式從簡單的物理隔離轉為邏輯隔離。借助于 MSE 提供的邏輯隔離,您只需要維護一套完整的基線環(huán)境,在增加 feature 環(huán)境時,只需要單獨部署這個 feature 所涉及到改動的應用即可,而不需要在每個 feature 環(huán)境都部署整套的微服務應用及其配套設施。
我們稱這唯一的一套完整的環(huán)境為基線環(huán)境?;€環(huán)境包含了所有微服務應用,也包含了服務注冊中心、域名、SLB、網關 等其他設施,而 feature 環(huán)境中只包含了這個 feature 中需要修改的應用。這樣維護 n 套 feature 環(huán)境的成本,就變成了加法,而不是原來的乘法,由 n × m 變成了 n + m。差不多相當于零成本增加 feature 環(huán)境,這樣我們就可以放心地擴容出多套 feature 環(huán)境,每個開發(fā)小哥哥都可以輕松擁有屬于自己的獨立環(huán)境,盡情地享受微服務敏捷開發(fā)。
從上圖中我們可以看到,feature1 對應的流量,在發(fā)現 feature1 中存在 A1 應用時,一定會去往 A1 節(jié)點,A1在調用B的時候發(fā)現 feature1 環(huán)境中不存在 B1 ,則會將請求發(fā)到 基線版本的 B 中;B在調用C時,發(fā)現 feature1 環(huán)境存在 C1 應用,又會返回到 feature1 環(huán)境中,依次類推,確保了流量會在 feature1 環(huán)境中閉環(huán)。
而且,在這個過程中,您不需要修改任何代碼和配置,直接接入 MSE 微服務治理即可使用,不會給您增加任何開發(fā)成本。
02 如何使用 MSE 開發(fā)環(huán)境隔離
1 開通 MSE 微服務治理專業(yè)版
登錄 MSE治理中心控制臺,如果您尚未開通 MSE 微服務治理,請根據提示開通專業(yè)版。如果您已經開通了MSE 微服務治理基礎版,請根據概覽頁中右側的提示,升級到 專業(yè)版。
2 部署基線環(huán)境/基線環(huán)境接入
首先需要將基線環(huán)境的所有應用接入到 MSE 中,接入方式與您開發(fā)環(huán)境中應用部署方式有關。這里我們拿兩個典型的場景作為例子進行說明。更多接入場景請參考 MSE 幫助文檔 MSE 微服務治理快速入門。
-
阿里云容器服務 ACK
若您的開發(fā)環(huán)境部署在 阿里云容器服務的 ACK 中,將基線環(huán)境接入 MSE 的流程如下:
1.在 ACK 中安裝 MSE 治理中心組件
- 登錄容器服務控制臺。
- 在左側導航欄單擊市場 > 應用目錄。
- 在應用目錄頁面搜索并單擊 ack-mse-pilot。
- 在 ack-mse-pilot 頁面右側集群列表中選擇集群,然后單擊創(chuàng)建。
創(chuàng)建成功后,會自動跳轉到目標集群的發(fā)布頁面,檢查安裝結果。如果出現以下頁面,展示相關資源,則說明安裝成功。
2.為 ACK 命名空間中的應用開啟 MSE 微服務治理
3.完成上述步驟后,重啟/部署基線版本的應用,您的基線環(huán)境就已經接入完成。
-
ECS/虛擬機
若您的應用是通過 ECS 或者 虛擬機的方式部署的,請您打開 MSE微服務治理控制臺中的應用列表-接入方式-ECS 集群,根據指南里面的提示進行操作。
1.通過Shell腳本方式下載Agent 復制以下命令行并在待治理應用所處的系統中運行。
wget -O- http://mse-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/install.sh | sh # 此命令具體內容會隨著您控制臺中的選擇的 Region 而變化,請注意在控制臺中選擇機器所在的 Region # 若您的機器不在阿里云環(huán)境中,請選擇 杭州 Region。
2.接入 MSE Agent
a. 將MseAgent.zip中的所有文件解壓到任意目錄中。
unzip MseAgent -d /{user.workspace}/ # 說明 “{user.workspace}”是示例路徑,請根據具體環(huán)境替換為正確的路徑。
b. 在應用啟動參數上添加AppName以及LicenseKey參數。
java -javaagent:/{user.workspace}/MseAgent/mse-bootstrap-1.7.0-SNAPSHOT.jar
-Dmse.licenseKey=<yourLicenseKey>
-Dmse.appName=<yourAppName>
-Dmse.enable=true -jar A.jar #系統將為您自動生成的 <yourLicenseKey> ,在上文中提到的 ECS接入指南 界面查看,請勿泄露。 #<yourAppName> 為應用名稱,同一應用在后續(xù)的 feature 環(huán)境接入需要保持應用名稱一致
注意:各個 Region 的 LicenseKey 值可能不一致,請注意選擇正確的 Region,若您的機器不在阿里云環(huán)境中,請選擇 杭州 Region。
-
驗證環(huán)境接入成功
完成上述步驟后,您的基線環(huán)境就已經部署好了。您可以在 MSE 控制臺中找到對應的 Region 查看應用列表,以及應用詳情頁的節(jié)點情況。
3 將應用接入 feature 環(huán)境
將應用接入 feature 環(huán)境的方式和第二步中的方式基本相同,只不過這里需要額外給應用打上一個標簽,將這個應用標記為屬于 feature 環(huán)境。
同樣的,接入 feature 環(huán)境的方式也和應用的部署形態(tài)相關,這里同樣分別以 K8s 和 ECS 方式舉例,如何將 A 應用接入到 feature1 環(huán)境。
-
K8s 部署方式
如果您的應用是通過 K8s 方式部署,則應用在接入 feature1 環(huán)境時需要在 deployment 中的 spec > template > metadata 下的 annotations 增加如下配置:
spec:
template:
metadata:
annotations:
alicloud.service.tag: feature1
-
ECS/虛擬機
如果您的應用是通過 ECS/虛擬機的方式部署,則應用在接入 feature1 環(huán)境時需要額外配置 JVM 系統屬性(SystemProperty) ,增加的方式為在 Java 啟動命令中增加 `-Dalicloud.service.tag=feature1`,完整的啟動命令如下:
java -javaagent:/{user.workspace}/MseAgent/mse-bootstrap-1.7.0-SNAPSHOT.jar -Dmse.licenseKey=<yourLicenseKey> -Dmse.appName=<yourAppName> -Dmse.enable=true -Dalicloud.service.tag=feature1 -jar A.jar
-
驗證環(huán)境接入成功
完成上述操作后,登錄 MSE 控制臺,找到剛才啟動的應用,在詳情頁面查看實例詳情,可以確認節(jié)點的 ip 和標簽是否符合預期。
4 輕松開始聯調和測試
假設我們發(fā)往網關的請求是 http 請求,希望這個請求再 feature1 中完成閉環(huán),只需要在請求的 header 中添加 x-mse-tag=feature1 即可,流量會自動在 feature1 環(huán)境內完成閉環(huán)。注意這里的 key 為 x-mse-tag 為固定值,feature1 則需要和環(huán)境的標簽(即上文中配置的 alicloud.service.tag)保持一致。
如果您的請求來源為 Dubbo,則需要在 RpcContext 中增加 Attachment ,內容也是 x-mse-tag=feature1。
特別地,如果您的網關應用不屬于 Java 體系,則需要在網關層配置一下規(guī)則,目前已經支持 MSE云原生網關,Nginx,K8s Ingress 等,詳細的接入方式可以參考 MSE 全鏈路灰度配置 。
03 更進一步 IDEA 接入 feature 環(huán)境
上文中提到過,開發(fā)聯調過程中,將應用部署到聯調環(huán)境也是需要成本的,能不能直接在 IDEA 里面把正在開發(fā)的微服務跑起來呢?這樣豈不是就可以直接愉快地快速部署和 debug 了?當然可以!而且操作起來還非常簡單!
將 IDEA 啟動的應用直接接入到 feature 環(huán)境中也不復雜,只需要簡單幾步即可實現。
注意:使用此特性的前提條件為,您本機的網絡與開發(fā)環(huán)境其他應用能夠正常通訊。
1 安裝 CloudToolkit 插件
安裝最新版本的 Cloud Toolkit,安裝詳情請參考官網:https://www.aliyun.com/product/cloudtoolkit
2 配置 MSE 參數
點擊 IDEA 的 Tools 中找到 Preference ,找到 Alibaba Cloud Toolkit 中 Microservice 下的 MSE ,點擊 開啟微服務治理,并安裝下圖的方式進行配置即可。
對以下幾個參數做一下說明:
LicenseKey
您阿里云賬號對應的 MSE 產品的 LicenseKey ,請在 https://mse.console.aliyun.com/#/msc/app/accessType 中的選擇 ECS 集群,在 安裝 MSE Agent 章節(jié)找到 LicenseKey 的值。
注意:請您做好 LicenseKey 的保密工作。
注意:各個 Region 的 LicenseKey 值可能不一致,請選擇對應的 Region,并和基線環(huán)境接入的 Region 保持一致。
App Name
應用在接入 MSE 時所使用的應用名,請根據實際業(yè)務情況進行配置,注意這個值需要和本次所啟動的應用保持一致。
Tag
此應用所屬的環(huán)境 Tag,基線不用填,其他請根據實際業(yè)務情況進行填寫。如果此應用屬于 feature1 環(huán)境,請?zhí)顚?feature1。
Agent 地址
選擇自己應用所在的地域,需要和 LienseKey 所在的地域、以及基線環(huán)境接入的地域 都保持一致。
開啟 RPC 灰度 ?
支持對 Spring Cloud 和 Dubbo 近5年內的所有版本的流量進行精準控制。默認情況下請開啟,除非您明確知道關閉此選項的使用場景,否則請勿關閉此選項。
開啟標簽染色 ?
推薦開啟,開啟后經過此應用的流量就只會在對應的 Tag 環(huán)境中流轉。
開啟消息灰度 ?
請根據業(yè)務實際情況選擇是否開啟,目前僅支持 RocketMQ 4.2 及以上版本。
3 驗證應用是否接入成功
1.使用常見的 IDEA 啟動應用的方式進行啟動
2.登錄 MSE 控制臺,選擇對應 Region ,找到剛才填寫的應用名,點擊此應用名,如果在應用詳情中發(fā)現了本地對應的 IP 和 Tag ,表明接入成功。.
注意,第一第二步只需要執(zhí)行一次,若 AppName 和 Tag 發(fā)生了變更,則根據實際情況進行調整。
4 接入成功
現在,您可以在 IDEA 中盡情地享受本地開發(fā)部署和 debug 的快感。