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

相关推荐
GetcharZp5 天前
C++ 程序员一定要会的 RPC 框架:gRPC 从原理到实战,一次写通服务端和客户端
c++·后端·grpc
Tipriest_12 天前
grpc工具概念介绍与核心组成,应用领域说明
grpc
Henry_Wu00124 天前
go与c# 及nats和rabbitmq交互
golang·c#·rabbitmq·grpc·nats
只做人间不老仙1 个月前
C++ grpc 环境部署
grpc
西京刀客1 个月前
什么是gRPC Metadata,使用场景是什么 | 拦截器 与 Metadata
grpc·拦截器·metadata
pan3035074792 个月前
GRPC详解
微服务·grpc
用户90555842148054 个月前
RPC源码探究rpc连接数上涨的原因?
grpc
poemyang4 个月前
站在巨人的肩膀上:gRPC通过HTTP/2构建云原生时代的通信标准
网络协议·云原生·rpc·grpc·http2.0
鼠鼠我捏,要死了捏5 个月前
基于Spring Boot与gRPC的高性能微服务架构设计分享
spring boot·微服务·grpc
zhuyasen5 个月前
Sponge:一个重构Go开发体验的框架,让你在开发项目开"外挂"
go·gin·grpc