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

相关推荐
Donkor-8 天前
grpc学习golang版( 一、基本概念与安装 )
rpc·golang·grpc
Donkor-8 天前
grpc学习golang版( 五、多proto文件示例 )
开发语言·学习·golang·grpc
Donkor-9 天前
grpc学习golang版( 三、proto文件数据类型 )
开发语言·学习·golang·grpc
Donkor-10 天前
grpc学习golang版(六、服务器流式传输)
服务器·学习·golang·grpc
dapeng-大鹏18 天前
Gone框架介绍29 - 在Gone中使用gRPC通信
golang·grpc·gone
wanmei00224 天前
grpc代理服务的实现(二)
golang·proxy·grpc·代理
jefffff1 个月前
grpc:流式 RPC
后端·rpc·grpc
500了1 个月前
gRPC和ProtoBuf
grpc
mp91052 个月前
Idea整合Protobuf
java·intellij-idea·grpc·protobuf