Eureka Client监听启动状态

在Eureka Client 端,通过@PostConstruct注解去做一些初始化工作,有时会涉及到调用其他微服务,如调用缓存服务以设置初始化配置信息缓存,这个时候,由于Eureka Client尚未启动完成,注册信息还没有从Eureka Server上拉取下来,因此ribbon是获取不到client信息的,在使用Fegin调用的过程中,如果开启了熔断器,那么服务调用会快速失败

1
2
3
feign:
hystrix:
enabled: true

如果需要使用熔断,去除如上配置,那么调用服务需要等到获取到了Eureka Client信息之后才开始调用。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.StatusChangeEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

@Slf4j
@Component
public class EurekaClientConfig {
ApplicationInfoManager.StatusChangeListener eurekaListener = null;

@Resource
private AppBlogConfig appblogConfig;

@Resource
private EurekaClient eurekaClient;

@PostConstruct
public void init() {
eurekaListener = new ApplicationInfoManager.StatusChangeListener() {
@Override
public String getId() {
return "channel-front";
}
@Override
public void notify(StatusChangeEvent statusChangeEvent) {
// 当前状态为UP,之前的状态为STARTING
if (InstanceInfo.InstanceStatus.UP == statusChangeEvent.getStatus() && InstanceInfo.InstanceStatus.STARTING == statusChangeEvent.getPreviousStatus()) {
// 执行一遍之后,在卸载该监听,达到在EurekaClient启动完成之后,仅执行一次
// ID可以自定义
appblogConfig.init();
ApplicationInfoManager.getInstance().unregisterStatusChangeListener(eurekaListener.getId());
eurekaListener = null;
}
}
};
eurekaClient.getApplicationInfoManager().registerStatusChangeListener(eurekaListener);
}
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :