Skip to main content

server

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

如何使用

自动注册

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

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

func main() {
.....
}

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

srv := server.Get("server1")

直接拿到了server,接下来可以组册服务。

testdata.RegisterGreeterServer(srv, &GreeterServerImpl{})

配置参数

主配置

参数类型是否必填含义默认值
Namestringserver名称,用来获取server实例。如果使用注册中心,会以该名称进行注册
Networkstring网络类型tcp
Addrstring监听地址:0
Timeouttime请求超时时间30s
RegistrarRefstring引用的注册中心名称,用来根据名称获取注册中心实例
LoggerRefstring引用的日志名称,用来根据名称获取日志实例默认打到控制台
EnableMetricsbool是否开启metrics插件false
EnableTracingbool是否开启tracing插件false
EnableLoggingbool是否开启logging插件false
TlsServerTLSConfigTLS支持
GrpcOptsGRPCServerOptionsgrpc 参数详细配置
Metadatamap<string, string>服务元信息

ServerTLSConfig

参数类型是否必填含义默认值
CertFilestring证书路径
KeyFilestringkey文件路径

GRPCServerOptions

参数类型是否必填含义默认值
MaxConcurrentStreamsint一个连接中最大并发Stream数math.MaxUint32
MaxReceiveMessageSizeint最大允许接收的字节数4MB
MaxSendMessageSizeint最大允许发送的字节数math.MaxInt32
KeepaliveParamsGRPCServerKeepaliveParamsKeepalive相关配置
KeepalivePolicyGRPCServerKeepalivePolicykeepalive 强制策略,服务器将关闭与违反此规定的客户端的连接
InitialWindowSizeint基于Stream的滑动窗口大小64KB
InitialConnWindowSizeint基于Connection的滑动窗口16 * 64KB
WriteBufferSizeint写缓冲大小32KB
ReadBufferSizeint读缓冲大小32KB
ConnectionTimeouttime连接超时时间120s
MaxHeaderListSizeint每次调用允许发送的header的最大条数uint32(16 << 20)

GRPCServerKeepaliveParams

参数类型是否必填含义默认值
MaxConnectionIdletime最大连接空闲时间math.MaxInt64
MaxConnectionAgetime最大连接存活时间math.MaxInt64
MaxConnectionAgeGracetime在强制关闭连接之间, 允许处理pending的rpc请求时间math.MaxInt64
Timetime空闲检测时间,不能小于1s2h
Timeouttime检测超时时间20s

GRPCServerKeepalivePolicy

参数类型是否必填含义默认值
MinTimetime如果客户端两次 ping 的间隔小于MinTime,则关闭连接5m
PermitWithoutStreambool即使没有 active stream, 也允许 pingfalse

配置举例

[[ngo.microservices.grpc.servers]]
name = "server1"
network = "tcp"
addr = ":8080"
timeout = "30s"
registrarRef = ""
loggerRef = ""
enableMetrics = false
enableTracing = false
enableLogging = false
[ngo.microservices.grpc.servers.metadata]
key1 = "value1"

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

添加中间件

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

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