Spring Boot SimpleDiscoveryClient YAML配置无法识别服务问题
根因
SimpleDiscoveryClient 依赖Spring Boot的宽松配置绑定规则加载实例,properties和YAML两种格式的绑定逻辑存在差异:
- 扁平化的properties配置中,只要给实例配置了
uri参数,绑定器会自动从URI中解析host、port、协议信息,同时生成默认的实例ID,因此配置spring.cloud.discovery.client.simple.instances.serviceA[0].uri=http://localhost:8081可以正常生效。 - 层级结构的YAML配置解析时,会先将每个列表项映射为
DefaultServiceInstance对象,如果你只配置uri单个字段,绑定器会将该节点判定为无效的不完整实例,直接过滤丢弃,最终客户端读不到任何serviceA的实例。
解决方案
不需要同时维护两份配置文件,把YAML中的实例配置补全为符合绑定规则的完整实例字段即可,正确配置示例:
spring: cloud: discovery: client: simple: instances: serviceA: - instanceId: serviceA-instance-1 host: localhost port: 8081 uri: http://localhost:8081
字段说明:
instanceId为服务下的实例唯一标识,自定义保证同服务下不重复即可host、port和uri中的服务地址、端口保持一致即可
配置完成后重启服务,SimpleDiscoveryClient即可正常识别serviceA实例,Feign调用逻辑和properties配置时完全一致。
内容的提问来源于stack exchange,提问作者Flavio Oliva
相关产品推荐
相关产品推荐

