API解析——gRPC (1) NewClient
NewClient
func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error)
定义
target: 连接的目标地址。格式通常为 scheme://authority/endpoint。例如 localhost:8080 或 dns:///service.example.com。
opts: 各种配置选项(grpc.WithXXX)。
点击查看源码注释
NewClient creates a new gRPC "channel" for the target URI provided. No I/O
is performed. Use of the ClientConn for RPCs will automatically cause it to
connect. The Connect method may be called to manually create a connection,
but for most users this should be unnecessary.
The target name syntax is defined in
https://github.com/grpc/grpc/blob/master/doc/naming.md. E.g. to use the dns
name resolver, a "dns:///" prefix may be applied to the target. The default
name resolver will be used if no scheme is detected, or if the parsed scheme
is not a registered name resolver. The default resolver is "dns" but can be
overridden using the resolver package's SetDefaultScheme.
Examples:
- "foo.googleapis.com:8080"
- "dns:///foo.googleapis.com:8080"
- "dns:///foo.googleapis.com"
- "dns:///10.0.0.213:8080"
- "dns:///%5B2001:db8:85a3:8d3:1319:8a2e:370:7348%5D:443"
- "dns://8.8.8.8/foo.googleapis.com:8080"
- "dns://8.8.8.8/foo.googleapis.com"
- "zookeeper://zk.example.com:9900/example_service"
The DialOptions returned by WithBlock, WithTimeout,
WithReturnConnectionError, and FailOnNonTempDialError are ignored by this
function.
NewClient 为提供的目标 URI 创建一个新的 gRPC "通道"。不会执行任何 I/O。
使用该 ClientConn 发起 RPC 会自动触发连接。可以调用 Connect 方法手动创建连接,
但对大多数用户而言这通常是不必要的。
目标名称的语法定义在:
https://github.com/grpc/grpc/blob/master/doc/naming.md
例如,要使用 DNS 名称解析器,
可以在目标前加上 "dns:///" 前缀。如果没有检测到协议方案,或者解析出的方案不是已注册的名称解析器,
则会使用默认的名称解析器。默认解析器是 "dns",但可以通过 resolver 包的 SetDefaultScheme 方法覆盖。
示例:
- "foo.googleapis.com:8080"
- "dns:///foo.googleapis.com:8080"
- "dns:///foo.googleapis.com"
- "dns:///10.0.0.213:8080"
- "dns:///%5B2001:db8:85a3:8d3:1319:8a2e:370:7348%5D:443"
- "dns://8.8.8.8/foo.googleapis.com:8080"
- "dns://8.8.8.8/foo.googleapis.com"
- "zookeeper://zk.example.com:9900/example_service"
由 WithBlock、WithTimeout、WithReturnConnectionError 和 FailOnNonTempDialError 返回的 DialOptions
将被此函数忽略。
相关迭代
在 gRPC-Go 的较新版本中(v1.60.0 及之后),传统的 grpc.Dial 和 grpc.DialContext 已被标记为 Deprecated(弃用)。官方推荐使用 grpc.NewClient。
在旧的 grpc.Dial 中,连接默认是“积极”的。如果你不配置,它可能会在后台尝试立即建立物理连接。而 grpc.NewClient 的设计更符合 Lazy Connection(惰性连接) 的理念.
NewClient 与 Dial 的核心区别
| 特性 | grpc.Dial (旧) | grpc.NewClient (新) |
|---|---|---|
| 执行时机 | 可能立即尝试连接 | 仅创建对象,连接通常在第一次请求时触发 |
| 默认行为 | 容易写出阻塞代码 | 强制非阻塞 |
| Context 支持 | 需要 DialContext 来控制超时 | NewClient 本身不需要 Context,超时由 DialOption 控制 |
| 安全性 | 默认可能不安全 | 强迫开发者明确选择加密或不加密 |
关键 DialOptions 详解
| 选项 | 说明 |
|---|---|
| WithTransportCredentials | 必填。指定安全凭证,如 TLS。如果不加密需传入 insecure.NewCredentials()。 |
| WithDefaultServiceConfig | 设置默认的服务配置(如负载均衡策略 round_robin)。 |
| WithUnaryInterceptor | 客户端一元拦截器(用于加日志、TraceID、身份认证等)。 |
| WithKeepaliveParams | 配置客户端心跳探测,防止连接被防火墙静默断开。 |

浙公网安备 33010602011771号