94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
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
|
||
|
||
}
|