package grpcx import ( "os" "git.linkiio.cn/linkpay/invoke/chain" "github.com/gogf/gf/contrib/registry/etcd/v2" "github.com/gogf/gf/contrib/rpc/grpcx/v2" "google.golang.org/grpc" "google.golang.org/grpc/reflection" ) var Endpoint = os.Getenv("ETCD_ENDPOINTS") var GrpcConfig *grpcx.GrpcServerConfig = grpcx.Server.NewConfig() func Etcd() *etcd.Registry { return etcd.New(Endpoint) } func SetOptions(o ...grpc.ServerOption) *grpcx.GrpcServerConfig { GrpcConfig.Options = append(GrpcConfig.Options, o...) return GrpcConfig } /** * 服务注册 * @param void * @author dc.To * @version 20250427 */ func Registry(f ...func(*grpcx.GrpcServer)) { GrpcConfig.Options = append(GrpcConfig.Options, []grpc.ServerOption{ grpcx.Server.ChainUnary( grpcx.Server.UnaryValidate, chain.ClientContextUnaryChain, chain.ClientMetadataUnaryChain, )}..., ) if Endpoint != "" { grpcx.Resolver.Register(Etcd()) } s := grpcx.Server.New(GrpcConfig) for _, fn := range f { fn(s) } Reflect(s.Server) s.Run() } /** * grpc reflect * @author dc.To * @version 20250427 */ func Reflect(s reflection.GRPCServer, f ...func()) { if Endpoint == "" { reflection.Register(s) } for _, fn := range f { fn() } } func Resolve[T any](value T, f func(T) T) T { if f == nil { return value } return f(value) }