(三)Spring Cloud Eureka 常用配置
关闭自我保护
保护模式主要在一组客户端和 Eureka Server 之间存在网络分区场景时使用。一旦进入保护模式,Eureka Server 将会尝试保护其服务的注册表中的信息,不再删除服务注册表中的数据。当网络故障恢复后,该 Eureka Server 节点会自动退出保护模式。
eureka:
server:
enable-self-preservation: false //关闭自我保护
自定义 Eureka 的 InstanceID
客户端在注册时,服务的 Instance ID 的默认值的格式如下:
${spring.cloud.client.hostname}:${spring.application.name}:${spring.application. instance id:${server.port}}
其实就是“主机名:服务名称:服务端口”
如果想把主机名替换成 IP
eureka:
instance:
instance-id: ${spring.application.name}:${spring.cloud.client.ipaddress}:${server.port}
使用 IP 进行注册
eureka:
instance:
preferipAddress: true
自定义实例调整链接
通过配置实现了用 IP 进行注册,当点击 Instance ID 进行跳转的时候, 就可以用 IP 跳转了,跳转的地址默认是 IP+Port/info 。我们可以自定义这个跳转的地址:
eureka:
instance:
status-page-url: http://${spring.cloud.client.ip-address}:${server.port}/swagger-ui.html
快速移除已经失效的服务信息
在实际开发过程中,我们可能会不停地重启服务,由于 Eureka 有自己的保护机制,故节点下线后,服务信息还会一直存在于 Eureka 中。我们可以通过增加一些配置让移除的速度更快一点,当然只在开发环境下使用,生产环境下不推荐使用。
首先在 eureka-server 中增加两个配置,分别是关闭自我保护和清理间隔:
eureka:
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 5000 ## 默认 60000 毫秒
然后在客户端服务配置如下:
eureka:
client:
healthcheck:
enabled: true ## 开启健康检查
instance:
lease-renewal-interval-in-seconds: 5 ##默认 30 秒
lease-expiration-duration-in-seconds: 5 ##默认 30 秒
开启健康检查,需要在 pom.xml 中引入 actuator的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- lease-renewal-interval-in-seconds: 表示 Eureka Client 发送心跳给 server 端的频率。
- lease-expiration-duration-in-seconds: 表示 Eureka Server 至上一次收到 client 的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则移除该 Instance
更多的 Instance 配置信息可参考源码中的配置类:org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean
更多的 Server 配置信息可参考源码中的配置类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean
元数据使用
Eureka 的元数据有两种类型,分别是框架定好了的标准元数据和用户自定义元数据。标准元数据指的是主机名、IP 地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。自定义元数据可以使用 eureka.instance.metadataMap 进行配置。
自定义元数据说得通俗点就是自定义配置,我们可以为每个 Eureka Client 定义一些属于自己的配置,这个配置不会影响 Eureka 的功能。自定义元数据可以用来做一些扩展信息,比如灰度发布之类的功能,可以用元数据来存储灰度发布的状态数据,Ribbon 转发的时候就可以根据服务的元数据来做一些处理。当不需要灰度发布的时候可以调用 Eureka 提供的 REST API 将元数据清除掉。
eureka:
instance:
metadataMap:
version: 1.0
EuekaClient 使用
当我们的项目中集成了 Eureka 之后,可以通过 EurekaClient 来获取一些我们想要的数据,比如上面提的元数据。我们就可以直接通过 EurekaClient 来获取。
@Autowired
private EurekaClient eurekaClient;
除了使用 EurekaClient,还可以使用 DiscoveryClient, 不是Eureka 自带的, 是 Spring Cloud 重新封装的,类的路径为 org.springframework.cloud.client.discovery.DiscoveryClient
健康检查
默认情况下,Eureka 客户端是使用心跳和服务端通信来判断客户端是否存活,在某些场景下,比如服务对应的数据库出现了异常,但应用进程还是存在的,这意味着服务可以继续上报心跳,但其实此时的服务已经不能够正常提供服务了。
Spring Boot Actuator 提供了/actuator/health 端点,该端点可展示应用程序的健康信息, 当应用服务异常时,通过扩展健康检查的端点调整健康检查逻辑
eureka:
client:
healthcheck:
enabled: true
开启健康检查,在 pom.xml 中引入 actuator的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
public class CustomHealthIndicator extends AbstractHealthindicator {
protected void doHealthCheck(Builder builder) throws Exception {
}
}
服务上下线监控
在某些特定的需求下,我们需要对服务的上下线进行监控,上线或下线都进行邮件通知,Eureka 中提供了事件监昕的方式来扩展 。
- EurekaInstanceCanceledEvent 服务下线事件 。
- EurekaInstanceRegisteredEvent 服务注册事件。
- EurekaInstanceRenewedEvent 服务续约事件。
- EurekaRegistryAvailableEvent Eureka 注册中心启动事件。
- EurekaServerStartedEvent Eureka Server 启动事件。
基于 Eureka 提供的事件机制,可以监控服务的上下线过程
@Component
public class EurekaStateChangeListener {
@EventListener
public void listen(EurekaInstanceCanceledEvent event){
//服务下线监听
}
@EventListener
public void listen(EurekaInstanceRegisteredEvent event){
//服务注册事件监听
}
@EventListener
public void listen(EurekaInstanceRenewedEvent event){
//服务续约事件监听
}
@EventListener
public void listen(EurekaRegistryAvailableEvent event){
//注册中心启动监听
// 通过查看 EurekaServerInitializerConfiguration 源码 EurekaRegistryAvailableEvent 在 EurekaServerStartedEvent 之前发送
}
@EventListener
public void listen(EurekaServerStartedEvent event){
//Eureka Server 启动事件监听
}
}