作者 | 亦盞
01 微服務靈活開發不簡單
1、安得環境千萬套,大庇開發小哥俱歡笑
微服務給大家帶來了靈活開發的特性,基于靈活開發帶來的便利,讓我們可以在同一個時間内多個疊代/feature 并行開發。但微服務架構本身也給開發環境帶來了一定的複雜性:每個 feature 的修改點都可能會被分散在多個應用中,需要多個應用互相配合才能完成整體的邏輯。這些應用既需要互相配合好,又不能讓他們互相影響,故靈活開發有時候也不是那麼容易。
相信實踐過微服務靈活開發的同學曾經都遇到過以下情況:
1、開發接口時,應用無法獨立地聯調測試,需要依賴于下遊的傳回,是以一般都需要一個完整的開發環境,這個環境需要包含所有的其他應用。
2、A 同學辛辛苦苦,終于開發好了一個接口,但是部署到開發環境後,發現傳回值一直是錯的,就是不符合預期,百思不得其解。最終根據日志、arthas 層層跟蹤下去,發現原來是另一個同僚更新了下遊應用的代碼,導緻原有邏輯發生了變更。
3、A 同學準備開始聯調測試了,這時候他要找到開發 B 和 C 吼一嗓子确認:“我要開始測試了哈兄弟們,你們都别動環境,不要重新開機和 debug 哈”。B 同學 和 C 同學一臉懵逼:“我自己這還有個邏輯沒理清楚呢,剛改完代碼準備測一發,你這一測試聯調我就不能動環境了,我這功能得等到什麼時候才能開發好”。
4、排查問題好麻煩啊,要不直接 debug 一下吧,這 IDEA 遠端 debug 剛連上去呢,立馬就傳來了同僚的聲音:“誰 XX 又在瞎動環境啊,怎麼剛剛還能跑的接口現在就出錯了”。
以上這些問題顯然會影響項目的進度,非常容易造成項目延期。對于此刻的開發小哥哥而言,擁有一套屬于自己的獨立環境,帶來的幸福感也許比有一套屬于自己的小房子還大。
2、流量閉環是微服務靈活開發的基礎
上文中提到的問題,其實都是因為沒有在開發環境中,精準地控制流量在 feature 環境内流轉。
為什麼精準地控制流量如此重要?舉個最簡單的微服務架構圖來說明,這裡假設應用的調用鍊路為 A ---> B ---> C ---> D ,現在同時開發兩個 feature, feature1 和 feature2 。feature1 需要修改 A 和 C 的代碼, feature2 需要修改 B、C 和 D 的代碼。為了友善表述,我們用 A、B、C、D 來代指 A、B、C、D 的線上穩定版本,也叫做基線版本;A1、C1 來代指 feature1 環境中的 A 和 C ;B2、C2、D2 來來代指 feature2 環境中 B、C、D。
那麼開發測試 feature1 的同學會要求他的請求,準确地在 A1 ---> B ---> C1 ---> D 中流轉。為什麼一定要這樣,我們來簡單分析一下:
1、如果流量走到 A 或者 C 的基線環境,因為他們都沒有包含 feature1 相關的代碼,是以肯定是無法正常測試和聯調 feature1 對應的功能。
2、如果流量走到 B2、D2 環境,大多數情況下是可以正常工作的,因為正常情況下 B2 和 D2 中的修改是不會影響 feature1 的。但是因為 feature1 和 feature2 可能是由不同的同學開發的,或者有不同的開發排期和節奏,他們有自己的開發、重新開機、debug 節奏,是以大機率還是會出現上文中提到的場景。
綜上所述,讓流量在 feature 環境内流轉非常重要,是微服務靈活開發的基礎。

如何準确地讓請求在 feature 環境内流轉呢?最簡單的辦法是每個疊代/feature 的都享有一套獨立的完整環境,這套獨立的環境包含了整個微服務應用集所有的應用,包含注冊中心和接入層,這樣就能確定流量在 feature 環境裡閉環,不用擔心應用之間互相影響。
這個解決方案雖然簡單,但是問題也很顯而易見,成本比較大。我們假設微服務應用有10 個,每個應用隻部署一台,以 java 為例,部署一個 java 應用按 2C4G 的 共享标準型 ECS 進行計算,維護一套環境一年的成本是 10 × 140 × 12 = 16800 元,如果同時有 4 套環境,即隻支援兩個疊代并行開發,每個疊代隻有 2 個 feature,這樣一年的成本就是 67200 元,而且我們可以發現,這裡面計算公式使用的是乘法,當應用增加和環境增加時,成本的增加是成倍的。
注意,這裡隻是單純地計算了應用使用的 ECS 的成本,其他周邊的配套設施我們還沒有計算,因為我們的開發、聯調、測試是需要確定端到端的全流程都是足夠順利的,那這裡就還會涉及到 域名/SLB/網關/注冊中心這些資源,這些資源一般比較固定,不會需要進行大的修改,但是在多套環境的方案下這些資源也需要維護多套,成本還會進一步上升。
那麼,有沒有一個比較優雅地方式,既能享受到微服務架構帶來的靈活開發的便利,又不會給日常開發環境的搭建帶來很大的成本呢?基于 MSE(微服務引擎 MSE,以下簡稱 MSE)标簽路由功能使用開發環境隔離方案是您的不二之選。
3、如何低成本玩轉靈活開發
什麼是 MSE 開發環境隔離,簡單地說就是将 feature 環境的隔離方式從簡單的實體隔離轉為邏輯隔離。借助于 MSE 提供的邏輯隔離,您隻需要維護一套完整的基線環境,在增加 feature 環境時,隻需要單獨部署這個 feature 所涉及到改動的應用即可,而不需要在每個 feature 環境都部署整套的微服務應用及其配套設施。
我們稱這唯一的一套完整的環境為基線環境。基線環境包含了所有微服務應用,也包含了服務注冊中心、域名、SLB、網關 等其他設施,而 feature 環境中隻包含了這個 feature 中需要修改的應用。這樣維護 n 套 feature 環境的成本,就變成了加法,而不是原來的乘法,由 n × m 變成了 n + m。差不多相當于零成本增加 feature 環境,這樣我們就可以放心地擴容出多套 feature 環境,每個開發小哥哥都可以輕松擁有屬于自己的獨立環境,盡情地享受微服務靈活開發。
從上圖中我們可以看到,feature1 對應的流量,在發現 feature1 中存在 A1 應用時,一定會去往 A1 節點,A1在調用B的時候發現 feature1 環境中不存在 B1 ,則會将請求發到 基線版本的 B 中;B在調用C時,發現 feature1 環境存在 C1 應用,又會傳回到 feature1 環境中,依次類推,確定了流量會在 feature1 環境中閉環。
而且,在這個過程中,您不需要修改任何代碼和配置,直接接入 MSE 微服務治理即可使用,不會給您增加任何開發成本。
02 如何使用 MSE 開發環境隔離01
1、開通 MSE 微服務治理專業版
登入
MSE治理中心控制台,如果您尚未開通 MSE 微服務治理,請根據提示開通專業版。如果您已經開通了MSE 微服務治理基礎版,請根據概覽頁中右側的提示,更新到 專業版。
02
2、部署基線環境/基線環境接入
首先需要将基線環境的所有應用接入到 MSE 中,接入方式與您開發環境中應用部署方式有關。這裡我們拿兩個典型的場景作為例子進行說明。更多接入場景請參考 MSE 幫助文檔
MSE 微服務治理快速入門。
- 阿裡雲容器服務 ACK
若您的開發環境部署在 阿裡雲容器服務的 ACK 中,将基線環境接入 MSE 的流程如下:
1、在 ACK 中安裝 MSE 治理中心元件
- 容器服務控制台
- 在左側導航欄單擊市場 > 應用目錄。
- 在應用目錄頁面搜尋并單擊 ack-mse-pilot。
- 在 ack-mse-pilot 頁面右側叢集清單中選擇叢集,然後單擊建立。
安裝 MSE 微服務治理元件大約需要 2 分鐘,請耐心等待。建立成功後,會自動跳轉到目标叢集的釋出頁面,檢查安裝結果。如果出現以下頁面,展示相關資源,則說明安裝成功。
2、為 ACK 命名空間中的應用開啟 MSE 微服務治理
- MSE 治理中心控制台
- 在左側導航欄選擇微服務治理中心 > K8s 叢集清單。
- 在 K8s 叢集清單頁面搜尋框清單中選擇叢集名稱或叢集 ID,然後輸入相應的關鍵字,單擊 🔍 圖示。
- 單擊目标叢集操作列的管理。
- 在叢集詳情頁面命名空間清單區域,單擊目标命名空間操作列下的開啟微服務治理。(如果您的基線環境部署在 default 這個 namespace 中,則目标命名空間為 default)
- 在開啟微服務治理對話框中單擊确認
3、完成上述步驟後,重新開機/部署基線版本的應用,您的基線環境就已經接入完成。
- ECS/虛拟機
若您的應用是通過 ECS 或者 虛拟機的方式部署的,請您打開 MSE微服務治理控制台中的應用清單-接入方式-ECS 叢集,根據指南裡面的提示進行操作。
1、通過Shell腳本方式下載下傳Agent 複制以下指令行并在待治理應用所處的系統中運作。
wget -O- http://mse-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/install.sh | sh
# 此指令具體内容會随着您控制台中的選擇的 Region 而變化,請注意在控制台中選擇機器所在的 Region
# 若您的機器不在阿裡雲環境中,請選擇 杭州 Region。
2、接入 MSE Agenta. 将MseAgent.zip中的所有檔案解壓到任意目錄中。
unzip MseAgent -d /{user.workspace}/
# 說明 “{user.workspace}”是示例路徑,請根據具體環境替換為正确的路徑。
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> 為應用名稱,同一應用在後續的 feature 環境接入需要保持應用名稱一緻
注意:各個 Region 的 LicenseKey 值可能不一緻,請注意選擇正确的 Region,若您的機器不在阿裡雲環境中,請選擇 杭州 Region。
- 驗證環境接入成功
完成上述步驟後,您的基線環境就已經部署好了。您可以在 MSE 控制台中找到對應的 Region 檢視應用清單,以及應用詳情頁的節點情況。
03
3、将應用接入 feature 環境
将應用接入 feature 環境的方式和第二步中的方式基本相同,隻不過這裡需要額外給應用打上一個标簽,将這個應用标記為屬于 feature 環境。
同樣的,接入 feature 環境的方式也和應用的部署形态相關,這裡同樣分别以 K8s 和 ECS 方式舉例,如何将 A 應用接入到 feature1 環境。
- K8s 部署方式
如果您的應用是通過 K8s 方式部署,則應用在接入 feature1 環境時需要在 deployment 中的 spec > template > metadata 下的 annotations 增加如下配置:
spec:
template:
metadata:
annotations:
alicloud.service.tag: feature1
如果您的應用是通過 ECS/虛拟機的方式部署,則應用在接入 feature1 環境時需要額外配置 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
完成上述操作後,登入 MSE 控制台,找到剛才啟動的應用,在詳情頁面檢視執行個體詳情,可以确認節點的 ip 和标簽是否符合預期。
四步輕松玩轉微服務靈活開發01 微服務靈活開發不簡單02 如何使用 MSE 開發環境隔離0103 更進一步 IDEA 接入 feature 環境
04
4、輕松開始聯調和測試
假設我們發往網關的請求是 http 請求,希望這個請求再 feature1 中完成閉環,隻需要在請求的 header 中添加 x-mse-tag=feature1 即可,流量會自動在 feature1 環境内完成閉環。注意這裡的 key 為 x-mse-tag 為固定值,feature1 則需要和環境的标簽(即上文中配置的 alicloud.service.tag)保持一緻。
如果您的請求來源為 Dubbo,則需要在 RpcContext 中增加 Attachment ,内容也是 x-mse-tag=feature1。
特别地,如果您的網關應用不屬于 Java 體系,則需要在網關層配置一下規則,目前已經支援 MSE雲原生網關,Nginx,K8s Ingress 等,詳細的接入方式可以參考
MSE 全鍊路灰階配置03 更進一步 IDEA 接入 feature 環境
上文中提到過,開發聯調過程中,将應用部署到聯調環境也是需要成本的,能不能直接在 IDEA 裡面把正在開發的微服務跑起來呢?這樣豈不是就可以直接愉快地快速部署和 debug 了?當然可以!而且操作起來還非常簡單!
将 IDEA 啟動的應用直接接入到 feature 環境中也不複雜,隻需要簡單幾步即可實作。注意:使用此特性的前提條件為,您本機的網絡與開發環境其他應用能夠正常通訊。
01
1、 安裝 CloudToolkit 插件
安裝最新版本的 Cloud Toolkit,安裝詳情請參考官網:
https://www.aliyun.com/product/cloudtoolkit2、配置 MSE 參數
點選 IDEA 的 Tools 中找到 Preference ,找到 Alibaba Cloud Toolkit 中 Microservice 下的 MSE ,點選 開啟微服務治理,并安裝下圖的方式進行配置即可。
對以下幾個參數做一下說明:
- LicenseKey
您阿裡雲賬号對應的 MSE 産品的 LicenseKey ,請在
https://mse.console.aliyun.com/#/msc/app/accessType中的選擇 ECS 叢集,在 安裝 MSE Agent 章節找到 LicenseKey 的值。
注意:請您做好 LicenseKey 的保密工作。注意:各個 Region 的 LicenseKey 值可能不一緻,請選擇對應的 Region,并和基線環境接入的 Region 保持一緻。
- App Name
應用在接入 MSE 時所使用的應用名,請根據實際業務情況進行配置,注意這個值需要和本次所啟動的應用保持一緻。
- Tag
此應用所屬的環境 Tag,基線不用填,其他請根據實際業務情況進行填寫。如果此應用屬于 feature1 環境,請填寫 feature1。
- Agent 位址
選擇自己應用所在的地域,需要和 LienseKey 所在的地域、以及基線環境接入的地域 都保持一緻。
- 開啟 RPC 灰階 ✅
支援對 Spring Cloud 和 Dubbo 近5年内的所有版本的流量進行精準控制。預設情況下請開啟,除非您明确知道關閉此選項的使用場景,否則請勿關閉此選項。
- 開啟标簽染色 ✅
推薦開啟,開啟後經過此應用的流量就隻會在對應的 Tag 環境中流轉。
- 開啟消息灰階 ✅
請根據業務實際情況選擇是否開啟,目前僅支援 RocketMQ 4.2 及以上版本。
3、驗證應用是否接入成功
1、使用常見的 IDEA 啟動應用的方式進行啟動2、登入 MSE 控制台,選擇對應 Region ,找到剛才填寫的應用名,點選此應用名,如果在應用詳情中發現了本地對應的 IP 和 Tag ,表明接入成功。
注意,第一第二步隻需要執行一次,若 AppName 和 Tag 發生了變更,則根據實際情況進行調整。
4、接入成功
現在,您可以在 IDEA 中盡情地享受本地開發部署和 debug 的快感。
雙 11 搶購倒計時 6 天,微服務引擎 MSE 注冊&配置中心、MSE 雲原生網關預付費低至 8 折,全年最低優惠!
點選文末連結,移步詳情頁加購。
https://www.aliyun.com/product/aliware/mse