Eureka 官网
Eureka Wiki

一、Eureka 常见问题

Eureka 官方简单描述
涉及的部分问答

1.1、What is Eureka?

1.2、What is the need for Eureka?

1.3、When should I use Eureka?

1.4、How does the application client and application server communicate?

二、Eureka 架构概述

官方介绍

2.1、Eureka 架构

11.png
根据官方描述可以总结如下几个点:

1、Eureka 系统组成

Eureka 系统由 “读” 和 “写” 集群组成。(Eureka system itself consists of a write and read cluster. )

  • 写集群

    The write cluster is a stateful subsystem, which handles client registrations and maintains internal service registry. (写集群是一个有状态的系统,主要用来处理客户端注册和内部服务注册表的维护。) The registry content is replicated between the all write server nodes in an eventually consistent manner. (注册表能够在所有写服务上进行复制,也就是说 写服务 间的注册表数据是最终一致而非强一致,为 AP 模型。) The write cluster’s registry content is read by the read cluster, that ultimately is used by the Eureka clients. (写集群上的注册表提供给读集群进行读取,最终由 Eureka Client 使用)

  • 读集群

    As the read cluster is effectively a cache layer, it can be easily, and rapidly scaled up and down depending on the volume of the traffic.The write cluster should be pre-scaled with a capacity enough to handle the peek/busy hour traffic. (读集群本身是一个缓存层,它可以根据流量简单,快速的扩展或者缩小规模。不过 写集群需要预先进行扩展,使得其能够处理高峰时间的流量)

2、Euraka 扩容和缩容

Although it can be scaled up and down dynamically, it needs to be done with more coordination. Scaling up will require traffic re-balancing, which will eventually happen, but not immediately. Scaling down will force the clients from the shutdown node(s) to re-register.

虽然 Eureka 能够动态的进行索然,但是也需要满足一些条件。

  • 扩容时,需要对流量进行重新平鹏,而平衡需要一个过程,不是一蹴而就的。
  • 缩容时,会强制已经注册的 client 踢下线,重新进行注册。

2.2、client 端 注册到 Server 端

12.png
根据官方描述总结如下:

1、Client 与 Server 的三种交互方式

  • register

    注册

  • heartbeats/updates

    维持心跳/更新client 信息

  • unregister

    从注册表中移除

2、client 与 Server 端的交互由 Write Cluster 来完成

3、client 与 Server 端的心跳

  • client 注册信息可能存在于 Server 端的注册表中,但是此时的 client 端实际已经是 down 的状态

    Software heartbeats at the Eureka level is used to determine connection liveness as network stacks in virtualized environments are not 100% trustworthy. If a connection is lost, the registration entry in the write cluster registry is put into the eviction queue, and ultimately remove from the registry. (Eureka 通过软件心跳来确定 client 与 server 的连接状态,因此在网络环境中不能保证 server 注册表中显示 client 为 up 的信息是 100% 正确的。因为网络延时,并不能保证 server 端能够马上得知 client 已经 down了。 针对连接丢失的 client,write 集群注册表中的注册条目会被放到 eviction queue 中,最终从注册表中移除。)

4、注册到 server 中的 client 信息能够被更改

通过API 如:/eureka/apps/{appID}/{instanceID}/status?value=UP 能够进行状态更改

2.3、注册发现

13.png
通过官方描述,总结client 端与 server 端间的注册发现如下:

  • 拉取注册表信息
  • 订阅 Eureka 服务

    当 Eureka Server 中的注册表信息发生变更会通知到 Client

  • 取消 Eureka 服务订阅

2.4、服务注册数据模型

14.png
通过对比前面通过查询实例的API /eureka/apps/{appID}/{instanceID} 返回的数据结构
15.png

三、Eureka Rest API

1.1、Eureka API

针对上述架构实现,Eureka 提供了一系列服务注册、续约、服务变更 API 接口。
官方提供的 Rest API 列表

Operation HTTP action Description
注册新的服务实例 POST
/eureka/apps/{appID}
可以发起 JSON/XML 为载体的 HTTP 请求。
204:成功
注销服务实例 DELETE
/eureka/apps/{appID}/{instanceID}
HTTP Code: 200 on success
发送应用实例心跳 PUT
/eureka/apps/{appID}/{instanceID}
200:成功
404:instanceId 不存在
查询所有的实例 GET
/eureka/apps
200:成功
返回 JSON/XML 格式数据
根据 appID 查询实例 GET
/eureka/apps/{appID}
200:成功
返回 JSON/XML 格式数据
根据 appIDinstanceID 查询实例 GET
/eureka/apps/{appID}/{instanceID}
200:成功
返回 JSON/XML 格式数据
根据 instanceID 查询实例 GET
/eureka/instances/{instanceID}
200:成功
返回 JSON/XML 格式数据
根据 appIDinstanceID 将实例设置为不可用 PUT
/eureka/apps/{appID}/{instanceID}/status?value=OUT_OF_SERVICE
200:成功
500:失败
根据 appIDinstanceID 将实例设置为可用 DELETE
/eureka/apps/{appID}/{instanceID}/status?value=UP (The value=UP is optional, it is used as a suggestion for the fallback status due to removal of the override)
200:成功
500:失败
根据 appIDinstanceID 更新实例元数据信息 PUT
/eureka/apps/{appID}/{instanceID}/metadata?key=value
200:成功
500:失败
根据 vipAddress 查询相关的所有实例 GET
/eureka/vips/{vipAddress}
200:成功,并返回 JSON/XML 格式数据
404:vipAddress 不存在
根据 svipAddress 查询相关的所有治理 GET
/eureka/svips/{svipAddress}
200:成功,并返回 JSON/XML 格式数据
404:svipAddress 不存在

1.2、部分 API 测试

提供三个服务
01.png

服务 端口 作用
eureka 1111 服务注册中心
client 9527 客户端服务,向 eureka
注册
server 9530 服务端服务,向 eureka
注册

提供测试API: http://localhost:9527/hello?name=zhixing

查询所有服务实例 /eureka/apps

02.png

根据 “appID(服务名)” 查询实例 /eureka/apps/{appId}

03.png

根据 “appID(服务名)” 和 “instanceId” 查询实例 /eureka/apps/{appID}/{instanceID}

04.png

将实例设置为不可用 /eureka/apps/{appID}/{instanceID}/status?value=OUT_OF_SERVICE

关闭 server 服务。
05.png
尝试获取服务实例信息
06.png
尝试进行 API 调用
07.png

将实例设置改为可用 /eureka/apps/{appID}/{instanceID}/status?value=UP

开启 server 服务。
08.png
尝试获取服务实例信息
09.png
尝试进行 API 调用(服务列表的更新会有延时,需要等待服务列表进行刷新)
10.png