docker-compose服务编排中微服务无法从远程config中获取配置

背景:

  1. SpringCloud微服务项目,包含eureka注册中心、远程config配置中心(采用本地存储配置方式)、gateway网关以及其他微服务。
  2. 在IDEA中运行并浏览器访问正常。
  3. gateway网关以及其他的微服务配置文件只有连接配置中心的配置,向端口号、eureka注册等配置均放置在远程config配置中心。

需求:

  1. 将项目打包并在Linux中使用docker-compose服务编排启动该项目。
  2. 按顺序启动eureka注册中心(端口:9000)、config配置中心(端口:9007)、gateway网关(端口9006)、其他微服务

问题:

  1. 启动后发现gateway网关不向eureka注册中心注册,单独重启gateway才会进行注册。
  2. 查看日志:发现本来设置的向配置中心拉取配置的链接地址(198....:9007)被修改为localhost:8761并解析为[127.0.0.1],导致找不到配置中心,进而无法从配置中心拉取向eureka注册的配置。
  3. 其他服务启动注册正常。

如何修改才能让gateway微服务正常启动?

应该是当远程config配置中心启动了,但是还尚未准备好(上下文已启动),此时其他服务也会启动,但是还无法获取到配置。
gateway服务中的请求地址被修改为localhost:8761这个错误是因为没有提供eureka.client.service-url.defaultZone这个配置,因为这个配置放在config中,此时config还未完全提供服务,但是gateway服务却已经启动了,由于找不到该配置,所以报错。
所以才会出现,单独重启gateway即可正常注册的情况(因为此时config已完全提供服务)。
depends_on仅仅是用于规范服务的上下文启动顺序,而不是完全提供服务的顺序。所以要确保config完全提供服务再启动其他微服务,可能需要编写一些脚本,用于监测config请求地址以及其端口是否已经可用(例如访问端口返回200)。对于服务的先后启动docker-compose官方推荐使用wait-for-it.sh进行脚本控制。

如果在K8S中来就好很多了,因为启动报错,可以设置重启容器的次数和多久重启,这样就可以确保服务都OK后提供。


编排方面,K8S始终功能强大太多,,而且docker-compose 单机玩编排还好,一集群就很。。。。