1 Star 0 Fork 0

llakcs / agile-go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
server.go 3.24 KB
AI 代码解读
一键复制 编辑 原始数据 按行查看 历史
llakcs 提交于 2024-01-31 16:54 . 第一次提交
package grpc
import (
"context"
"crypto/tls"
"gitee.com/llakcs/agile-go/log"
"gitee.com/llakcs/agile-go/middleware"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/health"
"google.golang.org/grpc/health/grpc_health_v1"
"google.golang.org/grpc/reflection"
"net"
"time"
)
// ServerOption is gRPC server option.
type ServerOption func(o *Server)
// Address with server address.
func Address(addr string) ServerOption {
return func(s *Server) {
s.address = addr
}
}
// Timeout with server timeout.
func Timeout(timeout time.Duration) ServerOption {
return func(s *Server) {
s.timeout = timeout
}
}
func TLSConfig(t *tls.Config) ServerOption {
return func(o *Server) {
o.tls = t
}
}
func CustomHealth() ServerOption {
return func(s *Server) {
s.customHealth = true
}
}
// UnaryInterceptor returns a ServerOption that sets the UnaryServerInterceptor for the server.
func UnaryInterceptor(in ...grpc.UnaryServerInterceptor) ServerOption {
return func(s *Server) {
s.unaryInts = in
}
}
// StreamInterceptor returns a ServerOption that sets the StreamServerInterceptor for the server.
func StreamInterceptor(in ...grpc.StreamServerInterceptor) ServerOption {
return func(s *Server) {
s.streamInts = in
}
}
// Options with grpc options.
func Options(opts ...grpc.ServerOption) ServerOption {
return func(s *Server) {
s.grpcOpts = opts
}
}
func (s *Server) Use(selector string, m ...middleware.Middleware) {
s.middleware.Add(selector, m...)
}
type Server struct {
*grpc.Server
health *health.Server
baseCtx context.Context
address string
tls *tls.Config
timeout time.Duration
unaryInts []grpc.UnaryServerInterceptor
streamInts []grpc.StreamServerInterceptor
grpcOpts []grpc.ServerOption
middleware middleware.Matcher
customHealth bool
}
func NewServer(opts ...ServerOption) *Server {
srv := &Server{
baseCtx: context.Background(),
middleware: middleware.New(),
address: ":0",
timeout: 5 * time.Second,
health: health.NewServer(),
}
for _, o := range opts {
o(srv)
}
unaryInts := []grpc.UnaryServerInterceptor{
srv.unaryServerInterceptor(),
}
streamInts := []grpc.StreamServerInterceptor{
srv.streamServerInterceptor(),
}
if len(srv.unaryInts) > 0 {
unaryInts = append(unaryInts, srv.unaryInts...)
}
if len(srv.streamInts) > 0 {
streamInts = append(streamInts, srv.streamInts...)
}
grpcOpts := []grpc.ServerOption{
grpc.ChainUnaryInterceptor(unaryInts...),
grpc.ChainStreamInterceptor(streamInts...),
}
if srv.tls != nil {
grpcOpts = append(grpcOpts, grpc.Creds(credentials.NewTLS(srv.tls)))
}
if len(srv.grpcOpts) > 0 {
grpcOpts = append(grpcOpts, srv.grpcOpts...)
}
srv.Server = grpc.NewServer(grpcOpts...)
if !srv.customHealth {
grpc_health_v1.RegisterHealthServer(srv.Server, srv.health)
}
reflection.Register(srv.Server)
return srv
}
func (s *Server) Start(ctx context.Context) error {
lis, err := net.Listen("tcp", s.address)
if err != nil {
return err
}
log.Infof("[gRPC] server listening on: %s", lis.Addr().String())
s.health.Resume()
return s.Serve(lis)
}
func (s *Server) Stop(ctx context.Context) error {
s.health.Shutdown()
s.GracefulStop()
log.Info("[gRPC] server stopping")
return nil
}
1
https://gitee.com/llakcs/agile-go.git
git@gitee.com:llakcs/agile-go.git
llakcs
agile-go
agile-go
v1.2.0

搜索帮助