领事健康检查(所有服务检查失败)

consul health check (All service checks failing)

我已经阅读了与此问题相关的类似问题。以挫败告终。

  1. 我用 docker 安装了 consul。我运行下面的命令。 docker run --name consul -d -p 8500:8500 consul,然后我测试了服务注册是否使用邮递员 PUT 方法,但没有启用健康检查,服务在 consul web 中成功注册到 consul UI。现在一切都按预期工作。
  2. 我有一个用 go 编写的本地 GRPC 服务。本地服务地址是127.0.0.1:8880。 consul 服务器的地址是127.0.0.1:8500。然后该服务被注册到 consul 中,但是健康检查没有工作,得到 All service failing。然后我尝试了以下操作:
check := &api.AgentServiceCheck{
      HTTP:                           "http://127.0.0.1:1010/health",
      Timeout:                        "5s",
      Interval:                       "5s",
      DeregisterCriticalServiceAfter: "15s",
   }
Node          Address         Status  Type    Build   Protocol  DC   Segment
aae2e6ac1ff8  127.0.0.1:8301  alive   server  1.10.3  2         dc1  <all>

更新:

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)

中找到更多相关信息

关于“正确”的代码有几个问题:

  1. 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)
  1. 为什么正确的代码显示GRPC:"127.0.0.1:8880/health",结论是“在下面的配置中将“127.0.0.1:8880/health”更改为“127.0.0.1:8880”后,它出乎意料地有效。不要'不知道为什么……”。这是不一致的!!!!