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)

配置参数

主配置

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

ClientTLSConfig

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

GRPCClientOptions

参数类型是否必填含义默认值
Blockbool开启前台阻塞建立连接false
Authoritystring设置:authority
UserAgentstring设置User-Agent
ConnectParamsGRPCClientConnectParams连接相关配置
KeepaliveParamsGRPCClientKeepaliveParamsKeepalive相关配置
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配置中默认集成了tracingmetrics中间件,我们无需手动添加,对于其他中间件我们需要手动添加,调用方法如下:

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