9.4 实例
services:
config-server:
image: 192.168.10.110:5000/config-server:0.0.1-SNAPSHOT
networks:
backend:
aliases:
- config-server
ports:
- "8071:8071"
environment:
encrypt.key: "123456789abcdef"
spring.profiles.active: "git"
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:8071/actuator/health >> /dev/null && exit 0 || exit 1"]
interval: 1m30s
timeout: 30s
retries: 5
start_period: 10s
cloud-learning:
image: 192.168.10.110:5000/cloud-learning:0.0.1-SNAPSHOT
networks:
backend:
aliases:
- cloud-learning
ports:
- "8080:8080"
environment:
ENCRYPT_KEY: "fje83Ki8403Iod87dne7Yjsl3THueh48jfuO9j4U2hf64Lo"
SPRING_PROFILES_ACTIVE: "dev"
SPRING_CLOUD_CONFIG_URI: "http://config-server:8071"
depends_on:
config-server:
condition: service_healthy
networks:
backend:
driver: bridge
上述的Compose文件定义了两个service:config-server和cloud-learning。两者均是web端微服务,其中config-server是一个Spring Cloud Config Server,而cloud-learning是Config的客户端。
depends_on的问题
在cloud-learning启动时需要从config-server获取配置信息,因此cloud-learning需要先等待config-server启动就绪后才能正常工作。
而depends_on默认的condition是service_started,它只是约定容器启动的顺序。观察docker compose up命令执行的日志可以发现,两个微服务会并行启动,cloud-learning并不会等待config-server处于就绪状态能够提供服务后再启动!因此,cloud-learning启动时会报告配置服务连接不上的警告。
解决方案:
为config-server添加健康检查命令(healthcheck),检查微服务是否启动完成,并将依赖条件定义为service_healthy。此时,只有当config-server通过健康检查后,cloud-learning才会开始启动。
健康检查命令输出:0表示healthy;1表示unhealthy。
environment指令用法
在上述的两个服务中,均利用环境变量覆盖了微服务中的某些属性,比如用ENCRYPT_KEY覆盖encrypt.key。
可以使用两种环境变量的表示方式:
所有字母大写,并将点”.“转换成下划线"_",如ENCRYPT_KEY。
保持和properties文件中的属性一样,如:encrypt.key。
Last updated
Was this helpful?