实现边缘节点下线和由转发服务维护的端口分配机制

This commit is contained in:
2025-05-14 17:45:14 +08:00
parent 2be449e1a7
commit 661616dfc3
3 changed files with 89 additions and 14 deletions

View File

@@ -21,6 +21,7 @@ type RegisterEdgeReq struct {
}
type RegisterEdgeResp struct {
Id int32 `json:"id"`
Host string `json:"host"`
}
@@ -47,10 +48,7 @@ func OnlineEdge(c *fiber.Ctx) (err error) {
}
// 保存节点信息
err = q.Edge.Clauses(clause.OnConflict{
UpdateAll: true,
Columns: []clause.Column{{Name: "name"}},
}).Create(&m.Edge{
var edge = &m.Edge{
Name: req.Name,
Version: int32(req.Version),
Host: c.Context().RemoteIP().String(),
@@ -60,13 +58,41 @@ func OnlineEdge(c *fiber.Ctx) (err error) {
ProxyID: fwd.ID,
Type: int32(edge2.TypeSelfHosted),
Status: 1,
})
}
err = q.Edge.Clauses(clause.OnConflict{
UpdateAll: true,
Columns: []clause.Column{{Name: "name"}},
}).Create(edge)
if err != nil {
return err
}
// 返回服务地址
return c.JSON(RegisterEdgeResp{
Id: edge.ID,
Host: fwd.Host,
})
}
type OfflineEdgeReq struct {
Name string `json:"name" validate:"required"`
}
func OfflineEdge(c *fiber.Ctx) (err error) {
// 验证请求参数
var req = new(OfflineEdgeReq)
err = g.Validator.Validate(c, req)
if err != nil {
return err
}
// 下线转发服务
_, err = q.Edge.
Where(q.Edge.Name.Eq(req.Name)).
UpdateSimple(q.Edge.Status.Value(0))
if err != nil {
return err
}
return c.SendStatus(fiber.StatusOK)
}

View File

@@ -19,6 +19,10 @@ type OnlineProxyReq struct {
Version int `json:"version" validate:"required"`
}
type OnlineProxyResp struct {
Id int32 `json:"id"`
}
func OnlineProxy(c *fiber.Ctx) (err error) {
// 检查接口权限
@@ -38,7 +42,13 @@ func OnlineProxy(c *fiber.Ctx) (err error) {
// 创建代理
ip := c.Context().RemoteIP()
slog.Debug("注册转发服务", "ip", ip)
var proxy = &m.Proxy{
Name: req.Name,
Version: int32(req.Version),
Host: ip.String(),
Type: int32(proxy2.TypeSelfHosted),
Status: 1,
}
err = q.Proxy.
Clauses(clause.OnConflict{
UpdateAll: true,
@@ -46,18 +56,15 @@ func OnlineProxy(c *fiber.Ctx) (err error) {
{Name: q.Proxy.Name.ColumnName().String()},
},
}).
Create(&m.Proxy{
Name: req.Name,
Version: int32(req.Version),
Host: ip.String(),
Type: int32(proxy2.TypeSelfHosted),
Status: 1,
})
Create(proxy)
if err != nil {
return err
}
return nil
slog.Debug("注册转发服务", "ip", ip, "id", proxy.ID)
return c.JSON(&OnlineProxyResp{
Id: proxy.ID,
})
}
// endregion
@@ -96,3 +103,43 @@ func OfflineProxy(c *fiber.Ctx) (err error) {
}
// endregion
// region AssignProxyFwdPort
type AssignProxyFwdPortReq struct {
Proxy int32 `json:"proxy" validate:"required"`
Edge int32 `json:"edge" validate:"required"`
Port uint16 `json:"port" validate:"required"`
}
func AssignProxyFwdPort(c *fiber.Ctx) (err error) {
// 检查接口权限
_, err = auth2.NewProtect(c).Payload(
auth2.PayloadInternalServer,
).Do()
if err != nil {
return err
}
// 验证请求参数
var req = new(AssignProxyFwdPortReq)
err = g.Validator.Validate(c, req)
if err != nil {
return err
}
// 更新边缘节点端口分配状态
_, err = q.Edge.
Where(q.Edge.ID.Eq(req.Edge)).
UpdateSimple(
q.Edge.ProxyID.Value(req.Proxy),
q.Edge.ProxyPort.Value(int32(req.Port)),
)
if err != nil {
return err
}
return nil
}
// endregion

View File

@@ -67,10 +67,12 @@ func ApplyRouters(app *fiber.App) {
proxy := api.Group("/proxy")
proxy.Post("/online", handlers.OnlineProxy)
proxy.Post("/offline", handlers.OfflineProxy)
proxy.Post("/assign", handlers.AssignProxyFwdPort)
// 节点
edge := api.Group("/edge")
edge.Post("/online", handlers.OnlineEdge)
edge.Post("/offline", handlers.OfflineEdge)
// 临时
app.Get("/test", func(c *fiber.Ctx) error {