我已阅读与此问题相关的类似问题。结果却以挫败告终。
docker run --name consul -d -p 8500:8500 consul
,然后我使用postman PUT方法测试服务注册是否有效,但没有启用健康检查,服务在consul web UI中成功注册到consul中。目前一切都按预期进行。127.0.0.1:8880
。 consul服务器的地址是127.0.0.1:8500
。然后该服务注册到consul中,但健康检查不起作用,得到All service failing
。然后我尝试了以下操作:192.168.0.152:8500
作为consul服务器的地址,192.168.0.152:8880
作为gprc服务的地址。不工作。192.168.0.152:8500
作为consul服务器的地址,127.0.0.1:8880
作为gprc服务的地址。不工作。check := &api.AgentServiceCheck{
HTTP: "http://127.0.0.1:1010/health",
Timeout: "5s",
Interval: "5s",
DeregisterCriticalServiceAfter: "15s",
}
consul members
获取Node Address Status Type Build Protocol DC Segment
aae2e6ac1ff8 127.0.0.1:8301 alive server 1.10.3 2 dc1 <all>
更新:
"127.0.0.1:8880/health"
更改为 "127.0.0.1:8880"
后,它出奇地有效。不知道为什么..check := &api.AgentServiceCheck{
GRPC: "127.0.0.1:8880",
Timeout: "5s",
Interval: "5s",
DeregisterCriticalServiceAfter: "10s",
}
向consul服务器注册grpc服务并启用健康检查的代码如下:
func main() {
IP := flag.String("IP", "127.0.0.1", "IP address")
Port := flag.Int("Port", 8880, "Port")
flag.Parse()
// initialize logger, configuation file and database
initialize.InitLogger()
initialize.InitConfig()
initialize.InitDB()
zap.S().Info(global.ServerConfig)
zap.S().Info("IP: ", *IP)
zap.S().Info("Port: ", *Port)
server := grpc.NewServer()
proto.RegisterUserServer(server, &handler.UserServer{})
l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", *IP, *Port))
if err != nil {
panic("failed to listen" + err.Error())
}
// register health check
grpc_health_v1.RegisterHealthServer(server, health.NewServer())
cfg := api.DefaultConfig()
// get cfg.address from configuration file, in which host is 127.0.0.1 port 8880
cfg.Address = fmt.Sprintf("%s:%d", global.ServerConfig.ConsulInfo.Host,
global.ServerConfig.ConsulInfo.Port)
client, err := api.NewClient(cfg)
if err != nil {
panic(err)
}
// generate health check instance
check := &api.AgentServiceCheck{
GRPC: "127.0.0.1:8880/health",
Timeout: "5s",
Interval: "5s",
DeregisterCriticalServiceAfter: "15s",
}
registration := new(api.AgentServiceRegistration)
registration.Name = global.ServerConfig.Name
registration.ID = global.ServerConfig.Name
registration.Address = "127.0.0.1"
registration.Port = 8880
registration.Tags = []string{"user-srv", "user"}
registration.Check = check
err = client.Agent().ServiceRegister(registration)
if err != nil {
panic(err)
}
err = server.Serve(l)
if err != nil {
panic("failed to start grpc" + err.Error())
}
根据Consul API的文档(https://www.consul.io/api-docs/agent/check#grpc),似乎您正在使用的
GRPC
字段
支持标准gRPC健康检查协议。
因此,您只需要在那里定义 gRPC 端点,协议将处理健康检查。
您可以通过在代理服务检查配置中定义
HTTP
字段来选择退出,以使用 HTTP 端点进行运行状况检查。您可以在文档中找到更多相关信息(https://www.consul.io/api-docs/agent/check#http)
“正确”的代码存在几个问题:
cfg.Address
不是领事的Addr
吗?// get cfg.address from configuration file, in which host is 127.0.0.1 port 8880
cfg.Address = fmt.Sprintf("%s:%d", global.ServerConfig.ConsulInfo.Host,
global.ServerConfig.ConsulInfo.Port)
client, err := api.NewClient(cfg)
GRPC:"127.0.0.1:8880/health"
,结论是“在以下配置中将“127.0.0.1:8880/health”更改为“127.0.0.1:8880”后,它出奇地有效。不知道为什么..” 。这是不一致的!!!!可能你在使用HTTP时没有配置/health路由