前言
公司近期要將園區所有的服務做成微服務模式,因之前負責的網關服務是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服務端反饋自身的一個健康情況。
第一次寫博客,如有錯誤或者不當的地方,歡迎指正!如果有侵權的地方,請及時告知,謝謝!