换了Nacos 之后依然需要实现需求Eureka 的服务下线监听发送邮件功能,eureka 使用Spring 的事件监听机制,实现起来还是比较简单。
但是Nacos 同样为我们提供了Java 的SDK来获得服务的监听功能,我们来到Nacos 的官方文档
image.png
我们发现服务监听的话首先需要知道你要监听的服务名字,其实这样子就很不友好,因为这样子我们要监听所有的服务就要实现拿到所有的服务名称。
现在又有个一个问题监听的代码我们写到哪里?
我一开始的时候是准备写在Nacos的源码里:
image.png
@Component
public class ServiceStatusListner {
private static final Logger logger = LoggerFactory.getLogger(ServiceStatusListner.class);
//初始化监听服务上下线
@PostConstruct
public void init() throws Exception {
Properties properties = System.getProperties();
properties.setProperty("serverAddr", "192.168.1.7:8848");
properties.setProperty("namespace", "public");
NamingService naming = NamingFactory.createNamingService(properties);
List<String> serviceNames = new ArrayList<>();
serviceNames.add("service1");
serviceNames.add("service2");
serviceNames.add("service3");
for(String serviceName : serviceNames) {
naming.subscribe(serviceName, new EventListener() {
@Override
public void onEvent(Event event) {
List<Instance> instances = ((NamingEvent)event).getInstances();
String serviceName = ((NamingEvent)event).getServiceName();
if(instances.size() == 0) {
SendMailUtil.sendMail(serviceName+"服务下线","服务异常下线赶紧去看看");
logger.info("============服务下线"+serviceName);
logger.info("============"+instances);
}else {
logger.info("============服务上线"+serviceName);
logger.info("============"+instances);
}
}
});
}
}
}
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
但是发现这样子的可配置性太低,并且有很大的侵入,不如将上面监听器代码拿出来单独创建一个微服务做服务监听专用。
如果有更好的方法请指正。