Netflix Eureka集群和监听

Eureka集群开发

在生产环境中必须搭建一个集群来保证高可用。

Eureka 的集群搭建方法很简单:每一台 Eureka 只需要在配置中指定另外多个 Eureka 的地址就可以实现一个集群的搭建了。

实现思想:

1.在多台EurekaServer服务注册中心中,每台配置文件中添加向对方各个服务注册中心地址 注册.

server:
  port: 8761

eureka:
  client:
    serviceUrl:
      # 指向你的从节点的Eureka
      defaultZone: http://root:123456@localhost:8762/eureka/,http://root:123456@localhost:8763/eureka/

多个节点英文逗号来隔开即可.

这样每个服务注册中心里面的注册服务都会实现共享.无论谁出现问题,应用都能继续使用存活的注册中心。

2.在多个Service Provide/Service Customer项目中,每个项目配置文件中添加各个服务注册中心地址 注册.

配置方法同上一样.

这样每个服务,无论哪个服务注册中心出现问题,应用都能继续注册到正常运行的服务注册中心去,而不存在服务停止。

Eureka快速移除失效服务

在实际开发过程中,我们可能会不停地重启服务,由于 Eureka 有自己的保护机制,故节点下线后,服务信息还会一直存在于 Eureka 中。我们可以通过配置失效时间让移除的速度更快一点,但只在开发环境下使用,生产环境下不推荐使用。

对于服务注册中心项目,首先关闭自我保护模式,再设置清理间隔时间.

eureka:
    server:
        #自我保护模式关闭
        enableSelfPreservation: false
        # 默认移除失效服务时间为 60000 毫秒
        eviction-interval-timer-in-ms: 5000

服务客户端中设置返回心跳频率和返回超时时间.

eureka:
    client:
        healthcheck:
            # 开启状态监测
            enabled: true
    instance:
        # 默认每 30 秒Eureka Client返回一次状态
        lease-renewal-interval-in-seconds: 5
        # 默认超时时间,每90秒未收到Eureka Client状态,则移除该实例
        lease-expiration-duration-in-seconds: 5

由于使用了healthcheck功能开启健康检查,所以需要导入actuator依赖包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

服务上下线监控

在一些特定的情况下,可能需要对服务的上下线进行监控,比如服务的上下线进行邮件通知,进行短信通知等等.

Eureka 中提供了事件监听的方式来扩展。

  • EurekaInstanceCanceledEvent 服务下线事件。
  • EurekaInstanceRegisteredEvent 服务注册事件。
  • EurekaInstanceRenewedEvent 服务续约事件。
  • EurekaRegistryAvailableEvent Eureka 注册中心启动事件。
  • EurekaServerStartedEvent Eureka Server 启动事件。

可以创建一个Eureka服务监听组件类

@Component
public class EurekaStateChangeListener &#123;
    @EventListener
    public void listen(EurekaInstanceCanceledEvent event) &#123;
        System.err.println(event.getServerId() + "\t" + event.getAppName() + " 服务下线 ");
    &#125;
    @EventListener
    public void listen(EurekaInstanceRegisteredEvent event) &#123;
        InstanceInfo instanceInfo = event.getInstanceInfo();
        System.err.println(instanceInfo.getAppName() + " 进行注册 ");
    &#125;
    @EventListener
    public void listen(EurekaInstanceRenewedEvent event) &#123;
        System.err.println(event.getServerId() + "\t" + event.getAppName() + " 服务进行续约 ");
    &#125;
    @EventListener
    public void listen(EurekaRegistryAvailableEvent event) &#123;
        System.err.println(" 注册中心启动 ");
    &#125;
    @EventListener
    public void listen(EurekaServerStartedEvent event) &#123;
        System.err.println("Eureka Server启动 ");
    &#125;
&#125;

注意:在 Eureka 集群环境下,每个节点都会触发事件,这个时候需要控制下发送通知的行为,不控制的话每个节点都会发送通知。