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 来解析地址,这样的话就会解析错误

相关推荐
ErizJ9 天前
Golang | 运用分布式搜索引擎实现视频搜索业务
分布式·搜索引擎·golang·全栈·grpc
JIngles1239 天前
dart实现单client连接的grpc server (以ip地址作判断)
grpc·dart
ErizJ11 天前
Golang | 搜索哨兵-对接分布式gRPC服务
开发语言·分布式·golang·grpc
编程、小哥哥20 天前
Java面试实战:从Spring Boot到分布式缓存的深度探索
java·spring boot·redis·微服务·grpc·缓存技术·面试技巧
YGGP24 天前
对比 HTTP-REST 与 gRPC:各自的优缺点以及适用的场景
http·grpc·rest
pedestrian_h1 个月前
gRPC学习笔记记录以及整合gin开发
笔记·学习·golang·gin·grpc
小宋要上岸1 个月前
优雅关闭服务:深入理解 SIGINT / SIGTERM 信号处理机制
c++·信号处理·grpc
ArcX2 个月前
用现代方式在 React 中使用 gRPC:从 gRPC-web 到 Connect
前端·后端·grpc
徐小黑ACG2 个月前
GO简单开发grpc
开发语言·后端·golang·grpc·protobuf
用户98402276679182 个月前
基于 BFF + GRPC 实现数据聚合的功能
后端·grpc