SpringCloud组件:Eureka服务注册中心内置的REST节点列表

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

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

本章目标

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

构建项目

我们本章知识点不需要涉及到代码的编写,所以我们只需要运行之前章节SpringCloud组件:搭建Eureka服务注册中心的源码即可。

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/appsHTTP code为200时表示成功,返回XML/JSON数据内容
查询指定appID的服务列表GET/eureka/apps/{appID} HTTP code为200时表示成功,返回XML/JSON数据内容
查询指定appID&instanceIDGET/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=valueHTTP 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传递:

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

我们本章先来使用之前章节SpringCloud组件:将微服务提供者注册到Eureka服务中心源码进行自动注册服务,在之后的章节内我们再来细讲具体怎么通过符合以上XSD主体内容的XML/JSON手动注册。

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

  1. 启动Eureka Server,源码查看SpringCloud组件:搭建Eureka服务注册中心
  2. 启动Eureka Client,源码查看SpringCloud组件:将微服务提供者注册到Eureka服务中心
服务状态变更

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

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管理平台查看服务实例列表查看服务状态,如下图所示:

4461954-4bbe36df0cc19528.png
服务状态变更

服务的状态已经由原本的UP改为了DOWN

服务基本信息获取

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

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

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

<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剔除,剔除后会直接从服务实例列表中删除,可执行如下命令:

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注册到服务注册中心集群环境中,为了保证完整性,还是建议手动进行配置,自动同步也有不成功的情况存在。

源码位置

有问题要问?

如果你有技术相关的问题想要咨询恒宇少年,请去博客首页左侧导航栏,点击知识星球微信扫码加入我的星球。

与恒宇少年面对面

如果你喜欢恒宇少年的相关文章,那么就去微信公众号(恒宇少年)关注我吧!!!
当然你也可以去 SpringCloud码云源码 项目底部扫描微信公众号二维码关注我,感谢阅读!!!

学习目录推荐

开源信息

这段时间一直在编写开源的相关框架,致力于公司使用的框架升级以及开源计划,将公司使用到的工具以及插件进行升级重构并且开源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值