docker容器启动微服务可以使用-v /etc/hosts:/etc/hosts 这种方式使得容器内的hosts和宿主机的hosts同步从而获得hosts。如果不适用config-server,完全不存在问题。
spring:
application:
name: user-manage
cloud:
config:
profile: dev
#label: master
#uri:
#fail-fast: true #无法链接到config-server时快速返回失败。
password: 123456 #访问config-server端点获取配置信息所需的用户名密码。SpringSecurity
username: safebox
discovery:
service-id: config-server
enabled: true #通过服务名称访问config-server,不直接通uri,方便以后实现高可用
server:
port: 8019
eureka:
client:
service-url:
defaultZone: http://eureka.safebox.com:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
但是
使用config-server并且指定根据serviceId来找到config-server那就会报错,获取不到配置信息,查看控制台,一直是fetch localhost:8888。说配置没起作用。问题在哪呢?
之前运行其他微服务的时候,就发现,服务启动时候并不会第一时间识别到hosts,每次启动后,过一会才能找到hosts,估计是容器启动会先读配置文件,启动服务,然后再去从宿主机加载 hosts,所以导致第一时间无法注册到eureka,从而无法获取config-server的路径,无法获取配置信息,导致服务启动失败。
补充:期间考虑过只指定一个eureka的host,结合/etc/hosts,但是失败。还是会直接去找本地8888端口。
解决:可以不使用/etc/hosts和宿主机的映射。而在启动容器的时候手动指定所有hosts,–add-host h o s t . n a m e : {host.name}: host.name:{host.ip} 。这种方式会很麻烦,启动命令会很长,所以考虑使用shell脚本或者docker compose。
未完待续。。。。。。。