Eureka Client监听启动状态


在Eureka Client 端,通过@PostConstruct注解去做一些初始化工作,有时候会涉及到调用其他微服务,

这个时候,由于Eureka Client尚未启动完成,注册信息还没有从Eureka Server上拉取下来,因此ribbon

是获取不到client信息的,在使用Fegin调用的过程中,如果开启了熔断器,那么,服务调用会快速失败

feign:
  hystrix:
    enabled: true

如果去除如上配置,那么此次调用去等获取到了Eureka Client信息之后才开始调用。

为保证在使用了Hystrix的前提下,能够在系统启动成功之后,可以调用其他微服务做一些初始化工作,可以

使用如下方法。

Demo如下:

package com.client.a.config;

import com.client.a.client.BClient;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.StatusChangeEvent;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Author 张云和
 * @Date 2018/6/14
 * @Time 10:49
 */
@Component
public class Demo {
    ApplicationInfoManager.StatusChangeListener eurekaListener = null;

    @Resource
    private EurekaClient eurekaClient;

    @Resource
    private BClient bClient;


    private ExecutorService executorService = Executors.newSingleThreadExecutor();

    @PostConstruct
    public void init() {
        eurekaListener = new ApplicationInfoManager.StatusChangeListener() {
            @Override
            public String getId() {
                return "forExample";
            }
            @Override
            public void notify(StatusChangeEvent statusChangeEvent) {
                // 当前状态为UP, 之前的状态为STARTING
                if (InstanceInfo.InstanceStatus.UP == statusChangeEvent.getStatus() && InstanceInfo.InstanceStatus.STARTING == statusChangeEvent.getPreviousStatus()) {
                    // TODO somethings
                    // 执行一遍之后,在卸载该监听,达到在EurekaClient启动完成之后,仅执行一次
                    // ID可以自定义
                    executorService.execute(() -> {
                        while (!Thread.currentThread().isInterrupted()) {
                            
                            try {
                                bClient.test();
                                Thread.sleep(10000);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });
                    ApplicationInfoManager.getInstance().unregisterStatusChangeListener(eurekaListener.getId());
                    eurekaListener = null;
                }

            }
        };
        eurekaClient.getApplicationInfoManager().registerStatusChangeListener(eurekaListener);
    }
}

扫描二维码关注公众号,回复: 2681326 查看本文章

猜你喜欢

转载自blog.csdn.net/u012394095/article/details/81060723
今日推荐