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/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传递:

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

服务状态变更

服务的状态已经由原本的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码云源码 项目底部扫描微信公众号二维码关注我,感谢阅读!!!

学习目录推荐

开源信息

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Coding迪斯尼

java开发操作系统:同时运行多窗口多任务

1395
来自专栏java一日一条

Java Spring中同时访问多种不同数据库

开发企业应用时我们常常遇到要同时访问多种不同数据库的问题,有时是必须把数据归档到某种数据仓库中,有时是要把数据变更推送到第三方数据库中。使用Spring框架时,...

2481
来自专栏行者常至

idea Java 代码编写规范

1120
来自专栏惨绿少年

AWStats日志分析系统

AWStats是一款功能强大且功能强大的免费工具,可以图形方式生成高级Web,流媒体,ftp或邮件服务器统计信息。此日志分析器用作CGI或命令行, 并在几个图形...

1541
来自专栏JetpropelledSnake

RESTful源码学习笔记之RPC和Restful深入理解

RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法)。通常的实...

1043
来自专栏一枝花算不算浪漫

集群下session共享问题的解决方案.

81610
来自专栏拭心的安卓进阶之路

Android 进阶13:几种进程通信方式的对比总结

不花时间打基础,你将会花更多时间解决那些不必要的问题。 RPC 是什么 RPC 即 Remote Procedure Call (远程过程调用) 是一种计算机通...

3225
来自专栏老码农专栏

ActFramework r1.3.0 - 激动人心的特性一览

1322
来自专栏黑泽君的专栏

eclipse中如何删除已经添加到 Web App Libraries 中引用的jar包

在 eclipse 中的 动态web项目 中,例如:我们通过向  /bos19/WebContent/WEB-INF/lib 中添加我们需要用到的jar包,如下...

1.8K2
来自专栏技术墨客

Hazelcast集群服务(3)——集群功能详解

    在前2篇博文中,介绍了 Hazelcast的基本原理 和 Hazelcast基本配置。后续的博文会逐一介绍Hazelcast的主要功能组件。本篇将详细说...

2304

扫码关注云+社区

领取腾讯云代金券