feat: 添加基于Consul的RPC客户端和服务端
This commit is contained in:
93
rpc/server.go
Normal file
93
rpc/server.go
Normal file
@@ -0,0 +1,93 @@
|
||||
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")
|
||||
}
|
||||
Reference in New Issue
Block a user