nacos 自定义服务变化订阅
1.编写自定义的订阅者
这里参考的是InstancesChangeNotifier这个类。
import com.alibaba.nacos.api.naming.listener.NamingEvent;
import com.alibaba.nacos.client.naming.event.InstancesChangeEvent;
import com.alibaba.nacos.common.notify.listener.Subscriber;
import com.alibaba.nacos.common.notify.Event;
public class MyChangeNotifier extends Subscriber<InstancesChangeEvent> {
@Override
public void onEvent(InstancesChangeEvent event) {
// TODO 订阅的服务有变化会触发
// 这里获取到了服务集群的所有信息,包括服务名称、各节点信息等。
NamingEvent namingEvent = transferToNamingEvent(event);
}
@Override
public Class<? extends Event> subscribeType() {
return InstancesChangeEvent.class;
}
private NamingEvent transferToNamingEvent(
InstancesChangeEvent instancesChangeEvent) {
return new NamingEvent(instancesChangeEvent.getServiceName(), instancesChangeEvent.getGroupName(),
instancesChangeEvent.getClusters(), instancesChangeEvent.getHosts());
}
}
2.注册自定义的订阅者
// 在项目启动完,或者想注册的时候注册自己的订阅者就行了。
// 注意:多次注册不同的订阅者对象,那就真的会有很多一样的订阅者。多次注册同一个对象没问题。可以理解为往set里加对象
NotifyCenter.registerSubscriber(new MyChangeNotifier());
3.订阅想要订阅的服务
正常项目中用到的其他服务都会自动订阅,如果想额外手动增加订阅的话,最简单的方式可以手动获取一下即可。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
@Component
public class Test {
@Autowired
private DiscoveryClient discoveryClient;
public void test(){
// 这里相当于订阅了指定服务
discoveryClient.getInstances("service-name");
}
订阅服务中,真正调用到的是
com.alibaba.nacos.client.naming.NacosNamingService#selectInstances(java.lang.String, java.lang.String, boolean)。
完整的nacos订阅逻辑在com.alibaba.nacos.client.naming.core.HostReactor#getServiceInfo中