Eureka集群无法同步注册的服务
今天在学习Eureka配置服务, 发现不管这么样各个Eureka节点无法同步注册的服务
到网上搜索也没有找到结果, 后来直接复制别人的配置发现就可以
对比一下我的配置就发现问题了, eureka 的配置是没法使用yaml语法 ‘-’ 配置service-url
而是需要使用 ‘,’ 进行分割才行
所以可以将这个配置替换为:
eureka:
client:
service-url:
defaultZone:
- http://localhost:8761/eureka
- http://localhost:8762/eureka
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
思考为什么用 ‘-’ 配置不行
yaml语法中不就是用 ‘-’ 来写列表的吗? 为什么这里不行.
然后我找到 eureka.client.service-url
配置类 EurekaClientConfigBean
这个配置bean
找到serviceUrl发现是一个Map<String, String>类型, 既然map值的类型不是List, 那么我使用yaml的’-’ 就不会被解析成list
那会解析成什么了??, 激起了好奇心, 我决定debug看看
private Map<String, String> serviceUrl = new HashMap<>();
找到serviceUrl的set方法打一个断点看看传进来的map是什么样子的
我们debug启动这个服务
我们发现传递进来的map分别是 defaultZone
, defaultZone.0
, defaultZone.1
,
可以看到defaultZone
, defaultZone.0
都是第一个值, defaultZone.1
是第二个值
如果我们使用正确的配置
只有一个key defaultZone
, value是我们配置的两个地址
如何见map中逗号分割的地址解析成一个个eureka server的地址了??
可以发现在EurekaClientConfigBean
中存在一个getEurekaServerServiceUrls
的方法, 见名知意, 获取eureka server的urls
我们在这个方法上打一个断点看看
这个中获取 serviceUrl
就是我们配置的那个, 然后根据参数myZone
取出结果, 如果没有就用DEFAULT_ZONE
实际上myZone
和DEFAULT_ZONE
都是 defaultZone
在拿到之后, 会发现对serviceUrls
调用了一个按照 逗号分割获取数组
到这里一切都可以说的通了, 如果我是用 yaml 的 ‘-’ 配置service-url, serviceUrl
这个map中
keydefaultZone
对应的 value 是 http://localhost:8761/eureka
, 如果按照逗号分割还是这个
如果是按照的 ’ ,’ 分割配置的service url 这里就可以将两个地址都拿到