详解SpringCloud eureka服务状态监听

 更新时间:2018年07月19日 10:06:58   作者:时光沉旧了少年  
这篇文章主要介绍了详解SpringCloud eureka服务状态监听,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一.前言

近期由于公司不同平台项目之间的业务整合,需要做到相互访问! 每个平台均有自己的注册中心和服务,且注册中心相互之间并没有相互注册!

借助spring的事件监听,在eureka-server端监听服务注册,将所有服务的ip和port存放至redis库,然后让其他平台服务通过redis库获取ip和端口号,进而进行http调用.结构图如下:

二.事件解析

事件列表

org.springframework.cloud.netflix.eureka.server.event包下会发现如下类:

  • EurekaInstanceCanceledEvent: 服务下线事件
  • EurekaInstanceRegisteredEvent: 服务注册事件
  • EurekaInstanceRenewedEvent: 服务续约事件
  • EurekaRegistryAvailableEvent: eureka注册中心启动事件
  • EurekaServerStartedEvent: eureka server启动时间

源码分析

打开org.springframework.cloud.netflix.eureka.server.InstanceRegistry类,会发现当eureka服务续约、注册、取消等时,spring会publish不同的事件,对应的事件类就是上面的列表.

续约事件

 @Override
 public boolean renew(final String appName, final String serverId,
   boolean isReplication) {
  log("renew " + appName + " serverId " + serverId + ", isReplication {}"
    + isReplication);
  List<Application> applications = getSortedApplications();
  for (Application input : applications) {
   if (input.getName().equals(appName)) {
    InstanceInfo instance = null;
    for (InstanceInfo info : input.getInstances()) {
     if (info.getId().equals(serverId)) {
      instance = info;
      break;
     }
    }
    // 发布续约事件
    publishEvent(new EurekaInstanceRenewedEvent(this, appName, serverId,
      instance, isReplication));
    break;
   }
  }
  return super.renew(appName, serverId, isReplication);
 }
注册事件
 @Override
 public void register(InstanceInfo info, int leaseDuration, boolean isReplication) {
  handleRegistration(info, leaseDuration, isReplication);
  super.register(info, leaseDuration, isReplication);
 }
 
  private void handleRegistration(InstanceInfo info, int leaseDuration,
   boolean isReplication) {
  log("register " + info.getAppName() + ", vip " + info.getVIPAddress()
    + ", leaseDuration " + leaseDuration + ", isReplication "
    + isReplication);
  // 发布注册事件
  publishEvent(new EurekaInstanceRegisteredEvent(this, info, leaseDuration,
    isReplication));
 }

事件监听

通过上面的源码追溯,我们已经得到对应的事件类了,所以现在要做的仅仅是监听对应的事件即可,至此已经完成了我们所需要对事件监听后的业务处理!

@Component
public class EurekaStateChangeListener {

 @Value("${iptable.platform}")
 private String platform;
 
 @Autowired
 private RedisTemplate<String, String> redisTemplate;

 private static Logger logger = LoggerFactory.getLogger(EurekaStateChangeListener.class);
 private static final String COLON = ":";

 @EventListener//(condition = "#event.replication==false")
 public void listen(EurekaInstanceCanceledEvent eurekaInstanceCanceledEvent) {
  // 服务断线事件
  String appName = eurekaInstanceCanceledEvent.getAppName();
  String serverId = eurekaInstanceCanceledEvent.getServerId();
  Objects.requireNonNull(appName, "服务名不能为空!");

  SetOperations<String, String> opsForSet = redisTemplate.opsForSet();
  opsForSet.remove((platform + appName).toLowerCase(), serverId);
  logger.info(">>>>>>> 失效服务:{},已被剔除!", serverId);
 }

 @EventListener//(condition = "#event.replication==false")
 public void listen(EurekaInstanceRegisteredEvent event) {
  // 服务注册
  InstanceInfo instanceInfo = event.getInstanceInfo();
  String appName = instanceInfo.getAppName();
  Objects.requireNonNull(appName, "服务名不能为空!");

  SetOperations<String, String> opsForSet = redisTemplate.opsForSet();
  opsForSet.add((platform + appName).toLowerCase(), instanceInfo.getIPAddr() + COLON + instanceInfo.getPort());
  logger.info(">>>>>>> 服务名:{},端口号:{},已缓存至redis", appName, instanceInfo.getPort());
 }

 @EventListener//(condition = "#event.replication==false")
 public void listen(EurekaInstanceRenewedEvent event) {
  // 服务续约
  logger.info(">>>>>>>>>>>>>>>Server续约:" + event.getServerId());
 }

 @EventListener
 public void listen(EurekaRegistryAvailableEvent event) {
  // 注册中心启动
  logger.info(">>>>>>>>>>>>>>>Server注册中心:" + event);
 }

 @EventListener
 public void listen(EurekaServerStartedEvent event) {
  // Server启动
  logger.info(">>>>>>>>>>>>>>>Server启动:" + event);
 }
}

注意事项

[ ] 版本问题:

当时项目组用的SpringCloud版本是Brixton.RELEASE,该版本有一个问题就是服务注册和下线并不会出发对应的事件,所以导致一直监听不到.解决的办法也很简单,只要升级版本即可,我已经升级到最新版本Finchley.RELEASE.

传送门,点我

[ ] 重复监听:

例如,在续约的时候,eureka会发出2条EurekaInstanceRenewedEvent事件,但是2条事件的属性却不一样!一个事件的属性replication为true,另外一个为false.如果我们只想处理replication=true的事件,如下配置即可:

 @EventListener(condition = "#event.replication==false")
 public void listen(EurekaInstanceRenewedEvent event) {
  // 服务续约
  logger.info(">>>>>>>>>>>>>>>Server续约:" + event.getServerId());
 }

GitHub代码,点我

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • IntelliJ IDEA 中必有得插件和配置

    IntelliJ IDEA 中必有得插件和配置

    这篇文章主要介绍了IntelliJ IDEA 中必有得插件和配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Quarkus集成open api接口使用swagger ui展示

    Quarkus集成open api接口使用swagger ui展示

    这篇文章主要为大家介绍了Quarkus集成open api接口使用swagger ui的展示示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • SpringBoot使用MockMvc进行Web集成测试的示例详解

    SpringBoot使用MockMvc进行Web集成测试的示例详解

    MockMvc 是一个测试框架,可以模拟 HTTP 请求和响应,在本文中,我们将介绍如何使用MockMvc进行Web集成测试,以及如何编写测试用例来测试Spring MVC控制器,希望对大家有所帮助
    2023-06-06
  • 基于Java编写一个粽子大作战小游戏

    基于Java编写一个粽子大作战小游戏

    端午节,又称龙舟节、重午节,是中国的传统节日之一,每年农历五月初五庆祝,虽然端午假期已经过去了,小编还是用Java编写了一个粽子大作战小游戏,感兴趣的可以了解一下
    2023-06-06
  • JVM要双亲委派的原因及如何打破它

    JVM要双亲委派的原因及如何打破它

    平时做业务开发比较少接触类加载器,但是如果想深入学习,了解类加载的原理是必不可少的.java的类加载器有哪些?什么是双亲委派?为什么要双亲委派?如何打破它?接下来本文就带大家详细介绍这些知识 ,需要的朋友可以参考下
    2021-06-06
  • 微信支付java版本之Native付款

    微信支付java版本之Native付款

    这篇文章主要为大家详细介绍了微信支付java版本之Native付款,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • springboot中JSONObject遍历并替换部分json值

    springboot中JSONObject遍历并替换部分json值

    这篇文章主要介绍了springboot中JSONObject遍历并替换部分json值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • java设计模式之装饰模式详细介绍

    java设计模式之装饰模式详细介绍

    这篇文章主要介绍了java设计模式之装饰模式,有需要的朋友可以参考一下
    2013-12-12
  • SpringBoot拦截器实现登录拦截的示例代码

    SpringBoot拦截器实现登录拦截的示例代码

    本文主要介绍了SpringBoot拦截器实现登录拦截,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • ByteArrayOutputStream简介和使用_动力节点Java学院整理

    ByteArrayOutputStream简介和使用_动力节点Java学院整理

    ByteArrayOutputStream 是字节数组输出流。它继承于OutputStream。这篇文章主要介绍了ByteArrayOutputStream简介和使用,需要的朋友可以参考下
    2017-05-05

最新评论