93 lines
2.0 KiB
Go
93 lines
2.0 KiB
Go
![]() |
package client
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"fmt"
|
|||
|
|
|||
|
"google.golang.org/grpc/credentials"
|
|||
|
"google.golang.org/grpc/grpclog"
|
|||
|
|
|||
|
"google.golang.org/grpc"
|
|||
|
)
|
|||
|
|
|||
|
// IServerCredentials IServerCredentials
|
|||
|
type IServerCredentials interface {
|
|||
|
SetIsTLS(bool)
|
|||
|
GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error)
|
|||
|
RequireTransportSecurity() bool
|
|||
|
}
|
|||
|
|
|||
|
type Server struct {
|
|||
|
Option map[string]*ServerOption
|
|||
|
}
|
|||
|
|
|||
|
// ServerEntity rpc server
|
|||
|
type ServerEntity struct {
|
|||
|
Address string // 连接地址
|
|||
|
Opts []grpc.DialOption // 配置信息
|
|||
|
}
|
|||
|
|
|||
|
type ServerOption struct {
|
|||
|
Host string
|
|||
|
Port int
|
|||
|
IsTLS bool
|
|||
|
TLSName, Pem string
|
|||
|
}
|
|||
|
|
|||
|
var (
|
|||
|
MQTTServerClient = new(ServerEntity)
|
|||
|
)
|
|||
|
|
|||
|
// InvokeHandler 调用方法
|
|||
|
type InvokeHandler func(*grpc.ClientConn) error
|
|||
|
|
|||
|
// Handle handle
|
|||
|
func (c *ServerEntity) Handle(handle InvokeHandler, auth *Auth) error {
|
|||
|
c.Opts = append(c.Opts, grpc.WithPerRPCCredentials(auth))
|
|||
|
conn, err := grpc.Dial(c.Address, c.Opts...)
|
|||
|
defer conn.Close()
|
|||
|
|
|||
|
if err != nil {
|
|||
|
grpclog.Error("GRPC Dial Ping Error:%v ", err)
|
|||
|
}
|
|||
|
return handle(conn)
|
|||
|
}
|
|||
|
|
|||
|
func (s *Server) Register(key string, serverCredentials IServerCredentials) *ServerEntity {
|
|||
|
entity := new(ServerEntity)
|
|||
|
|
|||
|
option, has := s.Option[key]
|
|||
|
|
|||
|
if !has {
|
|||
|
panic("Unknown RPCServer Setting:%v" + key)
|
|||
|
}
|
|||
|
opts := make([]grpc.DialOption, 0)
|
|||
|
|
|||
|
if option.IsTLS {
|
|||
|
creds, err := credentials.NewClientTLSFromFile(option.Pem, option.TLSName)
|
|||
|
|
|||
|
if err != nil {
|
|||
|
grpclog.Fatalf("Failed to create Centre TLS credentials %v", err)
|
|||
|
}
|
|||
|
opts = append(opts, grpc.WithTransportCredentials(creds))
|
|||
|
} else {
|
|||
|
opts = append(opts, grpc.WithInsecure())
|
|||
|
}
|
|||
|
serverCredentials.SetIsTLS(option.IsTLS)
|
|||
|
|
|||
|
opts = append(opts, grpc.WithPerRPCCredentials(serverCredentials))
|
|||
|
|
|||
|
entity.Address = fmt.Sprintf("%s:%d", option.Host, option.Port)
|
|||
|
entity.Opts = opts
|
|||
|
|
|||
|
return entity
|
|||
|
}
|
|||
|
|
|||
|
func (s *Server) Run() {
|
|||
|
MQTTServerClient = s.Register("MQTT", new(Auth))
|
|||
|
}
|
|||
|
|
|||
|
func NewServer(option map[string]*ServerOption) *Server {
|
|||
|
return &Server{Option: option}
|
|||
|
}
|