Eureka服务注册中心内置的REST节点列表


你有没有考虑过Eureka ClientEureka Server是通过什么方式进行通讯的?
为什么Client启动成功后Server就会被注册到Server的服务列表内?
为什么我们在正常关闭ClientServer会有所感知?

既然这么多问题,带着这些问题来进行本章的学习吧。

本章目标

熟悉Eureka Server内部提供的REST服务维护请求节点。

构建项目

我们本章知识点不需要涉及到代码的编写,所以我们只需要运行之前章节/eureka-server.html的源码即可。

REST节点一览

Eureka Server内部通过JAX-RS(Java API for RESTful Web Services)规范提供了一系列的管理服务节点的请求节点,这样也保证了在非JVM环境运行的程序可以通过HTTP REST方式进行管理维护指定服务节点,所以只要遵循Eureka协议的服务节点都可以进行注册Eureka Server

Eureka提供的REST请求可以支持XML以及JSON形式通信,默认采用XML方式,REST列表如表所示:

请求名称 请求方式 HTTP地址 请求描述
注册新服务 POST /eureka/apps/{appID} 传递JSON或者XML格式参数内容,HTTP code为204时表示成功
取消注册服务 DELETE /eureka/apps/{appID}/{instanceID} HTTP code为200时表示成功
发送服务心跳 PUT /eureka/apps/{appID}/{instanceID} HTTP code为200时表示成功
查询所有服务 GET /eureka/apps HTTP code为200时表示成功,返回XML/JSON数据内容
查询指定appID的服务列表 GET /eureka/apps/{appID} HTTP code为200时表示成功,返回XML/JSON数据内容
查询指定appID&instanceID GET /eureka/apps/{appID}/{instanceID} 获取指定appID以及InstanceId的服务信息,HTTP code为200时表示成功,返回XML/JSON数据内容
查询指定instanceID服务列表 GET /eureka/apps/instances/{instanceID} 获取指定instanceID的服务列表,HTTP code为200时表示成功,返回XML/JSON数据内容
变更服务状态 PUT /eureka/apps/{appID}/{instanceID}/status?value=DOWN 服务上线、服务下线等状态变动,HTTP code为200时表示成功
变更元数据 PUT /eureka/apps/{appID}/{instanceID}/metadata?key=value HTTP code为200时表示成功
查询指定IP下的服务列表 GET /eureka/vips/{vipAddress} HTTP code为200时表示成功
查询指定安全IP下的服务列表 GET /eureka/svips/{svipAddress} HTTP code为200时表示成功

在上面列表中参数解释

  • {appID}:服务名称,对应spring.application.name参数值
  • {instanceID}:实例名称,如果已经自定义instanceId则对应eureka.instance.instance-id参数值

服务注册

Eureka Client启动成功后会发送POST方式的请求到/eureka/apps/{appID},发送注册请求时的主体内容在官网也有介绍,如果我们根据指定的主体内容发送请求到Eureka Server时也是可以将服务注册成功的,主体内容要以XML/JSON格式的XSD传递:

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
<?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 -->
<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 -->
<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' -->
<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' -->
<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>

我们本章先来使用之前章节/eureka-register-service.html源码进行自动注册服务,在之后的章节内我们再来细讲具体怎么通过符合以上XSD主体内容的XML/JSON手动注册。

在下面我们来看下通过REST来维护服务实例,在这之前我们需要通过以下步骤进行启动服务,为后续REST请求维护服务实例提供环境:

  1. 启动Eureka Server,源码查看/eureka-server.html
  2. 启动Eureka Client,源码查看/eureka-register-service.html

服务状态变更

我们可以直接修改服务实例的运行状态,比如服务关闭,会从UP转换为DOWN,我们通过curl命令来测试服务的状态变更,如下所示:

1
curl -v -X PUT http://localhost:10000/eureka/apps/HENGBOY-SPRING-CLOUD-EUREKA-PROVIDER/hengboy-spring-cloud-eureka-provider:20000:v1.0/status\?value\=DOWN

其中参数HENGBOY-SPRING-CLOUD-EUREKA-PROVIDERappIDhengboy-spring-cloud-eureka-provider:20000:v1.0instanceID
执行完成后可以打开Eureka Server管理平台查看服务实例列表查看服务状态,如下图所示:
服务状态变更
服务的状态已经由原本的UP改为了DOWN

服务基本信息获取

Eureka提供获取指定appID以及instanceID的详细信息,可以详细的返回服务实例的配置内容,获取信息的命令如下:

1
curl http://localhost:10000/eureka/apps/HENGBOY-SPRING-CLOUD-EUREKA-PROVIDER/hengboy-spring-cloud-eureka-provider:20000:v1.0

执行命令返回值的格式化如下所示:

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
<instance>
<instanceId>hengboy-spring-cloud-eureka-provider:20000:v1.0</instanceId>
<hostName>192.168.1.75</hostName>
<app>HENGBOY-SPRING-CLOUD-EUREKA-PROVIDER</app>
<ipAddr>192.168.1.75</ipAddr>
<status>UP</status>
<overriddenstatus>UNKNOWN</overriddenstatus>
<port enabled="true">20000</port>
<securePort enabled="false">443</securePort>
<countryId>1</countryId>
<dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
<name>MyOwn</name>
</dataCenterInfo>
<leaseInfo>
<renewalIntervalInSecs>30</renewalIntervalInSecs>
<durationInSecs>90</durationInSecs>
<registrationTimestamp>1539223540390</registrationTimestamp>
<lastRenewalTimestamp>1539229835439</lastRenewalTimestamp>
<evictionTimestamp>0</evictionTimestamp>
<serviceUpTimestamp>1539223539774</serviceUpTimestamp>
</leaseInfo>
<metadata>
<management.port>20000</management.port>
<jmx.port>54581</jmx.port>
</metadata>
<homePageUrl>http://192.168.1.75:20000/</homePageUrl>
<statusPageUrl>http://192.168.1.75:20000/actuator/info</statusPageUrl>
<healthCheckUrl>http://192.168.1.75:20000/actuator/health</healthCheckUrl>
<vipAddress>hengboy-spring-cloud-eureka-provider</vipAddress>
<secureVipAddress>hengboy-spring-cloud-eureka-provider</secureVipAddress>
<isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
<lastUpdatedTimestamp>1539223540390</lastUpdatedTimestamp>
<lastDirtyTimestamp>1539223539732</lastDirtyTimestamp>
<actionType>ADDED</actionType>
</instance>

返回值的比较详细,如需选择使用。

服务剔除

当然我们同样可以主动将服务从Eureka剔除,剔除后会直接从服务实例列表中删除,可执行如下命令:

1
curl -v -X DELETE localhost:10000/eureka/apps/HENGBOY-SPRING-CLOUD-EUREKA-PROVIDER/hengboy-spring-cloud-eureka-provider:20000:v1.0

注意:由于Eureka Client一直在运行,删除后也会自动通过注册服务REST注册实例。

总结

本章讲解了怎么通过主动以及自动同步的方式将Eureka Client注册到服务注册中心集群环境中,为了保证完整性,还是建议手动进行配置,自动同步也有不成功的情况存在。

Eureka服务注册中心内置的REST节点列表

https://blog.minbox.org/eureka-rest.html

作者

恒宇少年 - 于起宇

发布于

2018-10-11

更新于

2022-10-26

许可协议

评论