# README
grpcsdk
grpc的客户端sdk模板,使用它快速构造grpc的sdk
本项目只适用于go 1.18+
使用步骤
-
将proto文件转成go模块
protoc -I xxx --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go_out=xxx --go-grpc_out=xxx xxx.proto"
-
在生成的文件中找到客户端接口(以
XXXXClient
命名的interface
) -
在生成的文件中找到服务描述对象(以
XXXXX_ServiceDesc
命名的变量) -
使用
func New[T any](factory NewGrpcClientFunc[T], desc *grpc.ServiceDesc) *SDK[T]
创建一个sdk实例 -
使用
func (c *SDK[T]) Init(opts ...optparams.Option[SDKConfig]) error
通过配置初始化sdk实例 -
使用
func (c *SDK[T]) GetClient(opts ...optparams.Option[AcquireOptions]) (T, ReleaseFunc)
获取客户端对象和客户端回收函数 -
使用
func (c *SDK[T]) NewCtx(opts ...optparams.Option[CtxOptions]) (ctx context.Context, cancel context.CancelFunc)
构造请求的上下文和上下文取消函数 -
调用接口
T
规定的方法. -
执行上下文取消函数
-
执行客户端回收函数
-
执行
func (c *SDK[T]) Close() error
关闭sdk
补充:
- 在第四步完成后可以使用
sdk.Logger
打印log,这个log会带有字段"module":"grpcsdk"
和"target_service": desc.ServiceName
,log的其它配置会根据github.com/Golang-Tools/loggerhelper/v2
的Set
方法变化而变化
使用例子
package main
import (
"io"
"os"
"github.com/Golang-Tools/grpcsdk"
"xxx_pb"
log "github.com/Golang-Tools/loggerhelper/v2"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)
func main() {
sdk := grpcsdk.New(xxx_pb.NewTESTGOGRPCSIMPLEClient, &xxx_pb.TESTGOGRPCSIMPLE_ServiceDesc)
sdk.Logger.Info("setup sdk ok")
err := sdk.Init(grpcsdk.WithQueryAddresses("localhost:5000"))
if err != nil {
sdk.Logger.Error("sdk.Init get error", log.Dict{"err": err.Error()})
}
defer sdk.Close()
sdk.Logger.Info("setup sdk init ok")
Conn, release := sdk.GetClient()
defer release()
sdk.Logger.Info("setup sdk GetClient ok")
sdk.Logger.Info("setup ok")
//req-res
ctx, cancel := sdk.NewCtx(sdk.WithRequestMeta(), grpcsdk.WithMeta("a", "1"), grpcsdk.WithMeta("b", "2"))
defer cancel()
var header, trailer metadata.MD
req, err := Conn.Square(ctx, &xxx_pb.Message{Message: 2.0},
grpc.Header(&header), // will retrieve header
grpc.Trailer(&trailer), // will retrieve trailer
)
if err != nil {
sdk.Logger.Error("Square get error", log.Dict{"err": err.Error()})
os.Exit(1)
}
log.Info("Square get result", log.Dict{"header": header, "req": req, "trailer": trailer})
//req-stream
streamctx, streamcancel := sdk.NewCtx(grpcsdk.UntilEnd())
defer streamcancel()
ResStream, err := Conn.RangeSquare(streamctx, &xxx_pb.Message{Message: 4.0})
if err != nil {
sdk.Logger.Error("RangeSquare get error", log.Dict{"err": err.Error()})
os.Exit(1)
}
for {
feature, err := ResStream.Recv()
if err != nil {
if err == io.EOF {
break
} else {
sdk.Logger.Error("RangeSquare(_) = _", log.Dict{"err": err.Error()})
os.Exit(1)
}
}
sdk.Logger.Info("RangeSquare get res", log.Dict{"res": feature})
}
}
# Functions
UntilEnd NewCtx方法的参数,用于设置ctx为不会超时.
HasClientConfig 复用创建客户端的选项用于创建池@params opts ...optparams.Option[NewClientOptions] 用于创建客户端的配置项.
New 创建客户端对象@generics T any 由pb生成的客户端接口,以`XXXXClient`命名的interface@params factory NewGrpcClientFunc[T] 将grpc连接转化为grpc客户端的程序,可以在pb生成的模块中找到,通常以`NewXXXXXXClient`命名@params desc *grpc.ServiceDesc grpc服务的描述对象,可以在pb生成的模块中找到,通常以`XXXXX_ServiceDesc`命名@returns *SDK[T] SDK对象.
NewClient 创建一个客户端对象@generics T any 由pb生成的客户端接口,以`XXXXClient`命名的interface@params newgrpcclientfunc NewGrpcClientFunc[T] 将grpc连接转化为grpc客户端的程序,可以在pb生成的模块中找到,通常以`NewXXXXXXClient`命名@params opts ...optparams.Option[NewClientOptions] 创建客户端的配置项,详细可以看clientnewopts.go文件@returns *Client[T] 返回客户端对象@returns error 错误信息.
NewPool 创建一个池@generics T any 由pb生成的客户端接口,以`XXXXClient`命名的interface@params newclientfunc NewGrpcClientFunc[T] 将grpc连接转化为grpc客户端的程序,可以在pb生成的模块中找到,通常以`NewXXXXXXClient`命名@params opts ...optparams.Option[NewClientPoolOptions] 创建池对象的参数选项,详细可以看clientpoolnewopts.go文件@returns *GrpcConnPool[T] 返回客户端连接池对象@returns error 错误信息.
UntilEnd NewCtx方法的参数,用于设置ctx为不会超时.
WithAcquireWaitTimeMS 创建池对象方法的参数,用于设置从连接池中获取连接的最大等待时长,单位ms.@params wait int 获取客户端等待时长.
WithAddr 创建客户端对象方法的参数,用于设置连接地址@params addr string 连接地址,如果是多个地址,则会做本地负载均衡后生成一个地址填入.
WithCaCertPath sdk.Init方法的参数,用于设置sdk如果要使用tls则需要指定根证书位置@params path string 根证书路径.
WithClientCertPath sdk.Init方法的参数,用于设置sdk客户端证书位置@params path string 客户端证书路径.
WithClientConfig 创建客户端对象方法的参数,用于通过NewClientOptions对象设置客户端@params conf *NewClientOptions 设置新建客户端的选项.
WithClientKeyPath sdk.Init方法的参数,用于设置sdk客户端证书对应的私钥位置@params path string 客户端证书对应的私钥路径.
WithClientPool sdk.Init方法的参数,用于设置sdk是否使用grpc的客户端池.
WithClientPoolAcquireWaitTime sdk.Init方法的参数,用于设置sdk获取客户端池时的最大等待时间@params wait int 获取客户端池时的最大等待时间,单位ms.
WithClientPoolLimits sdk.Init方法的参数,用于设置sdk使用客户端池时的池最大水位@params n int 使用客户端池时的池最大水位.
WithClientPoolReservations sdk.Init方法的参数,用于设置sdk使用客户端池时的池注水水位@params n int 使用客户端池时的池注水水位.
WithCompression sdk.Init方法的参数,用于设置sdk使用哪种方式压缩发送的消息@params protocol string 协议名,目前可选的只有gzip.
UntilEnd NewCtx方法的参数,用于设置ctx为不会超时.
WithConnWithBlock sdk.Init方法的参数,用于设置sdk是否同步的建立连接.
WithDialOpts 创建客户端对象方法的参数,用于设置连接时的参数@params opts ...grpc.DialOption grpc的拨号设置.
WithInitialConnWindowSize sdk.Init方法的参数,用于设置sdk基于Connection的滑动窗口大小@params size int 基于Connection的滑动窗口大小.
WithInitialWindowSize sdk.Init方法的参数,用于设置sdk基于Stream的滑动窗口大小@params size int 基于Stream的滑动窗口大小.
WithKeepaliveEnforcementPermitWithoutStream sdk.Init方法的参数,用于设置sdk是否当连接空闲时仍然发送PING帧监测.
WithKeepaliveTime sdk.Init方法的参数,用于设置sdk空闲连接每隔n秒ping一次客户端已确保连接存活@params alivetime int 空闲连接每隔n秒ping一次客户端已确保连接存活,单位ms.
WithKeepaliveTimeout sdk.Init方法的参数,用于设置sdkping时长超过n则认为连接已死@params timeout int ping时长超过n则认为连接已死,单位ms.
WithLimits 创建池对象方法的参数,用于设置连接池的最大连接数@params limits int 池最大水位.
WithMaxRecvMsgSize sdk.Init方法的参数,用于设置sdk允许接收的最大消息长度@params size int 允许接收的最大消息长度.
WithMaxSendMsgSize sdk.Init方法的参数,用于设置sdk允许发送的最大消息长度@params size int 允许发送的最大消息长度.
WithMeta NewCtx方法的参数,用于设置信息到meta数据@params key string meta键@params value ...string meta值.
WithQueryAddresses sdk.Init方法的参数,用于设置sdk请求的地址@params addresses ...string 连接服务的主机地址.
WithQueryTimeout sdk.Init方法的参数,用于设置sdk请求服务的最大超时时间@params wait int 请求服务的最大超时时间,单位ms.
WithRequesterAppName sdk.Init方法的参数,用于设置sdk请求方服务名@params name string 请求端app名.
WithRequesterAppVersion sdk.Init方法的参数,用于设置sdk请求方服务版本@params version string 请求方服务版本.
WithReservations 创建池对象方法的参数,用于设置连接池的最小连接数@params reservations int 池安全水位.
WithStreamInterceptors sdk.Init方法的参数,用于设置sdk的流请求拦截器@params interceptor ...grpc.StreamClientInterceptor 流请求拦截器.
WithTimeout NewCtx方法的参数,用于设置ctx为指定的超时时长@params timeout time.Duration 请求超时,单位ms.
WithUnaryInterceptors sdk.Init方法的参数,用于设置sdk的请求拦截器@params interceptor ...grpc.UnaryClientInterceptor 请求拦截器.
WithXDSCREDS sdk.Init方法的参数,用于设置sdk当address的schema是xds时是否使用xds的令牌加密访问.
# Variables
DefaultNewClientOpts 默认新建客户端的选项.
DefaultNewClientPoolOpts 默认新建客户端池的选项.
ErrAlreadyClosed is the error when the client conn was already closed.
ErrClosed is the error when the client pool is closed.
ErrFullPool is the error when the pool is already full.
ErrLimitsSmallThanReservation 初始化参数limits比reservations小.
ErrReservationSmallThanOne 初始化参数reservations比1小.
ErrTimeout is the error when the client pool timed out.
# Structs
AcquireOptions 设置Acquire方法的选项.
Client 客户端类,满足接口GrpcClientGetter和GrpcClientInterface@generics T any 需要指定返回的客户端接口.
CtxOptions 设置ctx行为的选项.
GrpcConnPool 客户端连接池,满足接口GrpcClientGetter@generics T any 由pb生成的客户端接口,以`XXXXClient`命名的interface.
NewClientOptions 设置新建客户端的选项.
NewClientPoolOptions 设置新建客户端池的选项.
SDK 的客户端类型@generics T any 由pb生成的客户端接口,以`XXXXClient`命名的interface.
SDKConfig 的客户端类型.
# Interfaces
GrpcClientGetter 客户获取客户端的对象@generics T any 由pb生成的客户端接口,以`XXXXClient`命名的interface.
GrpcClientInterface grpc的客户端接口@generics T any 由pb生成的客户端接口,以`XXXXClient`命名的interface.
GrpcConnInterface grpc的连接接口.
# Type aliases
NewGrpcClientFunc 用于构造可以被池使用对象的工厂函数@generics T any 由pb生成的客户端接口,以`XXXXClient`命名的interface.
No description provided by the author