实现边缘节点下线和由转发服务维护的端口分配机制
This commit is contained in:
@@ -21,6 +21,7 @@ type RegisterEdgeReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RegisterEdgeResp struct {
|
type RegisterEdgeResp struct {
|
||||||
|
Id int32 `json:"id"`
|
||||||
Host string `json:"host"`
|
Host string `json:"host"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,10 +48,7 @@ func OnlineEdge(c *fiber.Ctx) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 保存节点信息
|
// 保存节点信息
|
||||||
err = q.Edge.Clauses(clause.OnConflict{
|
var edge = &m.Edge{
|
||||||
UpdateAll: true,
|
|
||||||
Columns: []clause.Column{{Name: "name"}},
|
|
||||||
}).Create(&m.Edge{
|
|
||||||
Name: req.Name,
|
Name: req.Name,
|
||||||
Version: int32(req.Version),
|
Version: int32(req.Version),
|
||||||
Host: c.Context().RemoteIP().String(),
|
Host: c.Context().RemoteIP().String(),
|
||||||
@@ -60,13 +58,41 @@ func OnlineEdge(c *fiber.Ctx) (err error) {
|
|||||||
ProxyID: fwd.ID,
|
ProxyID: fwd.ID,
|
||||||
Type: int32(edge2.TypeSelfHosted),
|
Type: int32(edge2.TypeSelfHosted),
|
||||||
Status: 1,
|
Status: 1,
|
||||||
})
|
}
|
||||||
|
err = q.Edge.Clauses(clause.OnConflict{
|
||||||
|
UpdateAll: true,
|
||||||
|
Columns: []clause.Column{{Name: "name"}},
|
||||||
|
}).Create(edge)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 返回服务地址
|
// 返回服务地址
|
||||||
return c.JSON(RegisterEdgeResp{
|
return c.JSON(RegisterEdgeResp{
|
||||||
|
Id: edge.ID,
|
||||||
Host: fwd.Host,
|
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)
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ type OnlineProxyReq struct {
|
|||||||
Version int `json:"version" validate:"required"`
|
Version int `json:"version" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OnlineProxyResp struct {
|
||||||
|
Id int32 `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
func OnlineProxy(c *fiber.Ctx) (err error) {
|
func OnlineProxy(c *fiber.Ctx) (err error) {
|
||||||
|
|
||||||
// 检查接口权限
|
// 检查接口权限
|
||||||
@@ -38,7 +42,13 @@ func OnlineProxy(c *fiber.Ctx) (err error) {
|
|||||||
|
|
||||||
// 创建代理
|
// 创建代理
|
||||||
ip := c.Context().RemoteIP()
|
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.
|
err = q.Proxy.
|
||||||
Clauses(clause.OnConflict{
|
Clauses(clause.OnConflict{
|
||||||
UpdateAll: true,
|
UpdateAll: true,
|
||||||
@@ -46,18 +56,15 @@ func OnlineProxy(c *fiber.Ctx) (err error) {
|
|||||||
{Name: q.Proxy.Name.ColumnName().String()},
|
{Name: q.Proxy.Name.ColumnName().String()},
|
||||||
},
|
},
|
||||||
}).
|
}).
|
||||||
Create(&m.Proxy{
|
Create(proxy)
|
||||||
Name: req.Name,
|
|
||||||
Version: int32(req.Version),
|
|
||||||
Host: ip.String(),
|
|
||||||
Type: int32(proxy2.TypeSelfHosted),
|
|
||||||
Status: 1,
|
|
||||||
})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
slog.Debug("注册转发服务", "ip", ip, "id", proxy.ID)
|
||||||
|
return c.JSON(&OnlineProxyResp{
|
||||||
|
Id: proxy.ID,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
@@ -96,3 +103,43 @@ func OfflineProxy(c *fiber.Ctx) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
// 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
|
||||||
|
|||||||
@@ -67,10 +67,12 @@ func ApplyRouters(app *fiber.App) {
|
|||||||
proxy := api.Group("/proxy")
|
proxy := api.Group("/proxy")
|
||||||
proxy.Post("/online", handlers.OnlineProxy)
|
proxy.Post("/online", handlers.OnlineProxy)
|
||||||
proxy.Post("/offline", handlers.OfflineProxy)
|
proxy.Post("/offline", handlers.OfflineProxy)
|
||||||
|
proxy.Post("/assign", handlers.AssignProxyFwdPort)
|
||||||
|
|
||||||
// 节点
|
// 节点
|
||||||
edge := api.Group("/edge")
|
edge := api.Group("/edge")
|
||||||
edge.Post("/online", handlers.OnlineEdge)
|
edge.Post("/online", handlers.OnlineEdge)
|
||||||
|
edge.Post("/offline", handlers.OfflineEdge)
|
||||||
|
|
||||||
// 临时
|
// 临时
|
||||||
app.Get("/test", func(c *fiber.Ctx) error {
|
app.Get("/test", func(c *fiber.Ctx) error {
|
||||||
|
|||||||
Reference in New Issue
Block a user