C++利用Sidecar模式實現微服務化的流程

前言

  公司近期要將園區所有的服務做成微服務模式,因之前負責的網關服務是C++來實現的,因此研究了一下非jvm語言實現向Eureka註冊中心註冊的過程,特此記錄,以便後續的溫習,初次瞭解微服務,如有錯誤,歡迎指正。
  關於sidecar模式的原理和爲何採用sidecar模式在網上能夠找到相關的博客去了解,這裏轉載幾篇好的文章,大家可以學習瞭解一下。

https://blog.csdn.net/StarskyBoy/article/details/85012642
https://blog.csdn.net/yang00322/article/details/77964703
https://www.jianshu.com/p/a96056870143

流程

 下面主要來記錄一下服務和Eureka註冊中心交互的過程,以下的過程是根據java的同事在通過配置Eureka客戶端,來向Eureka服務器發起請求時,用wireshark抓包工具查看完整的交互流程。再通過Eureka提供的REST接口,利用C++裏面的Poco庫的http相關接口,來實現微服務化向Eureka註冊,並實現服務的監控。

1、服務註冊
REST接口:POST /eureka/v2/apps/appID
代碼段如下:

		Poco::URI uri("http://ip:port/eureka/apps/appID");
		Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort());
		session.setKeepAlive(true);

		//創建 HTTP request
		Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_PUT, uri.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1);
		request.setContentType("application/json; charset=utf-8");
		request.setContentLength((int)msg.length());
		
		std::ostream &reqOstr = session.sendRequest(request);
		reqOstr << msg;

其中,appID是要向Eureka註冊的服務名,msg是一個標準的json字符串,json字符串的基本內容如下圖:
在這裏插入圖片描述

*以下是我整理的註冊發給Eureka的json字符串的相關字段釋義:

InstanceInfo服務實例信息字段:
1)instanceId : 實例id
2)hostName: 主機名稱
3)app:應用名
4)ipAddr:ip地址
5)status:實例狀態,如UP,DOWN,STARTING,OUT_OF_SERVICE,UNKOWN
6)overriddenStatus:外界需要強制覆蓋的狀態值,默認爲UNKOWN
7)port:端口號
8)securePort:https的端口號
9)countryId:被廢棄的屬性,屬性爲1,代表US
10)dataCenterInfo:dataCenter的信息,Netflix或者Amazon或者MyOwn
11)leaseInfo:租約信息
12)metadata:應用實例的元數據信息
13)homePageUrl:應用實例的首頁url
14)statusPageUrl:應用實例的狀態頁
15)healthCheckUrl;應用實例的健康檢查url
16)vipAddress:虛擬ip地址
17)secureVipAddress:https的虛擬ip地址
18)isCoordinatingDiscoveryServer:首先標識是否是DiscoveryServer,其次標識該DiscoveryServer是否是響應你請求的實例
19)lastUpdatedTimestamp:狀態信息最後更新時間
20)lastDirtyTimestamp:實例信息最新的過期時間,在client端用於標識
21)sid:被廢棄的屬性,默認爲na
22)actionType:標識EurekaServer對該實例執行的操作,包括ADDED,MODIFIED,DELETE這三類
23)asgName:在AWS的autoscaling group的名稱
LeaseInfo租約信息字段:
以下參數主要用於標識應用實例的心跳情況,比如約定的心跳週期,租約有效期,最後一次續約時間等。
1)renewalIntervalInSecs:client端續約的間隔時間
2)durationInSecs:client端需要設定的租約的有效時長
3)registrationTimestamp: Server端設置的該租約第一次註冊時間
4)lastRenewalTimestamp: Server端設置的該租約最後一次續約時間
5)evictionTimestamp;Server端設置的該租約被剔除的時間
6)serviceUpTimestamp:Server端設置的該服務實例標記爲Up的時間*

2、獲取服務實例
獲取服務實例的接口有兩個,一個是獲取全量服務實例列表,即每次獲取Eureka服務器上的所有實例,另外一個是實現增量實例列表,增量拉取變化的服務信息,然後本地去做更新。
REST接口:
全量:GET /eureka/apps
增量:GET /eureka/apps/delta
這裏爲了方便只是做了全量的實現,代碼段如下:

		Poco::URI uri("http://ip:port/eureka/apps");
		Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort());
		Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, uri.getPathAndQuery());
		session.sendRequest(request);

這裏通過抓包來分析,只有第一次調用的是全量的接口,後面每次發送心跳後都會調用一次獲取增量的接口,來做本地服務實例的更新。

3、心跳檢測/心跳續約
註冊完之後,會根據配置的心跳時間來規律的向Eureka發送心跳,告訴它還“活着”,如果超過續約時間還沒有發接收到心跳,Eureka服務端會將服務自動剔除。這個時間間隔是可配的,上面字段釋義裏面已經提到。
REST接口:PUT /eureka/apps/appID/instanceID
(instanceId是和服務實例相關聯的唯一id,默認組成爲hostname+appId+端口號)
代碼同註冊的代碼段,只需要將http的請求方式post改成put即可。

4、服務下線
服務下線,當服務主動停止後,會觸發一個服務下線的REST請求,告訴Eureka下線,此時Eureka會將服務設置爲DWON,並將消息廣播發送出去,並更新緩存清單。
REST接口:DELETE/eureka/apps/appId/instanceId

5、健康檢查
服務微服務化之後,會對裏面的業務進行自我監控,如果某個業務斷開連接或者不正常工作,就需要發送給Eureka註冊中心,將服務的狀態從UP改爲DOWN,Eureka註冊中心就不會再向客戶端發起請求,這樣的一個流程就叫做健康檢測。健康狀態接口還可以通過http://ip:port/health來查看,內容如下:
Example:

{
"description":" Eureka  Client",
"status":"UP"
}

總結

整個流程下來其實不難,我理解的是這樣,sidecar模式其實也是在本身存在的服務基礎上實現一個健康檢查接口,向Eureka服務端註冊,並向Eureka服務端反饋自身的一個健康情況。
第一次寫博客,如有錯誤或者不當的地方,歡迎指正!如果有侵權的地方,請及時告知,謝謝!

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