You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.2 KiB
77 lines
2.2 KiB
package logic |
|
|
|
import ( |
|
"context" |
|
"errors" |
|
"fmt" |
|
"google.golang.org/grpc" |
|
"net" |
|
"sonet/api/gen/postal" |
|
"sonet/pkg/utils/logger" |
|
) |
|
|
|
// PostalClusterPortOffset 相对与 postal grpc server 接口偏移量 |
|
const PostalClusterPortOffset = 1000 |
|
|
|
// PostalAddr2Cluster 根据 postal server 地址得到 postal cluster server 地址 |
|
func PostalAddr2Cluster(postalServerAddr string) (string, error) { |
|
addr, err := net.ResolveTCPAddr("tcp", postalServerAddr) |
|
if err != nil { |
|
return "", err |
|
} |
|
if addr.IP == nil { |
|
return fmt.Sprintf(":%d", addr.Port+PostalClusterPortOffset), nil |
|
} |
|
return fmt.Sprintf("%s:%d", addr.IP.String(), addr.Port+PostalClusterPortOffset), nil |
|
} |
|
|
|
var ( |
|
methodRedirectDeliver int32 = 10 |
|
methodRedirectDeliverBatch int32 = 11 |
|
methodRedirectDeliverGroup int32 = 12 |
|
) |
|
|
|
// PostalClusterServer 用于postal server集群间, 消息转发通信 |
|
type PostalClusterServer struct { |
|
postal.UnimplementedPostalClusterServer |
|
postalServer postal.PostalServer // 当前节点 postal server |
|
} |
|
|
|
func NewPostalClusterServer(postalServer postal.PostalServer) *PostalClusterServer { |
|
return &PostalClusterServer{ |
|
postalServer: postalServer, |
|
} |
|
} |
|
|
|
// Run 运行在同进程 postalServer 端口+1000 |
|
func (s *PostalClusterServer) Run(postalAddr string, opts ...grpc.ServerOption) (err error) { |
|
server := grpc.NewServer(opts...) |
|
postal.RegisterPostalClusterServer(server, s) |
|
// 解析端口 |
|
address, err := PostalAddr2Cluster(postalAddr) |
|
if err != nil { |
|
return |
|
} |
|
listen, err := net.Listen("tcp", address) |
|
if err != nil { |
|
return |
|
} |
|
|
|
// run serve |
|
logger.Infof("%s grpc server running %s\n", postal.PostalCluster_ServiceDesc.ServiceName, listen.Addr().String()) |
|
err = server.Serve(listen) |
|
return |
|
} |
|
|
|
func (s *PostalClusterServer) Redirect(ctx context.Context, req *postal.ReqRedirect) (*postal.ResDeliver, error) { |
|
req.Ttl -= 1 |
|
switch req.RedirectMethod { |
|
case methodRedirectDeliver: |
|
return s.postalServer.Deliver(ctx, req.Deliver) |
|
case methodRedirectDeliverBatch: |
|
return s.postalServer.DeliverBatch(ctx, req.DeliverBatch) |
|
case methodRedirectDeliverGroup: |
|
return s.postalServer.DeliverGroup(ctx, req.DeliverGroup) |
|
} |
|
return nil, errors.New(fmt.Sprintf("not found redirect type %d", req.RedirectMethod)) |
|
}
|
|
|