package grpcconn import ( "context" "git.hlsq.asia/alex/service-common/log" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" "strconv" "time" ) type GrpcConnection struct { sid int64 conn *grpc.ClientConn } func NewGrpcConnection(sid int64, address string) (*GrpcConnection, error) { p := &GrpcConnection{ sid: sid, } conn, err := grpc.NewClient( address, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithStatsHandler(otelgrpc.NewClientHandler()), grpc.WithUnaryInterceptor(sidInterceptor(sid)), grpc.WithKeepaliveParams( keepalive.ClientParameters{ Time: 30 * time.Second, // 保活探测包发送的时间间隔 Timeout: 10 * time.Second, // 保活探测包的超时时间 PermitWithoutStream: true, }, ), ) if err != nil { log.Errorf("create grpc err: %v, sid: %v, addr: %v", err, sid, address) return nil, err } p.conn = conn return p, nil } func (g *GrpcConnection) GetConnection() *grpc.ClientConn { return g.conn } func sidInterceptor(sid int64) grpc.UnaryClientInterceptor { sidStr := strconv.Itoa(int(sid)) return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { ctx = metadata.AppendToOutgoingContext(ctx, "X-Sid", sidStr, ) return invoker(ctx, method, req, reply, cc, opts...) } }