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

问题描述 投票:0回答:3

我已阅读与此问题相关的类似问题。结果却以挫败告终。

  1. 我用docker安装了consul。我运行以下命令。
    docker run --name consul -d -p 8500:8500 consul
    ,然后我使用postman PUT方法测试服务注册是否有效,但没有启用健康检查,服务在consul web UI中成功注册到consul中。目前一切都按预期进行。
  2. 我有一个用 go 编写的本地 GRPC 服务。当地服务地址是
    127.0.0.1:8880
    。 consul服务器的地址是
    127.0.0.1:8500
    。然后该服务注册到consul中,但健康检查不起作用,得到
    All service failing
    。然后我尝试了以下操作:
    1. 使用本地IP地址
      192.168.0.152:8500
      作为consul服务器的地址,
      192.168.0.152:8880
      作为gprc服务的地址。不工作。
    1. 使用本地IP地址
      192.168.0.152:8500
      作为consul服务器的地址,
      127.0.0.1:8880
      作为gprc服务的地址。不工作。
    1. 检查HTTP服务是否工作。有一个用 GIN 编写的本地 Web 服务。端口是1010。AgentServiceCheck如下。尝试了上面的方法。不工作。
check := &api.AgentServiceCheck{
      HTTP:                           "http://127.0.0.1:1010/health",
      Timeout:                        "5s",
      Interval:                       "5s",
      DeregisterCriticalServiceAfter: "15s",
   }
    1. 运行
      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())
   }
go microservices grpc consul
3个回答
1
投票

根据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


0
投票

“正确”的代码存在几个问题:

  1. consul的地址等于grpc服务吗?
    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)
  1. 为什么正确的代码显示
    GRPC:"127.0.0.1:8880/health"
    ,结论是“在以下配置中将“127.0.0.1:8880/health”更改为“127.0.0.1:8880”后,它出奇地有效。不知道为什么..” 。这是不一致的!!!!

0
投票

可能你在使用HTTP时没有配置/health路由

© www.soinside.com 2019 - 2024. All rights reserved.