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