前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud源码学习(一) Eurake服务注册的实现细节

SpringCloud源码学习(一) Eurake服务注册的实现细节

作者头像
写一点笔记
发布2020-11-02 11:39:31
3890
发布2020-11-02 11:39:31
举报
文章被收录于专栏:程序员备忘录

SpringCloud微服务治理模块Eurake是开发SpringCloud项目必须要面对的。我们都知道我们要想将我们的服务注册到Eurake注册中心就必须要在项目中加入相关的依赖jar包并且要开启服务发现的注解。说到注解,我都知道SpringBoot的注解可以是组合,的所以这个@EnableDiscoveryClient注解应该是需要Import其他的类或者扫描相关的包。

从图中可以看出确实是Import进来一个类。Import的原理上期我们已经学习了。那么我们看看这个类是做这些工作的。查看源代码发现这个selectImports方法就是想让Spring去实例化一个AutoServiceRegistrationConfiguration。这里有一个autoRegister的标志,说明我们可以在@EnableDiscoveryClient中指明是否要向注册中心注册,这样就可以让我们在非微服务项目中继续保留服务注册发现的模块了。

那么我们就看看这个类到底是何方圣神。

发现里边还是嵌套一个配置文件。但是并没有像我们做到那样直接向外暴露一个bean,但是如果Spring扫描到这里的话,其实也可以访问到该包中其他的bean,发现这里有个AutoConfiguration的配置类。

直接看这个AutoConfiguration类都做了哪些事情吧!我们发现配置properties并没有用。所以这块我们先重点看一下autoServiceRegistration的具体功能。

发现这里的autoServiceRistration的实现有两个,一个是虚方法,另一种就是我们的Eurake实现。显然虚方法就是默认实现或者调度作用,但是这两者并没有继承关系。所以就当作默认实现看待吧,重点看一下Eurake方法。

看到这个lifecycle,我们之前分析的在Spring所有操作进行完毕的时候会调lifecycle的接口。显然我们看到这里的方法start();但是在想此类应该是不能存在spring中的,因为他没有Spring支持的注解。但是根据我们之前的学习,@Import可以将没有Spring注解的bean注册到Spring容器中。我们看到在上图的config目录中有很多的自动配置,如果不出意外就在哪里了。

而这两个Bean应该就和服务注册和发现有关系。我们暂时先放一放。我们去看那个start方法。

代码语言:javascript
复制
    public EurekaAutoServiceRegistration(ApplicationContext context, EurekaServiceRegistry serviceRegistry, EurekaRegistration registration) {
        //Spring上下文
        this.context = context;
        //向服务注册中心进行注册的服务
        this.serviceRegistry = serviceRegistry;
        //需要被注册的服务的一些服务信息
        this.registration = registration;
    }

    public void start() {
        if (this.port.get() != 0 && this.registration.getNonSecurePort() == 0) {
            this.registration.setNonSecurePort(this.port.get());
        }
      //如果没有启动
        if (!this.running.get() && this.registration.getNonSecurePort() > 0) {
            //将服务注册到注册中心
            this.serviceRegistry.register(this.registration);
            //发布下事件,事件中包含了向注册中心注册的所有信息体
            this.context.publishEvent(new InstanceRegisteredEvent(this, this.registration.getInstanceConfig()));
            //设置已经成功了
            this.running.set(true);
        }
    }

通过上边的分析,我们可以使用Spring广播或者注入EurekaRegistration 的方式就可以直接拿到向Eurake注册的服务信息。

至此我们已经明白了Eurake的服务注册的基本过程,但是对于serviceRegistry 的解析肯定是重中之重,这个我们下期再学习。总结一下今天的学习,大概就是Eurake通过Enable的Import注解先让代码进入Enable的包但是并没有向外暴露一些核心的bean,而是通过SpringCloud的Common包的自动扫描出来的。向外暴露的核心在EurakeClientAutoConfiguration类中。如果要做一些定制化话开发我们也可以通过广播或者注入EurekaRegistration 拿到服务的信息。

至于为何会扫描到这里的问题就是spring.factories文件的事情了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员备忘录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档