3.8、Rest端点
常用的 Eureka REST API 除了 /eureka/apps
之外,还有如下接口:
操作 | http 动作 | 接口 | 描述 |
---|---|---|---|
注册新的应用实例 | POST | /eureka/apps/{APP_NAME} | 可以输入 json 或者 xml 格式的 body,成功返回 204 |
注销实例 | DELETE | /eureka/apps/{APP_NAME}/{INSTANCEINFO_ID} | 成功返回 200 |
发送心跳 | PUT | /eureka/apps/{APP_NAME}/{INSTANCEINFO_ID} | 成功返回 200,instanceId 不存在返回 404 |
查询所有实例 | GET | /eureka/apps | 成功返回 200,输出 json 或 xml 格式的 body |
查询单个实例 | GET | /eureka/apps/{APP_NAME} | 成功返回 200,输出json 或 xml 格式的 body |
根据 appName、instanceId 查询 | GET | /eureka/apps/{APP_NAME}/{INSTANCEINFO_ID} | 成功返回 200,输出 json 或 xml 格式的 body |
暂停某个实例 | PUT | /eureka/apps/{APP_NAME}/{INSTANCEINFO_ID}/status?value=OUT_OF_SERVICE | 成功返回 200,失败返回 500 |
恢复某个实例 | DELETE | /eureka/apps/{APP_NAME}/{INSTANCEINFO_ID}/status?vlaue=UP(value 可不传) | 成功返回 200,失败返回 500 |
更新元数据 | PUT | /euerka/apps/{APP_NAME}/{INSTANCEINFO_ID}/metadata?key=value | 成功返回 200,失败返回 500 |
根据虚拟 ip 查询 | GET | /eureka/vip/{vipAddr} | 成功返回 200,输出 json 或 xml 格式的 body |
根据基于 htpps 的虚拟 ip 查询 | GET | /eureka/svip/{svipAddr} | 成功返回 200,输出 json 或 xml 格式的 body |
引用:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
在进行新实例的注册时,传入的 json、xml 的格式需要与调用获取单个实例所返回的数据格式一致。具体的数据需要自己指定,需要注意的是,如果要注册的实例的ip、端口已经存在的话,不会再次注册,需要修改 INSTANCEINFO_ID。
示例:
<instance>
<instanceId>localhost:spring-cloud-eureka-client-simple:9000</instanceId>
<hostName>localhost</hostName>
<app>spring-cloud-eureka-client-simple</app>
<ipAddr>127.0.0.1</ipAddr>
<vipAddress>spring-cloud-eureka-client-simple</vipAddress>
<secureVipAddress>spring-cloud-eureka-client-simple</secureVipAddress>
<status>UP</status>
<port enabled="true">9000</port>
<securePort enabled="false">443</securePort>
<homePageUrl>http://127.0.0.1:9000/</homePageUrl>
<statusPageUrl>http://127.0.0.1:9000/info</statusPageUrl>
<healthCheckUrl>http://127.0.0.1:9000/health</healthCheckUrl>
<dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
<name>MyOwn</name>
</dataCenterInfo>
</instance>
使用POSTMAN发送http://localhost:8761/eureka/apps/spring-cloud-eureka-client-simple
的POST请求,请求头的Content-Type
设置为application/xml
,则会在 Eureka 的首页页面出现该服务的注册信息:
将 Eureka Server 的自我保护机制关闭(即eureka.server.enable-self-preservation=false
),然后等待一段事件时间,就会触发 AbstractInstanceRegistry 的evict
方法,即触发服务下线的操作,从而剔除服务。
其他Rest端点可以自行尝试。
3.9、高可用注册中心
在之前的讲解中,Eureka Server 都是单机版的,所以不需要注册自己。但是如果当 Eureka Server 宕机之后会发生什么?消费者可以依靠缓存继续消费远程服务提供者,若服务提供者正常服务当然没问题,但是如果需要依靠新的服务来提供服务功能的时候,就会出现服务不可用的情况,新的服务因为无法进行注册也无法告知服务消费者服务的状态,从而影响整个系统的功能,所以在分布式环境中,需要充分考虑发生故障的情况,在生产环境中必须要高可用的部署。
之前讲解概念的时候,每一个Eureka Server 同样也是一个 Eureka Client,既然是一个Client,那就可以进行注册到其他的注册中心。
在这里使用一台机器配置多个注册中心,首先需要在hosts添加映射
127.0.0.1 peer2
127.0.0.1 peer3
127.0.0.1 peer4
将原来的服务端口,以及eureka.client
相关配置进行修改,以peer2节点为例:
# peer2节点
server.port=8762
spring.application.name=eureka-server
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
# 修改注册中心地址,
eureka.client.defaultZone=http://peer3:8763/eureka,http://peer4:8764/eureka
# peer3节点
server.port=8763
spring.application.name=eureka-server
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
# 修改注册中心地址,
eureka.client.defaultZone=http://peer2:8762/eureka,http://peer4:8764/eureka
# peer4节点
server.port=8764
spring.application.name=eureka-server
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
# 修改注册中心地址,
eureka.client.defaultZone=http://peer2:8762/eureka,http://peer3:8763/eureka
依次启动每一个 Eureka Server 服务,打开peer2的 Eureka 首页会发现几处不同的地方,其他节点的Eureka首页也类似:
而对于服务提供者或者服务消费者,只需要配置eureka.client.defaultZone=http://peer2:8762/eureka,http://peer3:8763/eureka,http://peer4:8764/eureka
即可完成注册。其实在 Eureka Client 端只配置其中一台 Eureka Server 的注册中心的地址也可以,因为在 Eureka集群中,会将任何一个peer节点的注册信息同步到其他节点上。
3.10、Eureka安全认证
默认情况下,进入Eureka首页是不需要用户名和密码的。如果需要登录的话,则只需要引入spring-security依赖:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
同时在application.yml
或者application.properties
添加:
spring:
security: #security认证
user:
name: eureka #用户名
password: eureka #密码
这时登录Eureka首页的时候,会提示需要登录,如图所示:
输入eureka/eureka即可登录到首页。
而 **Eureka Client **客户端要想把服务注册到注册中心,需要在指定注册中心的地址之外,还需要配置注册中心的用户名和密码:
# username, password, host, port替换成真实的数据
eureka.client.service-url.defaultZone=http://${username}:${password}@${host}:${port}/eureka/
微信公众号:Java知识集训