spring cloud 服务注册、发现了解

spring cloud定义了以下几个类用于服务的注册、发现操作

  • DiscoveryClient 接口代表服务发现常见的读取操作
public interface DiscoveryClient extends Ordered {
    int DEFAULT_ORDER = 0;

    String description();
    // 根据服务id获取对应的服务列表
    List<ServiceInstance> getInstances(String serviceId);
    // 获取所有服务名称
    List<String> getServices();
    default void probe() {
        this.getServices();
    }
    default int getOrder() {
        return 0;
    }
}
  • EnableDiscoverClient 使用注解表示开启服务发现功能
  • ServiceInstance 接口代表服务的一个实例
    在DiscoveryClient的getInstances方法中可以看到返回的list范型为ServiceInstance 每一个ServiceInstance代表的就是一个服务实例的信息
public interface ServiceInstance {
    default String getInstanceId() {
        return null;
    }
    String getServiceId();
    String getHost();
    int getPort();
    boolean isSecure();
    URI getUri();
    Map<String, String> getMetadata();
    default String getScheme() {
        return null;
    }
}
  • Registration接口 代表服务注册时需要用到的实例信息,通过源码可以看到该接口即成ServiceInstance接口,并且没有任何扩展实际上就是ServiceInstance 只不过代表的意义有所区别 。
    既ServiceInstance代表在注册中心获取的实例信息 Registration代表服务注册时需要发送到注册中心的数据
public interface Registration extends ServiceInstance {
}
  • ServiceRegistry 用于对服务的注册、注销等操作
public interface ServiceRegistry<R extends Registration> {
    void register(R registration);

    void deregister(R registration);

    void close();

    void setStatus(R registration, String status);

    <T> T getStatus(R registration);
}
  • AutoServiceRegistration 是一个空接口代表服务的自动注册该接口有一个抽象的实现类AbstractAutoServiceRegistration 并且该抽象类实现了ApplicationListener接口 监听WebServerInitializedEvent事件,当事件被触发后AbstractAutoServiceRegistration调用ServiceRegistry.registry 进行服务的注册.
    AbstractAutoServiceRegistration关键代码如下
public abstract class AbstractAutoServiceRegistration<R extends Registration>
        implements AutoServiceRegistration, ApplicationContextAware, ApplicationListener<WebServerInitializedEvent> {
    @Override
    @SuppressWarnings("deprecation")
    public void onApplicationEvent(WebServerInitializedEvent event) {
        bind(event);
    }

    @Deprecated
    public void bind(WebServerInitializedEvent event) {
        ApplicationContext context = event.getApplicationContext();
        if (context instanceof ConfigurableWebServerApplicationContext) {
            if ("management".equals(((ConfigurableWebServerApplicationContext) context).getServerNamespace())) {
                return;
            }
        }
        this.port.compareAndSet(0, event.getWebServer().getPort());
        this.start();
    }
public void start() {
        if (!isEnabled()) {
            if (logger.isDebugEnabled()) {
                logger.debug("Discovery Lifecycle disabled. Not starting");
            }
            return;
        }

        // only initialize if nonSecurePort is greater than 0 and it isn't already running
        // because of containerPortInitializer below
        if (!this.running.get()) {
            this.context.publishEvent(new InstancePreRegisteredEvent(this, getRegistration()));
            register();
            if (shouldRegisterManagement()) {
                registerManagement();
            }
            this.context.publishEvent(new InstanceRegisteredEvent<>(this, getConfiguration()));
            this.running.compareAndSet(false, true);
        }

    }
    protected void register() {
        this.serviceRegistry.register(getRegistration());
    }

以上的类是Spring cloud定义的模型,任何服务注册中心想与Spring Cloud进行整合都需要实现上面的接口扩展对应的实体类。例如:eureka、nacos等服务注册中心,下面看下nacos的实现方式

nacos对于以上模型的实现类如下:

  • NacosDiscoveryClient实现DiscoveryClient
  • NacosServiceInstance实现ServiceInstance
  • NacosRegistration 实现Registration
  • NacosServiceRegistry 实现ServiceRegistry
  • NacosAutoServiceRegistration 继承AbstractAutoServiceRegistration

在Spring-cloud-starter-alibaba-nacos-discovery 项目的spring.factories文件中可以看到EnableAutoConfiguration对应的类中有一个NacosServiceRegistryAutoConfiguration类 springboot通过工厂加载机制加载该类用于配置nacos的服务自动注册,在该配置类中加载了NacosServiceRegistry、NacosRegistration、NacosAutoServiceRegistration类

public class NacosServiceRegistryAutoConfiguration {
    public NacosServiceRegistryAutoConfiguration() {
    }

    @Bean
    public NacosServiceRegistry nacosServiceRegistry(NacosDiscoveryProperties nacosDiscoveryProperties) {
        return new NacosServiceRegistry(nacosDiscoveryProperties);
    }

    @Bean
    @ConditionalOnBean({AutoServiceRegistrationProperties.class})
    public NacosRegistration nacosRegistration(ObjectProvider<List<NacosRegistrationCustomizer>> registrationCustomizers, NacosDiscoveryProperties nacosDiscoveryProperties, ApplicationContext context) {
        return new NacosRegistration((List)registrationCustomizers.getIfAvailable(), nacosDiscoveryProperties, context);
    }

    @Bean
    @ConditionalOnBean({AutoServiceRegistrationProperties.class})
    public NacosAutoServiceRegistration nacosAutoServiceRegistration(NacosServiceRegistry registry, AutoServiceRegistrationProperties autoServiceRegistrationProperties, NacosRegistration registration) {
        return new NacosAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration);
    }
}

上面说过AbstractAutoServiceRegistration实现了ApplicationListener监听WebServerInitializedEvent事件,所以在该事件触发时NacosAutoServiceRegistration自动开始实现对nacos服务注册中心进行注册


NacosDiscoveryClientConfiguration类 springboot通过工厂加载机制加载该类用于配置nacos的服务自动注册,在该配置类中加载了nacosDiscoveryClient类实现服务发现的常见读取操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容