58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
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...)
|
|
}
|
|
}
|