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

相关推荐
叫我少年3 天前
C# 中使用 gRPC 通讯
c#·grpc·类库封装
命运之手10 天前
[ Kotlin ] Integrate ProtoBuffer and GoogleRPC Into KotlinNative
android·kotlin·grpc·proto-buffer·kotlin-native
VAllen19 天前
分析基于ASP.NET Core Kernel的gRPC服务在不同.NET版本的不同部署方式的不同线程池下的性能表现
.net·性能测试·asp.net core·grpc·dotnet
Harrytsz21 天前
Visual Studio 2022 C++ gRPC 环境搭建
c++·grpc·visual studio·vcpkg
晨港飞燕1 个月前
SpringCloudAlibaba升级手册-nacos问题记录
nacos·grpc·兼容性
码上一元1 个月前
RPC 服务与 gRPC 的入门案例
网络·网络协议·rpc·grpc
Jrainlau2 个月前
bun 实现 gRPC 服务器
前端·grpc·bun
gsls2008082 个月前
小型kv数据库leveldb配合grpc实现网络访问
数据库·grpc·leveldb
许野平3 个月前
Rust:设计 gRPC 客户端
开发语言·后端·rust·grpc·tonic
钢铁小狗侠3 个月前
如何在windows上下载和编译grpc
grpc