HTTP、GRPC TLS支持

This commit is contained in:
kercylan98 2023-05-10 16:35:17 +08:00
parent a0a38793aa
commit 7046e40d51
2 changed files with 42 additions and 4 deletions

View File

@ -3,6 +3,7 @@ package server
import ( import (
"github.com/kercylan98/minotaur/utils/log" "github.com/kercylan98/minotaur/utils/log"
"go.uber.org/zap" "go.uber.org/zap"
"google.golang.org/grpc"
) )
const ( const (
@ -20,6 +21,28 @@ const (
type Option func(srv *Server) type Option func(srv *Server)
// WithTLS 通过安全传输层协议TLS创建服务器
// - 支持Http、Websocket
func WithTLS(certFile, keyFile string) Option {
return func(srv *Server) {
switch srv.network {
case NetworkHttp, NetworkWebsocket, NetworkTCP, NetworkTCP4, NetworkTCP6:
srv.certFile = certFile
srv.keyFile = keyFile
}
}
}
// WithGRPCServerOptions 通过GRPC的可选项创建GRPC服务器
func WithGRPCServerOptions(options ...grpc.ServerOption) Option {
return func(srv *Server) {
if srv.network != NetworkGRPC {
return
}
srv.grpcServer = grpc.NewServer(options...)
}
}
// WithProd 通过生产模式运行服务器 // WithProd 通过生产模式运行服务器
func WithProd() Option { func WithProd() Option {
return func(srv *Server) { return func(srv *Server) {

View File

@ -54,6 +54,7 @@ type Server struct {
httpServer *http.Server // HTTP模式下的服务器 httpServer *http.Server // HTTP模式下的服务器
grpcServer *grpc.Server // GRPC模式下的服务器 grpcServer *grpc.Server // GRPC模式下的服务器
supportMessageTypes map[int]bool // websocket模式下支持的消息类型 supportMessageTypes map[int]bool // websocket模式下支持的消息类型
certFile, keyFile string // TLS文件
gServer *gNet // TCP或UDP模式下的服务器 gServer *gNet // TCP或UDP模式下的服务器
messagePool *synchronization.Pool[*message] // 消息池 messagePool *synchronization.Pool[*message] // 消息池
@ -175,9 +176,16 @@ func (slf *Server) Run(addr string) error {
go func() { go func() {
slf.OnStartBeforeEvent() slf.OnStartBeforeEvent()
slf.httpServer.Addr = slf.addr slf.httpServer.Addr = slf.addr
if len(slf.certFile)+len(slf.keyFile) > 0 {
if err := slf.httpServer.ListenAndServeTLS(slf.certFile, slf.keyFile); err != nil {
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
}
} else {
if err := slf.httpServer.ListenAndServe(); err != nil { if err := slf.httpServer.ListenAndServe(); err != nil {
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
} }
}
}() }()
case NetworkWebsocket: case NetworkWebsocket:
go connectionInitHandle(nil) go connectionInitHandle(nil)
@ -241,9 +249,16 @@ func (slf *Server) Run(addr string) error {
}) })
go func() { go func() {
slf.OnStartBeforeEvent() slf.OnStartBeforeEvent()
if len(slf.certFile)+len(slf.keyFile) > 0 {
if err := http.ListenAndServeTLS(slf.addr, slf.certFile, slf.keyFile, nil); err != nil {
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
}
} else {
if err := http.ListenAndServe(slf.addr, nil); err != nil { if err := http.ListenAndServe(slf.addr, nil); err != nil {
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown) slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
} }
}
}() }()
default: default:
return ErrCanNotSupportNetwork return ErrCanNotSupportNetwork