Netflex Eureka服务注册
Netflex服务注册主要是DiscoveryClient.java类来实现
获取注册中心地址
服务客户端要注册到注册中心,首先需要知道注册中心的地址
在DiscoveryClient类中找到如下方法:
该方法已过时,会调用EndpointUtils.getServiceUrlsFromConfig(clientConfig,instanceZone, preferSameZone)
该方法有三个参数:
clientConfig:客户端配置类(配置文件)
instanceZone:客户端所在的zone
preferSameZone:如果为True,将选择与客户端所在同一个zone的注册中心
getServiceUrlsFromConfig方法解析
1、首先我们可以看到调用getRegion方法,返回了客户端所在的region,一个微服务应用只属于一个region,默认是default,可以通过eureka.client.region设置
2、接下来调用了clientConfig.getAvailablityZones(clientConfig.getRegion()),该方法是通过客户端的region返回所有可用的改region下的人zone,region和zone是一对多的关系。
返回的是一个String数组
3、如果返回的zone的数组为空,说明该region下没有可用的zone,那就给他一个默认的zone
4、现在我们已经拿到客户端的region、所有该region的zone,接下来就要加载Eurekaserver的具体地址了。
首先调用了getZoneOffset(instanceZone,preferSameZone,availZones),该方法的作用是:返回要使用的zone在刚才获取的该region下所有的zone数组的位置,返回的是一个int型。
5、知道了需要使用的zone之后,就可以获取serviceUrl了,返回的是一个String的List,因为一个zone可以有多个serviceUrl,将这个list加入到orderdUrls中,orderdUrl是方法最开始创建的一个List<String>
6、接下来这一步最为关键(看了好久才明白),我先把源码贴出来
其实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的第三个位置,
看下这段代码:
他的意思是:如果myZoneOffset不是availZone数组的最后一个值时,currentOffSet = myZoneOffset+1,否则currentOffSet = 0(为了遍历availZone)
此时我们可以得到下列变量的值:
myZOneOffset= 2
currentOffSet= 3
然后我们继续看while循环,很显然我们满足循环条件,然后调用clientConfig.getEurekaServerServiceUrls(availZones[3])方法,可以看出我们获取了第四个zone的所有serviceUrl,并把他们加到orderdUrls中。
此时我们已经遍历了availZone数组的最后一个值,但是现在availZone的前两个值的zone的serviceUrl还没有获取到,继续看代码
这里面有个if条件,意思是如果当前的currentOffSet是availZone的最后一个值,那么就讲currenOffSet设置为0,否则currentOffSet就继续加一。
到这里就可以从头开始遍历了,一直到currentOffSet =myZoneOffSet
最后,所有的zone的serviceUrl都被获取到了。
大家要是想买书的话,可以加我的微信15313876221,或者qq1010893356,或者qq群376448087,比正常的要便宜,程序员你懂得,买个书动不动就100多。^-^