领事健康检查(所有服务检查失败)
consul health check (All service checks failing)
我已经阅读了与此问题相关的类似问题。以挫败告终。
- 我用 docker 安装了 consul。我运行下面的命令。
docker run --name consul -d -p 8500:8500 consul
,然后我测试了服务注册是否使用邮递员 PUT 方法,但没有启用健康检查,服务在 consul web 中成功注册到 consul UI。现在一切都按预期工作。
- 我有一个用 go 编写的本地 GRPC 服务。本地服务地址是
127.0.0.1:8880
。 consul 服务器的地址是127.0.0.1:8500
。然后该服务被注册到 consul 中,但是健康检查没有工作,得到 All service failing
。然后我尝试了以下操作:
-
- 使用本地IP地址
192.168.0.152:8500
作为consul服务器的地址,192.168.0.152:8880
作为gprc服务的地址。不工作。
-
- 使用本地IP地址
192.168.0.152:8500
作为consul服务器地址,127.0.0.1:8880
作为gprc服务地址。不工作。
-
- 检查 HTTP 服务是否工作。有一个用 GIN 编写的本地 Web 服务。端口为 1010。AgentServiceCheck 紧随其后。试过上面的方法。不工作。
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",
}
将grpc服务注册到consul服务器并启用健康检查的代码如下:
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
字段似乎是
supports the standard gRPC health checking protocol.
因此,您只需要在那里定义 gRPC 端点,协议将处理健康检查。
您可以通过在代理服务检查配置中定义 HTTP
字段来选择退出以使用 HTTP 端点进行健康检查。您可以在文档 (https://www.consul.io/api-docs/agent/check#http)
中找到更多相关信息
关于“正确”的代码有几个问题:
- consul的地址等于grpc服务?
cfg.Address
consul 不是 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”后,它出乎意料地有效。不要'不知道为什么……”。这是不一致的!!!!
我已经阅读了与此问题相关的类似问题。以挫败告终。
- 我用 docker 安装了 consul。我运行下面的命令。
docker run --name consul -d -p 8500:8500 consul
,然后我测试了服务注册是否使用邮递员 PUT 方法,但没有启用健康检查,服务在 consul web 中成功注册到 consul UI。现在一切都按预期工作。 - 我有一个用 go 编写的本地 GRPC 服务。本地服务地址是
127.0.0.1:8880
。 consul 服务器的地址是127.0.0.1:8500
。然后该服务被注册到 consul 中,但是健康检查没有工作,得到All service failing
。然后我尝试了以下操作:
-
- 使用本地IP地址
192.168.0.152:8500
作为consul服务器的地址,192.168.0.152:8880
作为gprc服务的地址。不工作。
- 使用本地IP地址
-
- 使用本地IP地址
192.168.0.152:8500
作为consul服务器地址,127.0.0.1:8880
作为gprc服务地址。不工作。
- 使用本地IP地址
-
- 检查 HTTP 服务是否工作。有一个用 GIN 编写的本地 Web 服务。端口为 1010。AgentServiceCheck 紧随其后。试过上面的方法。不工作。
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",
}
将grpc服务注册到consul服务器并启用健康检查的代码如下:
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
字段似乎是
supports the standard gRPC health checking protocol.
因此,您只需要在那里定义 gRPC 端点,协议将处理健康检查。
您可以通过在代理服务检查配置中定义 HTTP
字段来选择退出以使用 HTTP 端点进行健康检查。您可以在文档 (https://www.consul.io/api-docs/agent/check#http)
关于“正确”的代码有几个问题:
- consul的地址等于grpc服务?
cfg.Address
consul 不是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”后,它出乎意料地有效。不要'不知道为什么……”。这是不一致的!!!!