Skip to main content

client

我们对grpc做了简单封装。我们也为其适配了自动注册的rms包的实现。

如何使用​

自动注册​

在使用的过程中,我们只需要将rms下的grpc server导入到主程序中,比如

import (
_ "path/to/r/rms/grpc/client"
)

func main() {
.....
}

主程序运行过程中会根据配置中的数据,创建对应的实例,并且放到内存中。我们在使用的过程中,可以调用

cli := client.Get("client1")

直接拿到了client,接下来可以调用服务。

rsp, err := client.SayHello(ctx, req)

配置参数​

主配置​

参数类型是否必填含义默认值
Namestring是client名称,用来获取client实例
Targetstring是目标地址,如果是通过服务发现,需要sd:///前缀
Timeouttime否请求超时时间
DiscoveryRefstring否引用的服务发现名称,用来根据名称获取服务发现实例
BalancerNamestring否负载均衡名称round_robin
EnabledHealthCheckbool否是否开启健康检查,对应grpc.WithDefaultServiceConfig()中的HealthCheckConfigfalse
LoggerRefstring否引用的日志名称,用来根据名称获取日志实例默认打到控制台
EnableMetricsbool否是否开启metrics插件false
EnableTracingbool否是否开启tracing插件false
EnableLoggingbool否是否开启logging插件false
TlsClientTLSConfig否TLS支持
GrpcOptsGRPCClientOptions否grpc 参数详细配置

ClientTLSConfig​

参数类型是否必填含义默认值
CertFilestring是证书路径
ServerNamestring是server名称

GRPCClientOptions​

参数类型是否必填含义默认值
Blockbool否开启前台阻塞建立连接false
Authoritystring否设置:authority
UserAgentstring否设置User-Agent
ConnectParamsGRPCClientConnectParams否连接相关配置
KeepaliveParamsGRPCClientKeepaliveParams否Keepalive相关配置
InitialWindowSizeint否设置http/2 流的初始窗口大小
InitialConnWindowSizeint否设置http/2 连接的初始窗口大小
WriteBufferSizeint否写缓冲大小
ReadBufferSizeint否读缓冲大小32KB
MaxHeaderListSizeint否最大头部大小
DisableRetrybool否是否禁用重试

GRPCClientConnectParams​

参数类型是否必填含义默认值
BaseDelaytime否第一次失败重试前后需等待多久1s
Multiplierfloat否在失败的重试后乘以的倍数1.6
Jitterfloat否随机抖动因子0.2
MaxDelaytime否最大延迟时间120s
MinConnectTimeouttime否最小链接超时时间

GRPCClientKeepaliveParams​

参数类型是否必填含义默认值
Timetime否发送ping间隔
Timeouttime否超时时间20s
PermitWithoutStreambool否如果没有 active 的 stream, 是否允许发送 pingfalse

配置举例​

[[ngo.microservices.grpc.clients]]
name = "client1"
target = "127.0.0.1:8080"
timeout = "30s"
discoveryRef = ""
balancerName = "round_robin"
enabledHealthCheck = false
loggerRef = ""
enableMetrics = false
enableTracing = false
enableLogging = false

目前我们支持了同一个应用的多grpc client, 因此你可以在toml配置文件中配置多个。

添加中间件​

ngo配置中默认集成了tracing和metrics中间件,我们无需手动添加,对于其他中间件我们需要手动添加,调用方法如下:

// selector 支持 / 全局插件
// /{package} 包级别插件
// /{package}.{service} 服务级别插件
// /{package}.{service}/{method} 方法级别插件
// 加载顺序全局->全局->包->服务->方法
func (c *Client) Use(selector string, mws ...middleware.Middleware)