服务启动依赖
lzcapp 提供了两个和服务依赖相关的字段,用来处理应用启动时的时序问题
- 简化版的
depends_on
字段 - 根据
application.routes
字段自动注入的健康检测机制
depends_on
绝大部分情况, depends_on
仅需要在 services.$service_name
字段下使用,类型为 []string
其中每一条填写一个 $service_name
,当前 service 在启动时会等 depends_on
中所有的 service 的容器状态为 healthy
service.$service_name.health_check
字段会影响 service 进入 healthy
状态, 此字段与 docker-compose 的 healthCheck 语义一致, 但只支持以下 4 个字段
go
type HealthCheckConfig struct {
Test []string `yaml:"test"`
TestUrl string `yaml:"test_url"`
StartPeriod time.Duration `yaml:"start_period"`
Disable bool `yaml:"disable"`
}
type HealthCheckConfig struct {
Test []string `yaml:"test"`
TestUrl string `yaml:"test_url"`
StartPeriod time.Duration `yaml:"start_period"`
Disable bool `yaml:"disable"`
}
health_check 示例:
yml
services:
wordpress:
image: bitnami/wordpress:5.8.2
health_check:
test:
- CMD-SHELL
- "curl -f http://localhost:80/ || exit 1"
# test_url: http://localhost:80 # 进行健康检查的 url,如果返回大于 500 则健康检查失败
start_period: 190s
disable: false
services:
wordpress:
image: bitnami/wordpress:5.8.2
health_check:
test:
- CMD-SHELL
- "curl -f http://localhost:80/ || exit 1"
# test_url: http://localhost:80 # 进行健康检查的 url,如果返回大于 500 则健康检查失败
start_period: 190s
disable: false
警告操作
- lzcapp 中的对应字段为
health_check
而非healthCheck
- 即使 service 中没有填写
health_check
也会受 docker image 中对应字段影响
自动注入的健康检测
lzcapp 主要是通过 application.routes
对外提供服务,因此系统会自动根据routes中的上游状态做智能的检测, 因此绝大部分情况下是不需要手动处理依赖关系,具体规则如下:
- 检测并等待所有 service 对应的容器进入 running 状态
- 检测并等待
application.health_check.test_url
中对应服务返回 200 状态(若有此配置) - 检测并等待所有上游就绪后
application
这个特殊 service 进入 healthy 状态 具体方法为,扫描所有 routes 规则,并提取其中的http://$hostname:$port
部分, exec 类型会自动转换为http://127.0.0.1:$port
使用 TCP dial$hostname:$port
,如 dial 成功则表明此上游为就绪状态 - 等待所有其他 service 全部进入 healty 状态, 页面中的"应用启动中"切换为实际服务内容
警告操作
- 如果
$hostname
为一个公网 IP/域名 则步骤 3 时会忽略此上游服务,避免微服在没有互联网时无法启动此应用- 在 dial
$hostname:$port
时并非使用 http 方式,因为部分上游正常状态时就是404或其他奇怪的状态 因此自动注入的检测逻辑仅确保 TCP 层面正常- 因为自动注入的存在,因此在
services.$service_name.depends_on
中千万不要填写app
这个特殊 service_name- 若您在开发阶段,遇到依赖相关问题,可以设置
application.health_check.disable=true
来禁用自动注入的健康检测,但强烈建议在正式发布应用时开启