1. 程式人生 > >讓.NET應用秒變微服務

讓.NET應用秒變微服務

隨著近年來微服務的發展,許多團隊開始將自己的單體應用改造為微服務。通常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服務本身並不感知。

  1. powershell export http_proxy=http://127.0.0.1:30101

複製程式碼

需要注意的是為了使請求通過代理,由mesher管理執行時,不支援使用Halkit框架的.NET服務。訪問其他服務的程式碼可使用簡單的WebRequest,示例如下。

  1. java var shipmentData = System.Text.Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(AShipment).ToString());
  2. WebRequest shipmentRequest =WebRequest.Create(AppSettings.ServiceEndpoints.ShippingServiceEndpoint);

複製程式碼

其中ShippingServiceEndpoint配置為http://shipping/shipping。該請求經過mesher時,shipping作為服務名在mesher中進行解析和負載均衡。

  1. json
  2. {
  3.   "ServiceEndpoints":{
  4.     "PaymentServiceEndpoint":"http://payment/paymentAuth",
  5.     "ShippingServiceEndpoint":"http://shipping/shipping"
  6.   },
  7.   "Data":{
  8.     "MongoConnection":{
  9.       "ConnectionString":"mongodb://127.0.0.1:27017/",
  10.       "Database":"data"
  11.     }
  12.   },
  13.   "Logging":{...}
  14. }

複製程式碼

配置和啟動mesher

本例中mesher啟動在本機的30101埠,.NET應用orders通過mesher與其他微服務通訊。mesher本身也是通過go-chassis構建的服務,可以通過chassis.yaml配置檔案配置監聽地址以及對接的服務中心地址。預設的go-chassis會註冊自己到本地30100埠啟動的service-center。

  1. yaml
  2. protocols:
  3.   http:
  4.     listenAddress:x.x.x.x:30101 # listen addr of mesher
  5. service:
  6.   registry:
  7.     address:http://x.x.x.x:30100 # uri of service center
  8.     scope:full #set full to be able to discover other app´s service
  9.     watch:false # set if you want to watch instance change event
  10.     autoIPIndex:true # set to true if u want to resolve source IP to microservice

複製程式碼

為了使orders稱為服務提供者需要給mesher配置環境變數SPECIFIC_ADDR為orders服務本身暴露的地址。

  1. 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

微服務的私有屬性

  1. service_description:

複製程式碼

微服務的公共屬性

  1. APPLICATION_ID: sockshop

複製程式碼

設定http_proxy為mesher的監聽地址後可以通過curl命令訪問接入系統的其他服務。檢視mesher日誌可以看到mesher負責服務發現,解析出payment服務註冊的advertise地址。

  1. 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頁面檢視訂單。

--------------------- 本文來自 looook 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/looook/article/details/80190409?utm_source=copy