一、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 架构
根据官方描述可以总结如下几个点:
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 端
根据官方描述总结如下:
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、注册发现
通过官方描述,总结client 端与 server 端间的注册发现如下:
- 拉取注册表信息
订阅 Eureka 服务
当 Eureka Server 中的注册表信息发生变更会通知到 Client
取消 Eureka 服务订阅
2.4、服务注册数据模型
通过对比前面通过查询实例的API /eureka/apps/{appID}/{instanceID}
返回的数据结构
三、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 格式数据 |
根据 appID 和 instanceID 查询实例 | GET /eureka/apps/{appID}/{instanceID} |
200:成功 返回 JSON/XML 格式数据 |
根据 instanceID 查询实例 | GET /eureka/instances/{instanceID} |
200:成功 返回 JSON/XML 格式数据 |
根据 appID 和 instanceID 将实例设置为不可用 | PUT /eureka/apps/{appID}/{instanceID}/status?value=OUT_OF_SERVICE |
200:成功 500:失败 |
根据 appID 和 instanceID 将实例设置为可用 | 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:失败 |
根据 appID 和 instanceID 更新实例元数据信息 | 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 测试
提供三个服务
服务 | 端口 | 作用 |
---|---|---|
eureka | 1111 | 服务注册中心 |
client | 9527 | 客户端服务,向 eureka 注册 |
server | 9530 | 服务端服务,向 eureka 注册 |
提供测试API: http://localhost:9527/hello?name=zhixing
查询所有服务实例 /eureka/apps
根据 “appID(服务名)” 查询实例 /eureka/apps/{appId}
根据 “appID(服务名)” 和 “instanceId” 查询实例 /eureka/apps/{appID}/{instanceID}
将实例设置为不可用 /eureka/apps/{appID}/{instanceID}/status?value=OUT_OF_SERVICE
关闭 server
服务。
尝试获取服务实例信息
尝试进行 API 调用
将实例设置改为可用 /eureka/apps/{appID}/{instanceID}/status?value=UP
开启 server
服务。
尝试获取服务实例信息
尝试进行 API 调用(服务列表的更新会有延时,需要等待服务列表进行刷新)