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

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方法。

    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文件的事情了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值