Golang Go语言中 Consul GRPC 健康检查失败问题

发布于 1周前 作者 phonegap100 来自 Go语言

Golang Go语言中 Consul GRPC 健康检查失败问题

Consul 注册的信息

reg := api.AgentServiceRegistration{
	ID:      strconv.FormatInt(time.Now().UnixNano(), 10),
	Name:    name,
	Address: listen,
	Port:    port,
	Check:   &api.AgentServiceCheck{
		GRPC:     fmt.Sprintf("%v:%v/%v", listen, port, name),
		Interval: "5s",
		Notes:    "Consul check service health status.",
		DeregisterCriticalServiceAfter: "10s",
	},
}

我按照 https://www.consul.io/docs/discovery/checks 里的 grpc 检查里,写了个 proto

syntax = "proto3";

package grpc_health_v1; option go_package = “.;grpc_health_v1”;

message HealthCheckRequest { string service = 1; }

message HealthCheckResponse { enum ServingStatus { UNKNOWN = 0; SERVING = 1; NOT_SERVING = 2; SERVICE_UNKNOWN = 3; // Used only by the Watch method. } ServingStatus status = 1; }

service Health { rpc Check(HealthCheckRequest) returns (HealthCheckResponse);

rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);

}

我用 BloomRPC 和自己写的 client 都能正常访问这个 Check 方法,但是注册上了 Consul 却显示失败


更多关于Golang Go语言中 Consul GRPC 健康检查失败问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

grpc 的 health check 是不需要你实现的,grpc 的库中有 google.golang.org/grpc/health/grpc_health_v1,你直接 import 然后 RegisterHealthServer(grpcServer, health.NewServer())就行了

更多关于Golang Go语言中 Consul GRPC 健康检查失败问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1
我现在改了下代码引入了,但是&api.AgentServiceCheck 里的 GRPC 是要怎么填,

是 ip:port 还是 ip:port/service_name 还是 ip:port//grpc_health_v1.Health ?我都试了都不行

ip:port 就行了,如果不行的检查一下 ip,看看 consul 能否正常访问

#3

grpc: addrConn.createTransport failed to connect to {127.0.0.1:8080 0 <nil>}. Err :connection error: desc = “transport: Error while dialing dial tcp 127.0.0.1:8080: connect: connection refused”. Reconnecting…

提示这个,但是我自己写了一个 client 测试的话是可以连接上来的

consul 和 grpc server 在同一台机器上面?不是的话 consul 是无法访问的,最好改成内网 ip 或者改用 ttl 检查

#5

OK 了,我 tm 人傻了,consul 是在 docker 上的,然后我填的 check 地址是 127,,我在本地部署了个 consul 可以了

#5 consul 他这文档有坑吧,也没说直接引用官方的 func,还以为要自己写,搜了网上的教程,压根没人提过,我硬是研究了 2 天,浪费一个美好的周末 😑

针对Golang中Consul与GRPC健康检查失败的问题,这通常涉及到服务发现、负载均衡以及健康监测等多个方面。以下是一些可能的解决步骤和检查点:

  1. 确认Consul服务状态:首先确保Consul服务本身运行正常,可以通过Consul的Web UI或命令行工具检查服务列表和状态。

  2. GRPC服务注册:确认GRPC服务是否已正确注册到Consul。检查服务注册的代码,确保服务地址、端口和元数据(如健康检查路径)正确无误。

  3. 健康检查配置:检查Consul中GRPC服务的健康检查配置。确保健康检查路径可达,且服务能够响应健康检查请求。如果使用的是HTTP健康检查,确保服务在该路径下返回200 OK状态码。

  4. 网络问题:排查网络问题,确保Consul服务器能够访问GRPC服务的健康检查路径。检查防火墙规则、网络ACLs等是否阻止了访问。

  5. 日志分析:查看Consul和GRPC服务的日志文件,寻找可能的错误信息或异常。这有助于诊断问题所在。

  6. 版本兼容性:确认Consul和GRPC客户端/服务器的版本是否兼容。有时版本更新会引入不兼容的变更。

  7. 重启服务:在修改配置或更新服务后,尝试重启Consul和GRPC服务,以确保所有设置生效。

如果以上步骤仍无法解决问题,建议详细记录问题现象和排查过程,并寻求来自Consul或GRPC社区的帮助。

回到顶部