nacos 自定义服务变化订阅

nacos 自定义服务变化订阅

  • 1.编写自定义的订阅者
  • 2.注册自定义的订阅者
  • 3.订阅想要订阅的服务

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中

你可能感兴趣的:(微服务,java,spring,cloud,微服务,spring,boot)