Netflex Eureka服务注册如何获取注册中心地址

Netflex Eureka服务注册

Netflex服务注册主要是DiscoveryClient.java类来实现

获取注册中心地址

服务客户端要注册到注册中心,首先需要知道注册中心的地址

在DiscoveryClient类中找到如下方法:Netflex Eureka服务注册如何获取注册中心地址

该方法已过时,会调用EndpointUtils.getServiceUrlsFromConfig(clientConfig,instanceZone, preferSameZone)

 

该方法有三个参数:

 Netflex Eureka服务注册如何获取注册中心地址

clientConfig:客户端配置类(配置文件)

instanceZone:客户端所在的zone

preferSameZone:如果为True,将选择与客户端所在同一个zone的注册中心

getServiceUrlsFromConfig方法解析

1、首先我们可以看到调用getRegion方法,返回了客户端所在的region,一个微服务应用只属于一个region,默认是default,可以通过eureka.client.region设置

Netflex Eureka服务注册如何获取注册中心地址

 

2、接下来调用了clientConfig.getAvailablityZones(clientConfig.getRegion()),该方法是通过客户端的region返回所有可用的改region下的人zone,region和zone是一对多的关系。

返回的是一个String数组

 Netflex Eureka服务注册如何获取注册中心地址

3、如果返回的zone的数组为空,说明该region下没有可用的zone,那就给他一个默认的zone

 Netflex Eureka服务注册如何获取注册中心地址

4、现在我们已经拿到客户端的region、所有该region的zone,接下来就要加载Eurekaserver的具体地址了。

Netflex Eureka服务注册如何获取注册中心地址

  首先调用了getZoneOffset(instanceZone,preferSameZone,availZones),该方法的作用是:返回要使用的zone在刚才获取的该region下所有的zone数组的位置,返回的是一个int型。

 Netflex Eureka服务注册如何获取注册中心地址

5、知道了需要使用的zone之后,就可以获取serviceUrl了,返回的是一个String的List,因为一个zone可以有多个serviceUrl,将这个list加入到orderdUrls中,orderdUrl是方法最开始创建的一个List<String>

Netflex Eureka服务注册如何获取注册中心地址

 

6、接下来这一步最为关键(看了好久才明白),我先把源码贴出来

Netflex Eureka服务注册如何获取注册中心地址

其实getServiceUrlsFromConfig方法不仅仅是返回与客户端相同zone的serviceUrl,而是将所有的zone的serviceUrl全部获取,只不过是与客户端相同zone的serviceUrl放到List<String>的前面,其他的zone的serviceUrl会加入到该List中。

       下面来详细说一下:我会举一个例子。

       如果availZone中只有一个zone,而且是客户端相同的zone,上面的这段代码就会跳过了,因为没有其他的zone,也就没有serviceUrl了。

       首先假如我们availZone = [“zone1”,”zone2”,”zoneClient”,”zone4”],当前region的可用zone有4个,恰好与客户端相同的zone在availZone的第三个位置,

看下这段代码:

Netflex Eureka服务注册如何获取注册中心地址

他的意思是:如果myZoneOffset不是availZone数组的最后一个值时,currentOffSet = myZoneOffset+1,否则currentOffSet = 0(为了遍历availZone)

此时我们可以得到下列变量的值:

 

       myZOneOffset= 2

       currentOffSet= 3

然后我们继续看while循环,很显然我们满足循环条件,然后调用clientConfig.getEurekaServerServiceUrls(availZones[3])方法,可以看出我们获取了第四个zone的所有serviceUrl,并把他们加到orderdUrls中。

Netflex Eureka服务注册如何获取注册中心地址

此时我们已经遍历了availZone数组的最后一个值,但是现在availZone的前两个值的zone的serviceUrl还没有获取到,继续看代码

Netflex Eureka服务注册如何获取注册中心地址

这里面有个if条件,意思是如果当前的currentOffSet是availZone的最后一个值,那么就讲currenOffSet设置为0,否则currentOffSet就继续加一。

到这里就可以从头开始遍历了,一直到currentOffSet =myZoneOffSet

最后,所有的zone的serviceUrl都被获取到了。


大家要是想买书的话,可以加我的微信15313876221,或者qq1010893356,或者qq群376448087,比正常的要便宜,程序员你懂得,买个书动不动就100多。^-^