package token import ( "errors" "net" pb "schain/proto" "time" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" ) const ( //服务器在处理任务或执行操作时,至少需要等待1分钟的时间间隔 serverMinInterval = time.Duration(1) * time.Minute //5秒连接超时 connectionTimeout = 5 * time.Second ) type Server struct { Listener net.Listener Server *grpc.Server } func (s *Server) Start() error { if s.Listener == nil { return errors.New("nil listener") } if s.Server == nil { return errors.New("nil server") } return s.Server.Serve(s.Listener) } func (s *Server) Stop() { if s.Server != nil { s.Server.Stop() } } func NewServer(address string) (*Server, error) { if address == "" { return nil, errors.New("server listen address not provided") } listener, err := net.Listen("tcp", address) if err != nil { return nil, err } //普通方法:一元拦截器(grpc.UnaryInterceptor) /*interceptor := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { if !is_ahtu { handler(ctx, req) is_ahtu = true } if Check(ctx) { handler(ctx, req) } return } */ var serverOpts []grpc.ServerOption serverKeepAliveParameters := keepalive.ServerParameters{ Time: 1 * time.Minute, Timeout: 20 * time.Second, } serverOpts = append(serverOpts, grpc.KeepaliveParams(serverKeepAliveParameters)) serverOpts = append(serverOpts, grpc.MaxSendMsgSize(maxSendMessageSize)) serverOpts = append(serverOpts, grpc.MaxRecvMsgSize(maxRecvMessageSize)) kep := keepalive.EnforcementPolicy{ MinTime: serverMinInterval, PermitWithoutStream: true, } serverOpts = append(serverOpts, grpc.KeepaliveEnforcementPolicy(kep)) serverOpts = append(serverOpts, grpc.ConnectionTimeout(connectionTimeout)) //serverOpts = append(serverOpts, grpc.UnaryInterceptor(interceptor)) // create a gRPC server object grpcServer := grpc.NewServer(serverOpts...) request_server := &RequestServer{} pb.RegisterPingServer(grpcServer, request_server) return &Server{Listener: listener, Server: grpcServer}, err }