使用其他(非java)语言开发Eureka客户端

前言

公司需要调研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/xmlapplication/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):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?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

1
2
3
4
5
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

1
2
3
4
Response:
Status:
200 (on success)
500 (failure)

如果我的内容对您有所帮助, 可以小额打赏支持一下.