前言
公司需要調研Eureka在非JAVA應用中的使用,我在Eureka的官方github上找到了一份wiki,是官方提供的Eureka一些REST操作API,其他語言可以使用這些API來實現對Eureka Server的操作從而實現一個非jvm語言的Eureka Client。
這篇博文主要是對Eureka官方的提供的REST操作的WIKI做了翻譯,並沒有提供具體的實際案例代碼。
不過今天(2017-9-20)我在閱讀《Spring Cloud與Docker微服務架構實戰》書中看到了有這部分的使用說明,其中4.9節介紹了詳細使用過程。如果有需要的話可以參考一下。
另外如果感興趣可以看看書中8.11節“使用Sidecar整合非JVM微服務”這部分,關於這部分的內容本人博客也有兩篇相關博文:
Spring Cloud Netflix多語言/非java語言支持之Sidecar
使用Sidecar將Node.js引入Spring Cloud
版本說明
Eureka REST operations
翻譯的版本為David Liu 在2016年2月26編輯的版本。
英文原文地址:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
正文翻譯
下面是可用於非JAVA應用的Eureka REST操作。
appID是應用程序的名稱,instanceID是與服務實例相關聯的唯一id。在AWS雲中,instanceID是服務實例的實例id,在其他數據中心(非AWS環境),它是服務實例的主機名。
對下面的JSON/XML格式而言,內容的類型必須是application/xml 或 application/json。
操作 | HTTP action | 描述 |
---|---|---|
注冊新的應用實例 | POST /eureka/v2/apps/appID | 接受JSON/XML格式請求,返回204響應碼表示成功 |
取消注冊(de-register)應用實例 | DELETE /eureka/v2/apps/appID/instanceID | 返回響應碼200表示成功 |
發送應用實例心跳 | PUT /eureka/v2/apps/appID/instanceID | 返回響應碼200表示成功,404表示instanceID不存在 |
查詢所有實例 | GET /eureka/v2/apps | 返回響應碼200表示成功,響應內容格式JSON/XML |
為所有appID實例做查詢(Query for all appID instances) | GET /eureka/v2/apps/appID | 返回響應碼200表示成功,響應內容格式JSON/XML |
為特定的appID/instanceID做查詢 | GET /eureka/v2/apps/appID/instanceID | 返回響應碼200表示成功,響應內容格式JSON/XML |
為特定的instanceID做查詢 | GET /eureka/v2/instances/instanceID | 返回響應碼200表示成功,響應內容格式JSON/XML |
停止服務實例(Take instance out of service) | PUT /eureka/v2/apps/appID/instanceID/status?value=OUT_OF_SERVICE | 返回響應碼200表示成功,500失敗。 |
將實例恢復到服務(移除覆蓋) | DELETE /eureka/v2/apps/appID/instanceID/status?value=UP (value=UP是可選的,它被建議用於fallback狀態,由於取消了覆蓋) | 返回響應碼200表示成功,500失敗。 |
更新元數據 | PUT /eureka/v2/apps/appID/instanceID/metadata?key=value | 返回響應碼200表示成功,500失敗。 |
查詢特定vip address 下的所有實例 | GET /eureka/v2/vips/vipAddress | 返回響應碼200表示成功,響應內容格式:JSON/XML,返回404表示vipAddress不存在 |
查詢特定secure vip address下所有實例 | GET /eureka/v2/svips/svipAddress | 返回響應碼200表示成功,響應內容格式:JSON/XML,返回404表示svipAddress不存在 |
服務注冊
在進行注冊時,你需要提交符合該XSD的XML(或JSON):
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="instance">
<xsd:complexType>
<xsd:all>
<!-- hostName in ec2 should be the public dns name, within ec2 public dns name will
always resolve to its private IP -->
<!-- ec2中的主機名應該是公告的dns名稱,在ec2內,公共dns名稱將
始終對其私有IP進行解析 -->
<xsd:element name="hostName" type="xsd:string" />
<xsd:element name="app" type="xsd:string" />
<xsd:element name="ipAddr" type="xsd:string" />
<xsd:element name="vipAddress" type="xsd:string" />
<xsd:element name="secureVipAddress" type="xsd:string" />
<xsd:element name="status" type="statusType" />
<xsd:element name="port" type="xsd:positiveInteger" minOccurs="0" />
<xsd:element name="securePort" type="xsd:positiveInteger" />
<xsd:element name="homePageUrl" type="xsd:string" />
<xsd:element name="statusPageUrl" type="xsd:string" />
<xsd:element name="healthCheckUrl" type="xsd:string" />
<xsd:element ref="dataCenterInfo" minOccurs="1" maxOccurs="1" />
<!-- optional 可選 -->
<xsd:element ref="leaseInfo" minOccurs="0"/>
<!-- optional app specific metadata -->
<xsd:element name="metadata" type="appMetadataType" minOccurs="0" />
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:element name="dataCenterInfo">
<xsd:complexType>
<xsd:all>
<xsd:element name="name" type="dcNameType" />
<!-- metadata is only required if name is Amazon -->
<xsd:element name="metadata" type="amazonMetdataType" minOccurs="0"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:element name="leaseInfo">
<xsd:complexType>
<xsd:all>
<!-- (optional) if you want to change the length of lease - default if 90 secs -->
<!-- 可選, 如果你想更改租約的時間。 - 默認情況下90 秒。(該值會在下面會進行說明。) -->
<xsd:element name="evictionDurationInSecs" minOccurs="0" type="xsd:positiveInteger"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="dcNameType">
<!-- Restricting the values to a set of value using 'enumeration' -->
<!-- 使用'enumeration'(枚舉)將值限制為一組值 -->
<xsd:restriction base = "xsd:string">
<xsd:enumeration value = "MyOwn"/>
<xsd:enumeration value = "Amazon"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="statusType">
<!-- Restricting the values to a set of value using 'enumeration' -->
<!-- 使用'enumeration'(枚舉)將值限制為一組值 -->
<xsd:restriction base = "xsd:string">
<xsd:enumeration value = "UP"/>
<xsd:enumeration value = "DOWN"/>
<xsd:enumeration value = "STARTING"/>
<xsd:enumeration value = "OUT_OF_SERVICE"/>
<xsd:enumeration value = "UNKNOWN"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="amazonMetdataType">
<!-- From <a class="jive-link-external-small" href="http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/index.html?AESDG-chapter-instancedata.html" target="_blank">http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/index.html?AESDG-chapter-instancedata.html</a> -->
<xsd:all>
<xsd:element name="ami-launch-index" type="xsd:string" />
<xsd:element name="local-hostname" type="xsd:string" />
<xsd:element name="availability-zone" type="xsd:string" />
<xsd:element name="instance-id" type="xsd:string" />
<xsd:element name="public-ipv4" type="xsd:string" />
<xsd:element name="public-hostname" type="xsd:string" />
<xsd:element name="ami-manifest-path" type="xsd:string" />
<xsd:element name="local-ipv4" type="xsd:string" />
<xsd:element name="hostname" type="xsd:string"/>
<xsd:element name="ami-id" type="xsd:string" />
<xsd:element name="instance-type" type="xsd:string" />
</xsd:all>
</xsd:complexType>
<xsd:complexType name="appMetadataType">
<xsd:sequence>
<!-- this is optional application specific name, value metadata -->
<!-- 這是可選的應用專用名,值的元數據。 -->
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
evictionDurationInSecs:
默認情況下Eureka Server會每隔60秒檢測失效的服務,失效的服務是超過一定時間沒有發送心跳進行續約的服務。
這里的evictionDurationInSecs用來定義服務租約的超時時間。
該值定義在org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean#leaseExpirationDurationInSeconds
表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超時時間,在這個時間內若沒收到下一次心跳,則將移除該instance,默認為90秒。
- 如果該值太大,則很可能將流量轉發過去的時候,該instance已經不存活了。
- 如果該值設置太小了,則instance則很可能因為臨時的網絡抖動而被摘除掉。
- 該值至少應該大於leaseRenewalIntervalInSeconds
服務續約
示例 : PUT /eureka/v2/apps/MYAPP/i-6589ef6
Response:
Status:
200 (on success)
404 (eureka doesn't know about you, Register yourself first)
500 (failure)
服務關閉/服務下線
(If Eureka doesn’t get heartbeats from the service node within the evictionDurationInSecs, then the node will get automatically de-registered )
如果Eureka在服務租約超時時間內沒有從服務節點獲得心跳續約,那么服務節點將自動取消注冊。
示例 : DELETE /eureka/v2/apps/MYAPP/i-6589ef6
Response:
Status:
200 (on success)
500 (failure)