Eureka服务注册方式流程源码分析
本章目标
分析每一种服务注册方式
源码执行流程。
构建项目
本章以分析源码为主,所以不去新创建项目来讲解相关内容,我们使用/eureka-register-away.html源码作为注册服务
,/eureka-server.html源码作为服务注册中心
,还是按照之前的运行流程:
- 启动服务注册中心
- 启动本章服务项目
- 查看服务列表,服务注册方式
配置信息获取执行流程
在开始讲解本章注册方式
之前,我们需要了解整体的配置信息
获取的流程信息,这样才可以分析指定的注册方式
执行流程。
第一步:实例化EurekaInstanceConfigBean
配置实体
在项目启动时由于依赖spring-cloud-starter-netflix-eureka-client
内通过配置spring.factories
文件来让项目启动时自动加载并实例化org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration
配置类,EurekaClientAutoConfiguration
内会自动实例化EurekaInstanceConfigBean
并且自动绑定eureka.instance
开头的配置信息(具体为什么会自动映射可以去了解下@ConfigurationProperties
注解作用),部分源码如下所示:
1 | public class EurekaClientAutoConfiguration { |
EurekaClientAutoConfiguration#eurekaInstanceConfigBean
方法只有满足@ConditionalOnMissingBean(value = EurekaInstanceConfig.class, search = SearchStrategy.CURRENT)
表达式后才会去实例化,并且把实例化对象放入到IOC
容器内容,BeanId
为eurekaInstanceConfigBean
,也就是方法的名称。
在EurekaClientAutoConfiguration#eurekaInstanceConfigBean
方法中有这么一行代码我们可以进行下一步的分析
1 | // 通过有参构造函数实例化EurekaInstanceConfigBean配置实体 |
通过调用EurekaInstanceConfigBean(InetUtils inetUtils)
构造函数来进行实例化EurekaInstanceConfigBean
对象,在这个构造函数内也有一些实例化的工作,源码如下:
1 | public EurekaInstanceConfigBean(InetUtils inetUtils) { |
第二步:InetUtils#findFirstNonLoopbackHostInfo
获取主机基本信息
在构造函数EurekaInstanceConfigBean(InetUtils inetUtils)
源码实现内hostInfo
主机信息通过了InetUtils#findFirstNonLoopbackHostInfo
方法来进行实例化,我们来看看这个方法的具体实现逻辑,它会自动读取系统网卡列表
然再进行循环遍历
查询正在UP
状态的网卡信息,如果没有查询到网卡信息,则使用默认的HostName
、IpAddress
配置信息,源码如下所示:
1 | public HostInfo findFirstNonLoopbackHostInfo() { |
默认的HostName
、IpAddress
属性配置信息在InetUtilsProperties
配置实体类内,如果不进行设置则直接使用默认值,如果你想更换默认值
,那么你可以在application.yml
配置文件内通过设置spring.cloud.inetutils.defaultHostname
、spring.cloud.inetutils.defaultIpAddress
进行修改默认值,源码如下所示:
1 | public class InetUtilsProperties { |
第三步:EurekaInstanceConfigBean#getHostName
方法实现
getHostName
是一个Override
的方法,继承于com.netflix.appinfo.EurekaInstanceConfig
接口,该方法有个boolean
类型的参数refresh
来判断是否需要刷新重新获取主机网络基本信息,当传递refresh=false
并且在application.yml
配置文件内并没有进行手动设置eureka.instance.hostname
以及eureka.instance.ip-address
参数则会根据eureka.instance.prefer-ip-address
设置的值进行返回信息,源码如下所示:
1 |
|
默认注册方式源码分析
由于在实例化EurekaInstanceConfigBean
配置实体类时,构造函数进行了获取第一个非回环主机信息
,默认的hostName
以及ipAddress
参数则是会直接使用InetUtils#findFirstNonLoopbackHostInfo
方法返回的相对应的值。
IP优先注册方式源码分析
EurekaInstanceConfigBean#getHostName
方法直接调用本类重载方法getHostName(boolean refresh)
并且传递参数为false
,根据第三步源码我们就可以看到:
1 | return this.preferIpAddress ? this.ipAddress : this.hostname; |
如果eureka.instance.prefer-ip-address
参数设置了true
就会返回eureka.instance.ip-address
的值,这样我们就可以从中明白为什么主动设置eureka.instance.ip-address
参数后需要同时设置eureka.instance.prefer-ip-address
参数才可以生效。
指定IP、HostName源码分析
我们通过application.yml
配置文件进行设置eureka.instance.hostname
以及eureka.instance.ip-address
后会直接替换原默认值,在EurekaInstanceConfigBean#getHostName
中也是返回的this.hostname
、this.ipAddress
所以在这里设置后会直接生效作为返回的配置值。
总结
我们通过源码进行分析服务注册方式
执行流程,这样在以后进行配置eureka.instance.hostname
、eureka.instance.prefer.ip-address
、eureka.instance.ip-address
三个配置信息时就可以根据优先级顺序达到预期的效果,避免没有必要的错误出现。
Eureka服务注册方式流程源码分析