94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
package rpc
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/rpcxio/rpcx-consul/serverplugin"
|
|
"github.com/smallnest/rpcx/server"
|
|
)
|
|
|
|
var rpcServer *server.Server
|
|
|
|
// Serve 启动RPC服务
|
|
func Serve(ctx context.Context, service interface{}) error {
|
|
// 获取本机IP
|
|
ip, err := getLocalIP()
|
|
if err != nil {
|
|
return fmt.Errorf("获取IP失败: %w", err)
|
|
}
|
|
|
|
// 解析端口
|
|
addrConfig := g.Cfg().MustGet(ctx, "server.address").String()
|
|
portStr := strings.TrimPrefix(addrConfig, ":")
|
|
port, err := strconv.Atoi(portStr)
|
|
if err != nil {
|
|
return errors.New("端口解析失败")
|
|
}
|
|
serviceAddr := fmt.Sprintf("%s:%d", ip, port)
|
|
|
|
// 创建服务端
|
|
rpcServer = server.NewServer()
|
|
|
|
// 添加 Consul 注册插件
|
|
consulAddr := g.Cfg().MustGet(ctx, "consul.address").String()
|
|
if consulAddr != "" {
|
|
plugin := &serverplugin.ConsulRegisterPlugin{
|
|
ServiceAddress: "tcp@" + serviceAddr,
|
|
ConsulServers: []string{consulAddr},
|
|
BasePath: "rpcx",
|
|
UpdateInterval: time.Minute,
|
|
}
|
|
if err := plugin.Start(); err != nil {
|
|
return err
|
|
}
|
|
rpcServer.Plugins.Add(plugin)
|
|
g.Log().Infof(ctx, "Consul注册成功: %s", serviceAddr)
|
|
}
|
|
|
|
// 注册服务
|
|
err = rpcServer.Register(service, "")
|
|
if err != nil {
|
|
g.Log().Errorf(ctx, "注册服务失败: %v", err)
|
|
return nil
|
|
}
|
|
// 优雅关闭
|
|
//gproc.AddShutdownFunc(func(ctx context.Context) {
|
|
// if rpcServer != nil {
|
|
// _ = rpcServer.Shutdown(ctx)
|
|
// }
|
|
//})
|
|
|
|
// 异步启动
|
|
go func() {
|
|
g.Log().Infof(ctx, "RPC服务启动: %s", serviceAddr)
|
|
if err := rpcServer.Serve("tcp", serviceAddr); err != nil {
|
|
g.Log().Fatalf(ctx, "RPC服务启动失败: %v", err)
|
|
}
|
|
}()
|
|
|
|
return nil
|
|
}
|
|
|
|
func getLocalIP() (string, error) {
|
|
addrs, err := net.InterfaceAddrs()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
for _, addr := range addrs {
|
|
if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
|
|
if ipNet.IP.To4() != nil {
|
|
return ipNet.IP.String(), nil
|
|
}
|
|
}
|
|
}
|
|
return "", fmt.Errorf("未找到本机IP")
|
|
}
|