隨著近年來微服務的發展,許多團隊開始將自己的單體應用改造為微服務。通常Java或Go的應用可以通過業界已有的微服務框架作為微服務開發和改造的底座,封裝掉解決跨網絡問題帶來的復雜性。但以Chassis模式進行的微服務改造有兩大問題:多語言框架支持問題和侵入式改造代碼問題。
在這個基礎上SideCar模式提供了另外一種接入分布式環境的方式,它使原有應用不與任何框架,平臺或者服務綁定。對業務代碼0侵入,因此不需要考慮SDK和應用如何結合,不存在較高的學習曲線和耗費較長的開發周期。這種作為基礎設施層服務的存在,稱為ServiceMesh。通過ServiceMesh,類似.NET或NodeJS等常見的Web應用不用考慮語言問題,尋找適合各自語言的為服務框架,也不需要侵入式修改代碼就能快速接入微服務系統。
整體部署方案
從實現的角度看,CSE mesher是ServiceMesh模式的一種實現,它基于CSE GO-SDK開發,通常以SideCar的方式與業務服務部署在一起。它是一種網絡代理的存在,業務服務并不感知,只需要配置其http_proxy為CSE mesher的地址即可。
下圖是CSE微服務案例中在線襪子商店SockShop的一個示例。整個SockShop由七個微服務組成,其中user等服務作為服務提供者通過java-chassis或go-chassis注冊到服務注冊中心。另外front-end是NodeJS實現的前端服務應用,orders是實現訂單服務的.NET應用,他們通過mesher接入服務注冊中心和配置中心,具備了服務發現以及服務治理的基本能力。

在線襪子商店SockShop架構
.NET應用與mesher
訂單orders服務是SockShop在線襪子商店的一個子服務,主要提供訂單處理(查詢訂單、運費計算、創建訂單),訂單狀態查詢功能。對接mesher與orders服務,只需要配置完整的代理地址,不需要對orders服務代碼做任何修改。此時orders作為服務消費者訪問payment和shipping服務,將由mesher完成相關微服務的服務發現和負載均衡,并把請求轉發到后端服務,整個過程orders服務本身并不感知。
- powershell export http_proxy=http://127.0.0.1:30101
需要注意的是為了使請求通過代理,由mesher管理運行時,不支持使用Halkit框架的.NET服務。訪問其他服務的代碼可使用簡單的WebRequest,示例如下。
- java var shipmentData = System.Text.Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(AShipment).ToString());
- WebRequest shipmentRequest =WebRequest.Create(AppSettings.ServiceEndpoints.ShippingServiceEndpoint);
其中ShippingServiceEndpoint配置為http://shipping/shipping。該請求經過mesher時,shipping作為服務名在mesher中進行解析和負載均衡。
- json
- {
- ??"ServiceEndpoints":{
- ? ? "PaymentServiceEndpoint":"http://payment/paymentAuth",
- ? ? "ShippingServiceEndpoint":"http://shipping/shipping"
- ??},
- ??"Data":{
- ? ? "MongoConnection":{
- ? ?? ?"ConnectionString":"mongodb://127.0.0.1:27017/",
- ? ?? ?"Database":"data"
- ? ? }
- ??},
- ??"Logging":{...}
- }
配置和啟動mesher
本例中mesher啟動在本機的30101端口,.NET應用orders通過mesher與其他微服務通信。mesher本身也是通過go-chassis構建的服務,可以通過chassis.yaml配置文件配置監聽地址以及對接的服務中心地址。默認的go-chassis會注冊自己到本地30100端口啟動的service-center。
- yaml
- protocols:
- ??http:
- ? ? listenAddress:x.x.x.x:30101 # listen addr of mesher
- service:
- ??registry:
- ? ? address:http://x.x.x.x:30100 # uri of service center
- ? ? scope:full #set full to be able to discover other app′s service
- ? ? watch:false # set if you want to watch instance change event
- ? ? autoIPIndex:true # set to true if u want to resolve source IP to microservice
為了使orders稱為服務提供者需要給mesher配置環境變量SPECIFIC_ADDR為orders服務本身暴露的地址。
- powershell export SPECIFIC_ADDR=127.0.0.1:80
通過mesher訪問后端微服務
orders訂單服務作為消費者調用payment與shipping這兩個服務。這兩個服務的注冊通過microservice.yaml來配置自己注冊的微服務名和版本,默認版本為0.01。另外可以通過配置chassis.yaml來指定應用ID,默認的應用ID為default。啟動SDK接入的微服務后同樣可以在service center中查詢到。
yaml
?
微服務的私有屬性
- service_description:
微服務的公共屬性
- APPLICATION_ID: sockshop
設置http_proxy為mesher的監聽地址后可以通過curl命令訪問接入系統的其他服務。查看mesher日志可以看到mesher負責服務發現,解析出payment服務注冊的advertise地址。
- powershell export http_proxy=http://127.0.0.1:30101 curl http://payment/health
運行.NET應用
orders服務在創建訂單過程包括對訂單詳細信息處理、調用payment服務的訂單支付接口進行訂單支付、調用shipping服務接口進行訂單運送處理,最后將訂單存入mongodb當中。換言之,Orders服務既作為訂單服務的提供端,也作為支付和運送服務的消費端。在carts中添加襪子后點擊[Proceed to checkout]即可在orders頁面查看訂單。

在線襪子商店SockShop主頁
?
---------------------
作者:looook
來源:CSDN
原文:https://blog.csdn.net/looook/article/details/80190409
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!