第一次提交
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
package baseGrpc
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
v2 "git.magicany.cc/black1552/gf-common/utils"
|
||||
"github.com/duke-git/lancet/v2/slice"
|
||||
"github.com/gogf/gf/contrib/registry/etcd/v2"
|
||||
"github.com/gogf/gf/contrib/rpc/grpcx/v2"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/net/gsvc"
|
||||
"github.com/gogf/gf/v2/os/gctx"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
var (
|
||||
name string
|
||||
open bool
|
||||
)
|
||||
|
||||
type SGrpc struct {
|
||||
}
|
||||
|
||||
func New() *SGrpc {
|
||||
name = v2.GenerateString(20)
|
||||
config, _ := g.Config().Get(gctx.New(), "grpc.open", false)
|
||||
open = config.Bool()
|
||||
return &SGrpc{}
|
||||
}
|
||||
|
||||
func (s *SGrpc) clientTimeout(ctx context.Context, method string, req, reply interface{},
|
||||
cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption,
|
||||
) error {
|
||||
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
||||
defer cancel()
|
||||
err := invoker(ctx, method, req, reply, cc, opts...)
|
||||
return err
|
||||
}
|
||||
|
||||
// InitServer 初始化服务 初始化后使用需要服务的grpc可以利用其进行注册
|
||||
func (s *SGrpc) InitServer() *grpcx.GrpcServer {
|
||||
s.RegisterResolver(gctx.New())
|
||||
config := grpcx.Server.NewConfig()
|
||||
config.Options = append(config.Options, []grpc.ServerOption{
|
||||
grpcx.Server.ChainUnary(
|
||||
grpcx.Server.UnaryError,
|
||||
)}...,
|
||||
)
|
||||
config.Name = s.GetServerName()
|
||||
return grpcx.Server.New(config)
|
||||
}
|
||||
|
||||
// Client 获取对应服务CONN 需要客户端使用它进行初始化
|
||||
func (s *SGrpc) Client(ctx context.Context, name string) *grpc.ClientConn {
|
||||
servers, err := s.GetServers(ctx)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "%+v", err)
|
||||
return nil
|
||||
}
|
||||
_, ok := slice.FindBy(servers, func(index int, item gsvc.Service) bool {
|
||||
return item.GetName() == name
|
||||
})
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
var conn = grpcx.Client.MustNewGrpcClientConn(name, grpcx.Client.ChainUnary(
|
||||
s.clientTimeout,
|
||||
))
|
||||
return conn
|
||||
}
|
||||
|
||||
// GetServers 获取所有服务
|
||||
func (s *SGrpc) GetServers(ctx context.Context, inputConfig ...gsvc.SearchInput) ([]gsvc.Service, error) {
|
||||
input := gsvc.SearchInput{}
|
||||
if len(inputConfig) > 0 {
|
||||
input = inputConfig[0]
|
||||
}
|
||||
servers, err := gsvc.GetRegistry().Search(ctx, input)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return servers, nil
|
||||
}
|
||||
|
||||
// RegisterResolver 注册服务发现
|
||||
func (s *SGrpc) RegisterResolver(ctx context.Context) {
|
||||
etcdConfig, err := g.Config().Get(ctx, "etcd.host")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
grpcx.Resolver.Register(etcd.New(etcdConfig.String()))
|
||||
}
|
||||
|
||||
// GetServerName 获取服务名
|
||||
func (s *SGrpc) GetServerName() string {
|
||||
return name
|
||||
}
|
||||
|
||||
func (s *SGrpc) IsOpen() bool {
|
||||
return open
|
||||
}
|
||||
Reference in New Issue
Block a user