grpc NewClient 报错 name resolver error: produced zero addresses

场景

grpc版本: google.golang.org/grpc v1.64.0

连接客户端:

go 复制代码
import(
	"google.golang.org/grpc"
	"net"
)
// 拿着设备ID 去获取连接
var connMap map[string]net.Conn
conn, err := grpc.NewClient(
	"device_id",
	grpc.WithContextDialer(func(ctx context.Context, deviceID string) (net.Conn, error) {
		return connMap[deviceID]
	}),
)

上面的代码报错:name resolver error: produced zero addresses

解决方法

go 复制代码
conn, err := grpc.NewClient(
	"passthrough:device_id",// 加上 passthrough 协议
	grpc.WithContextDialer(func(ctx context.Context, deviceID string) (net.Conn, error) {
		return connMap[deviceID]
	}),
)

原因

1.64版本之前我们使用下面的代码建立连接

go 复制代码
// Deprecated: use NewClient instead.  Will be supported throughout 1.x.
func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) {
	// At the end of this method, we kick the channel out of idle, rather than
	// waiting for the first rpc.
	opts = append([]DialOption{withDefaultScheme("passthrough")}, opts...)
	cc, err := NewClient(target, opts...)
	if err != nil {
		return nil, err
	}
	......
}

可以看到默认使用的协议是 passthrough,

使用 NewClient 默认使用的协议是 dns

如果不是 passthrough 就会用 url.Parse 来解析地址,这样的话就会解析错误

相关推荐
ironinfo2 天前
.net 高并发服务性能瓶颈排查处理
性能优化·.net·grpc
千里马-horse4 天前
gRPC -- Guides -- Request Hedging
grpc·对冲机制
千里马-horse4 天前
gRPC -- Guides -- Reflection
grpc·反射
ALex_zry22 天前
gRPC服务熔断与限流设计
c++·安全·grpc
人间打气筒(Ada)1 个月前
「码动四季·开源同行」go实战案例:如何在微服务中集成 Zipkin 组件?
微服务·golang·开源·grpc·zipkin·http调用
只做人间不老仙2 个月前
grpc测试工具ghz的使用
后端·grpc
只做人间不老仙2 个月前
C++ grpc rpc取消示例学习
后端·grpc
stark张宇2 个月前
微服务架构必备:Gin + gRPC + Consul + Nacos + GORM 打造用户服务
微服务·gin·grpc
雮尘2 个月前
手把手带你玩转Android gRPC:一篇搞定原理、配置与客户端开发
android·前端·grpc