服務網格實踐之servicecomb-mesher

點擊上方藍字關注我們

service mesh(服務網格)

1、 service mesh誕生背景

自從微服務和雲計算興起後,誕生了無數優秀的微服務架構,給開發部署帶來了巨大的便利,敏捷開發獲得了最佳的實踐場景。然而微服務模式帶來便利和高性能的同時不可避免會帶來服務數量的膨脹,處理鏈路複雜化,底層架構和微服務框架差異化,因此服務治理問題成爲了新的痛點,爲了解決以上場景,service mesh 概念誕生。

service mesh (服務網格)通過在微服務網絡中加入一些與業務服務解耦的服務實例,充當消息轉發的角色,本質是在應用層加入一個通信管理層來管理網絡中微服務的服務互通、服務發現、服務治理、鏈路追蹤、健康監控等問題。使用服務網格後,在業務層面基本不用改動的情況下,以前複雜系統中需要考慮的跨團隊服務設計,語言選擇,異架構通信,鏈路管理,服務治理,服務上雲等難題都能在一個統一的基礎設施框架中得到解決。

那麼具體是怎麼做到的呢?服務網格通過增加一個代理服務,與原有微服務並行跑在一個基礎設施上,這裏的基礎設施可以是物理機或者容器。這個代理服務主要有兩個功能:

(1) 請求代理,所有原本直接發給微服務的請求都會被代理實例攔截,代理程序再將請求轉發給真正的微服務處理,原有微服務發起的所有請求也將先轉發給這個代理,由代理向外部的微服務網絡發起請求。

(2) 組成可見的微服務網絡節點,這個代理需要通過某種方式向微服務網絡世界暴露自己,比如向某個分佈式服務中心註冊,代表業務服務實例參與到服務網絡中,執行復雜的服務治理策略、調用鏈追蹤、路由控制等功能。

下圖中的 proxy 代表服務網格實例,server 代表微服務實例,這是服務網格的主要模式 sidecar,可以看到,每個微服務實例都有單獨的服務網格實例爲它服務,可以理解爲在車道上並排奔跑的兩個微服務,server 處理業務請求,負責業務層面的工作,proxy 服務攔截進出 server 的流量,負責微服務通信和治理層面的問題。

本文主要結合 Apache 項目 servicecomb-mesher 來介紹服務網格的實現,其他項目不做展開介紹。

圖1 服務網格鳥瞰圖

1

servicecomb-mesher

Servicecomb-mesher 是 Apache servicecomb 的服務網格項目。使用 go 語言基於 go-chassis 開源框架實現,go-chassis 框架以插件的形式支持負載均衡、流量控制、調用鏈追蹤、熔斷降級、服務治理、動態配置管理等微服務能力。mesher目前支持sidecar和edgeservice兩種運行模式。支持服務間使用http、grpc協議通信,有良好的可擴展性,用戶可自行擴展自己的協議。mesher以調用鏈的形式處理請求,可以根據配置自由裁剪處理函數。在控制面mesher天然能夠接入apache servicecomb微服務體系。並對當前主流的service-mesh具有兼容性,支持kubernetes,可接入Istio。

圖2  mesher交互模型圖

2.1 Servicecomb-mesher原理淺析

我們以 sidecar 模式運行 mesher,通過一個具體的 http 協議通信爲例介紹 mesher 做了什麼工作。

(1)  我們啓動一個真正的 http server 作爲業務服務,這裏對 http server 的實現語言,服務框架沒有任何限制;

(2)  啓動 mesher,mesher會根據配置信息啓動兩個 http 服務,分別監聽在本地迴環和本地 ip 上(如127.0.0.1:30101 和 192.168.88.64:30101)。mesher 通過127.0.0.1:30101 處理內部業務服務對外部的請求流量;監聽在 192.168.88.64:30101 的服務用於處理外部對內部業務服務的請求流量;

(3)  如圖,client 作爲一個請求發起方,client 的請求通過代理轉發到與它綁定的 mesher(127.0.0.1:30102);

(4) mesher(127.0.0.1:30102)接收到請求後,使用 LocalRequestHandler 處理請求,首先準備 consumer 調用鏈,獲取並解析 client 調用的服務名和端口,創建 Invocation,之後通過 consumer 調用鏈進行處理,最後建立一個 rest-client 對外部的目的服務(192.168.88.64:30101)發起調用;

(5)  監聽在 192.168.88.64:30101 的 mesher 接收到請求後,調用 RemoteRequestHandler 處理請求,首先將請求轉爲 Invocation,準備 provider 調用鏈,解析地址,將目的地址替換爲業務服務的地址,然後調用處理鏈處理請求,最終向內部真正的業務 server 發起 http 調用;

監聽在 127.0.0.1:30101 的 mesher 作爲 consumer,使用處理請求,consumerChain 調用鏈默認包含如下處理器(handler):

  • chassisHandler.Router,chassisHandler.RatelimiterConsumer

  • chassisHandler.BizkeeperConsumer

  • chassisHandler.Loadbalance

  • chassisHandler.Transport

監聽在 192.168.88.64:30101 的 mesher 作爲 provider 處理請求,providerChain 調用鏈默認包含如下處理器(handler):

  • chassisHandler.RatelimiterProvider

  • chassisHandler.Transport

圖3 mesher通信模型圖

通過以上分析可以看到,mesher 實際上在應用層作爲一個代理,攔截並代替業務服務發起和接收請求,mesher 和業務服務各司其職,業務服務只要保證業務功能正常,mesher 負責服務治理層面,構建可靠的通信鏈路。我們只要保證 mesher 與業務的互通以及 mesher 與外部其他 mesher 之間的通信就可以保證提供服務,那麼這裏 mesher 是如何做到的呢?這個問題就涉及到 go-chassis 開源框架的服務發現和控制面管理功能。mesher 使用 go-chassis 底座的 register 包將自己註冊到服務中心實例,這裏我們使用 Apache 的 servicecomb-servicecenter,它是一個接收微服務註冊並進行管理的服務中心,所有連接到 servicecenter 的服務都可以通過服務中心向其他服務暴露自己,並通過微服務名獲取到其他服務實例的 ip 和 port。mesher 的控制面功能支持斷路器、負載均衡、頻率限制、錯誤注入等,可以接入istio或者使用archaius以讀取配置的方式。

1

體質指數(Bmi)入門案例

3.1 背景

瞭解了 mesher 的原理後,我們通過一個具體的用例幫助用戶快速入門 mesher 的 sidecar 模式。希望幫助用戶通過該例子,能夠快速上手使用 mesher 服務,深入瞭解 mesher 的工作模式和原理,並掌握如何通過 mesher 的幫助改造已有的 http 服務,接入 servicecomb 微服務體系,獲得負載均衡、流控、服務治理、調用鏈追蹤等微服務能力。具體案例配置和代碼可以通過 github 下載:

https://github.com/apache/servicecomb-mesher/tree/master/examples/quick_start

3.2 用例服務介紹

圖4 mesher案例部署圖

1、httpserver_calculator:基於python語言實現的http體質指數服務,可替換爲任何語言開發的http服務;

2、httpserver_webapp:基於 nodejs 語言實現的web服務,用於在瀏覽器上展示可視化結果;

3、mesher_webapp:通過 sidecar 模式爲httpserver_webapp 提供服務的 mesher 實例;

4、mesher_calculator:通過 sidecar 模式爲httpserver_calculator 提供服務的 mesher 實例;

5、servicecenter:服務中心,接收 mesher 服務的註冊,提供服務發現、路由查詢、服務監控功能;

流程詳情:

  1. 瀏覽器[192.168.88.78]對 httpserver_webapp 服務發起 http 調用 http://192.168.88.64:4597/calculator/bmi

  2. httpserver_webapp 服務接收請求,併發起對地址 http://calculator/bmi 的 http 調用,因爲設置了代理http://127.0.0.1:30101,httpserver_webapp 發起的請求將被轉發到 mesher_webapp 服務。

  3. mesher_webapp 根據請求的服務名(microservice.yaml 配置的服務名 calculator)從服務中心 servicecenter 獲得該服務名的地址,轉發到 mesher_calculator。

  4. mesher_calculator 服務根據設置好的specific地址,轉發到自己綁定的體質指數calculator服務(httpserver_calculator)進行處理。

  5. httpserver_calculator 會根據用戶身高和體重進行計算,並返回自己的服務標識展示在界面上。流程圖如下所示:

圖5 mesher案例流程圖圖

2.4 測試環境搭建(linux)

1、編譯 mesher :下載地址https://github.com/apache/servicecomb-mesher) 

按README.md編譯項目得到可執行文件mesher(linux),windows(mesher.exe);

2、創建 mesher_webapp 用於爲 httpserver_webapp 服務:

在 mesher 目錄下執行下列linux命令創建 mesher_webapp,此處除了可執行文件,還需要拷貝conf

mkdir /usr/local/src/mesher_webappcp ./mesher /usr/local/src/mesher_webappcp -r ./conf /usr/local/src/mesher_webapp

更改 conf 中配置文件,microservice.yaml 中的服務 name,從 hellomesher 改爲 webapp;更改 chassis.yaml 中監聽的服務地址,從本地迴環(127.0.0.1)地址改爲內網 ip(linux下通過 ifconfig 查看,如192.168.88.64):

listenAddress: 127.0.0.1:40101  ->  listenAddress: 192.168.88.64:40101listenAddress: 127.0.0.1:30101  ->  listenAddress: 192.168.88.64:30101listenAddress: 127.0.0.1:30102  ->  listenAddress: 192.168.88.64:30102

3、創建mesher_calculator

mkdir /usr/local/src/mesher_calculatorcp ./mesher /usr/local/src/mesher_calculatorcp -r ./conf /usr/local/src/mesher_calculator

更改conf中配置文件,分別更改microservice.yaml中的服務name爲體質指數微服務名calculator;
更改mesher_calculator配置chassis.yaml監聽的地址和端口:

listenAddress: 127.0.0.1:40101  ->  listenAddress: 192.168.88.64:40107listenAddress: 127.0.0.1:30101  ->  listenAddress: 192.168.88.64:30111listenAddress: 127.0.0.1:30102  ->  listenAddress: 192.168.88.64:30112

4、 啓動mesher服務,分別進入mesher_webapp和mesher_calculator,啓動服務,其中需要設置mesher_calculator的SPECIFIC_ADDR地址,該地址用於建立mesher和http服務邏輯上的綁定關係;

cd /usr/local/src/mesher_calculatorexport SPECIFIC_ADDR=127.0.0.1:4540./meshercd /usr/local/src/mesher_webapp./mesher

5、 啓動httpserver_webapp服務:

cd /usr/local/src/httpserver_webappnode ./httpserver_webapp.js

6、 httpserver_calculator 作爲體質指數計算服務,需要安裝python2.7,依賴BaseHTTPServer包:

cd /usr/local/src/httpserver_calculator./httpserver_calculator.py

圖6 servicecenter服務監控圖

2.5 測試

1、瀏覽器打開頁面 http://192.168.88.64:30103 (如果打不開需要開啓服務中心 service-center 的 front 服務,參考http://servicecomb.apache.org/cn/users/setup-environment/#%E8%BF%90%E8%A1%8Cservice-center

查看服務,其中地址 service-center 服務啓動的地址,看到如圖界面。

webapp 代表 mesher_webapp 服務,這裏展示的是 microservice.yaml 中配置的服務名;calculator 代表 mesher_calculator 服務,這裏展示的是 microservice.yaml 中配置的服務名。大寫的 SERVICECENTER 是服務中心。

圖7 servicecenter服務監控圖

2、瀏覽器打開 http://192.168.88.64:4597,可以看到如下界面,爲 webapp 呈現的靜態頁面:

圖8 bmi調用結果展示界面圖

3、輸入參數(180、70)點擊 submit,觀察結果:

圖9 bmi調用結果圖

2.6 mesher進階

2.6.1 負載均衡

圖10 mesher 負載均衡案例部署圖

啓動一個新的 mesher_calculator 和 httpserver_calculator 實例用於負載均衡測試,可以使用例子目錄test_balance下的服務:

1、修改 mesher_calculator 配置文件 microservice.yaml 中的服務 name 爲 calculator;
更改配置 chassis.yaml 監聽的地址和端口避免衝突:

listenAddress: 127.0.0.1:40101  ->  listenAddress: 192.168.88.64:40102listenAddress: 127.0.0.1:30101  ->  listenAddress: 192.168.88.64:30108listenAddress: 127.0.0.1:30102  ->  listenAddress: 192.168.88.64:30109

2、啓動 mesher_calculator,需要設置 mesher_calculator 的 SPECIFIC_ADDR 地址,該地址用於建立 mesher 和 http 服務邏輯上的綁定關係;

export SPECIFIC_ADDR=127.0.0.1:4537./mesher

3、默認情況下會使用 roundbin(輪詢)負載均衡算法,另外還支持 Random 和 SessionStickiness 負載均衡算法。我們修改 mesher_webapp 的配置文件 chassis.yaml,將負載均衡方法配置爲 Random:

loadbalance:  strategy:    name: Random

4、開啓 httpserver_calculator 服務新實例,監聽4537端口。

5、此時點擊 Submit 按鈕就可以看到如下兩個界面中的 BMI Instance ID 隨機出現;

圖11 bmi調用結果圖

2.6.2 流量控制

1、添加流量控制配置,重啓服務,更改 mesher_calculator配置文件 chassis.yaml,其中流量控制包含下列選項:

flowcontrol:    Provider:      qps:        enabled: true        global:          limit: 100              Server: 100

該頻率限制標識每秒接受的請求爲0,即不提供服務。

2、驗證,點擊 Submit 按鈕,此時能看到由於流控受限而請求被拒的界面,請求已經無法到達 httpserver_calculator。

圖13 流量控制展示圖

2.6.3 服務治理


2.6.3.1 灰度發佈

1、更新版本號:分別更改兩個 mesher_calculator 實例的配置文件 microservice.yaml,更新 version 字段分別爲1.1.1和1.1.2,重啓 mesher 服務,可以看到服務版本號發生了變更。如圖中所示:

圖14 服務監控圖

2、配置路由信息,更改 mesher_webapp 的配置文件 router.yaml,按實例版本更新權重信息,並重啓服務:

servicecomb:    routeRule:      calculator: | # 服務名        - precedence: 1 # 優先級          route: #路由規則            - weight: 70 #權重值                        tags:                            version: 1.1.1            - weight: 30 #權重值                        tags:                            version: 1.1.2

3、驗證,此時大量點擊 Submit 按鈕就可以看到 BMI Instance ID 按配置的比例交替出現。

2.6.3.2 服務熔斷及恢復

1、更改斷流器配置,更改 mesher_webapp 的配置文件 chassis.yaml,設置其中的斷流器配置爲:

isolation:  Consumer:    timeout:      enabled: true    timeoutInMilliseconds: 1000            #超時時間    maxConcurrentRequests: 1circuitBreaker:  Consumer:    enabled: true    forceOpen: false    forceClosed: false    sleepWindowInMilliseconds: 10000    #熔斷恢復時間10秒    requestVolumeThreshold: 1          #請求量限制    errorThresholdPercentage: 1fallback:  Consumer:    enabled: true    maxConcurrentRequests: 1fallbackpolicy:  Consumer:policy: returnnull

2、關閉 test_balance 目錄下的服務實例。

3、驗證,傳入負數參數,響應超時,mesher_webapp 斷流器生效,圖16中三個子圖分別是:

    (1) mesher_webapp 日誌截圖,表明斷流器啓用。

    (2) 傳入負數參數觸發斷流器時的返回值。

    (3) 表示斷流器生效後對所有請求都按配置返回 nil。

圖16 服務熔斷展示圖

4、根據配置參數 sleepWindowInMilliseconds,過10秒後服務自動恢復。


2.6.4 分佈式調用鏈追蹤

1、mesher main 文件中添加對zipkin庫依賴:

_ "github.com/go-chassis/go-chassis-plugins/tracing/zipkin"

2、啓發器 bootstrap.go 中添加默認處理函數,如圖17中箭頭所示:

圖16 handlerchain調用圖

3、重新編譯,分別替換 mesher_webapp 和 mesher_calculator 的可執行文件,啓動 mesher 服務。

4、 使用 Docker 運行 Zipkin 分佈式追蹤服務,鏈接:

http://servicecomb.apache.org/cn/docs/quick-start-advance/distributed-tracing/

docker run -d -p 9411:9411 openzipkin/zipkin

5、多次點擊 Submit 按鈕發起服務調用。

6、打開 http://192.168.88.64:9411 可查看分佈式追蹤結果如圖18,可以通過 host 地址判斷調用路徑:

圖18 分佈式追蹤結果圖

往期回顧

spring-cloud-huawei:在SpringCloud中使用ServiceComb的能力

Apache ServiceComb Meetup -Shanghai 2019 (PPT Download)

長按二維碼關注我們

有趣的靈魂在等你

用心做開源

不忘初衷

點個在看

少個BUG

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章