提供一个测试注册代理接口
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
重新实现接口 proxy 注册与注销接口:
|
重新实现接口 proxy 注册与注销接口:
|
||||||
- 注册时向 redis ports 可用池中加入端口
|
- 注册时向 redis ports 可用池中加入端口
|
||||||
- 注销时需要同时移除可用池与租约池中的端口(需要考虑具体实现,考虑正在使用的节点归还问题)
|
- 注销时需要同时移除可用池与租约池中的端口(需要考虑具体实现,考虑正在使用的节点归还问题)
|
||||||
|
- 调整通道分配策略,提供一个 all set 和一个 free set,提取时取交集再取出,归还时取交集再归还。
|
||||||
|
|
||||||
otel 检查接口性能
|
otel 检查接口性能
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,38 @@
|
|||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
|
"net/netip"
|
||||||
|
"platform/pkg/env"
|
||||||
|
g "platform/web/globals"
|
||||||
|
s "platform/web/services"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func DebugRegisterProxyBaiYin(c *fiber.Ctx) error {
|
||||||
|
if env.RunMode != env.RunModeDev {
|
||||||
|
return fiber.ErrNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
ok, err := g.Redis.SetNX(c.Context(), "debug:channel:register:127.0.0.1", true, 0).Result()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
slog.Info("注册代理", "ok", ok)
|
||||||
|
if !ok {
|
||||||
|
return fiber.ErrConflict
|
||||||
|
}
|
||||||
|
|
||||||
|
err = s.Proxy.RegisterBaiyin("1a:2b:3c:4d:5e:6f", netip.AddrFrom4([4]byte{127, 0, 0, 1}), "test", "test")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// region 报告上线
|
// region 报告上线
|
||||||
|
|
||||||
type ProxyReportOnlineReq struct {
|
type ProxyReportOnlineReq struct {
|
||||||
@@ -123,8 +150,6 @@ func ProxyReportOnline(c *fiber.Ctx) (err error) {
|
|||||||
// })
|
// })
|
||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
|
||||||
|
|
||||||
// region 报告下线
|
// region 报告下线
|
||||||
|
|
||||||
type ProxyReportOfflineReq struct {
|
type ProxyReportOfflineReq struct {
|
||||||
@@ -168,8 +193,6 @@ func ProxyReportOffline(c *fiber.Ctx) (err error) {
|
|||||||
// return nil
|
// return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
|
||||||
|
|
||||||
// region 报告更新
|
// region 报告更新
|
||||||
|
|
||||||
type ProxyReportUpdateReq struct {
|
type ProxyReportUpdateReq struct {
|
||||||
@@ -335,8 +358,6 @@ func ProxyReportUpdate(c *fiber.Ctx) (err error) {
|
|||||||
// return nil
|
// return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
|
||||||
|
|
||||||
type ProxyPermit struct {
|
type ProxyPermit struct {
|
||||||
Id int32 `json:"id"`
|
Id int32 `json:"id"`
|
||||||
Expire time.Time `json:"expire"`
|
Expire time.Time `json:"expire"`
|
||||||
|
|||||||
@@ -76,4 +76,5 @@ func ApplyRouters(app *fiber.App) {
|
|||||||
// 临时
|
// 临时
|
||||||
debug := app.Group("/debug")
|
debug := app.Group("/debug")
|
||||||
debug.Get("/sms/:phone", handlers.DebugGetSmsCode)
|
debug.Get("/sms/:phone", handlers.DebugGetSmsCode)
|
||||||
|
debug.Get("/proxy/register", handlers.DebugRegisterProxyBaiYin)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,23 +162,18 @@ type ResourceView struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func lockChans(batch string, count int, expire time.Time) ([]netip.AddrPort, error) {
|
func lockChans(batch string, count int, expire time.Time) ([]netip.AddrPort, error) {
|
||||||
results, err := g.Redis.Eval(
|
chans, err := g.Redis.Eval(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
RedisScriptLockChans,
|
RedisScriptLockChans,
|
||||||
[]string{"channel"},
|
[]string{"channel"},
|
||||||
batch,
|
batch,
|
||||||
count,
|
count,
|
||||||
expire.Unix(),
|
expire.Unix(),
|
||||||
).Result()
|
).StringSlice()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, core.NewBizErr("获取通道失败", err)
|
return nil, core.NewBizErr("获取通道失败", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
chans, ok := results.([]string)
|
|
||||||
if !ok {
|
|
||||||
return nil, core.NewServErr("转换通道数据失败")
|
|
||||||
}
|
|
||||||
|
|
||||||
addrs := make([]netip.AddrPort, len(chans))
|
addrs := make([]netip.AddrPort, len(chans))
|
||||||
for i, ch := range chans {
|
for i, ch := range chans {
|
||||||
addr, err := netip.ParseAddrPort(ch)
|
addr, err := netip.ParseAddrPort(ch)
|
||||||
@@ -200,11 +195,11 @@ local expire = tonumber(ARGV[3])
|
|||||||
local chans_key = key .. ":chans"
|
local chans_key = key .. ":chans"
|
||||||
local lease_key = key .. ":lease:" .. batch
|
local lease_key = key .. ":lease:" .. batch
|
||||||
|
|
||||||
if redis.call("SCARD", key) < count then
|
if redis.call("SCARD", chans_key) < count then
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
local ports = redis.call("SPOP", key, count)
|
local ports = redis.call("SPOP", chans_key, count)
|
||||||
|
|
||||||
redis.call("SET", lease_key, cjson.encode({
|
redis.call("SET", lease_key, cjson.encode({
|
||||||
p = ports,
|
p = ports,
|
||||||
@@ -244,6 +239,20 @@ redis.call("DEL", lease_key)
|
|||||||
return chans
|
return chans
|
||||||
`
|
`
|
||||||
|
|
||||||
|
func registerChans(chans []netip.AddrPort) error {
|
||||||
|
strs := make([]string, len(chans))
|
||||||
|
for i, ch := range chans {
|
||||||
|
strs[i] = ch.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
err := g.Redis.SAdd(context.Background(), "channel:chans", strs).Err()
|
||||||
|
if err != nil {
|
||||||
|
return core.NewBizErr("注册通道失败", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// 错误信息
|
// 错误信息
|
||||||
var (
|
var (
|
||||||
ErrResourceNotExist = core.NewBizErr("套餐不存在")
|
ErrResourceNotExist = core.NewBizErr("套餐不存在")
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
package services
|
package services
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/netip"
|
||||||
|
"platform/pkg/u"
|
||||||
|
"platform/web/core"
|
||||||
|
"platform/web/globals/orm"
|
||||||
m "platform/web/models"
|
m "platform/web/models"
|
||||||
q "platform/web/queries"
|
q "platform/web/queries"
|
||||||
"time"
|
"time"
|
||||||
@@ -10,6 +15,7 @@ var Proxy = &proxyService{}
|
|||||||
|
|
||||||
type proxyService struct{}
|
type proxyService struct{}
|
||||||
|
|
||||||
|
// AllProxies 获取所有代理
|
||||||
func (s *proxyService) AllProxies(proxyType m.ProxyType, channels bool) ([]*m.Proxy, error) {
|
func (s *proxyService) AllProxies(proxyType m.ProxyType, channels bool) ([]*m.Proxy, error) {
|
||||||
proxies, err := q.Proxy.Where(
|
proxies, err := q.Proxy.Where(
|
||||||
q.Proxy.Type.Eq(int(proxyType)),
|
q.Proxy.Type.Eq(int(proxyType)),
|
||||||
@@ -23,3 +29,36 @@ func (s *proxyService) AllProxies(proxyType m.ProxyType, channels bool) ([]*m.Pr
|
|||||||
|
|
||||||
return proxies, nil
|
return proxies, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RegisterBaiyin 注册新代理服务
|
||||||
|
func (s *proxyService) RegisterBaiyin(Mac string, IP netip.Addr, username, password string) error {
|
||||||
|
|
||||||
|
// 添加可用通道到 redis
|
||||||
|
chans := make([]netip.AddrPort, 10000)
|
||||||
|
for i := range 10000 {
|
||||||
|
chans[i] = netip.AddrPortFrom(IP, uint16(i+10000))
|
||||||
|
}
|
||||||
|
err := registerChans(chans)
|
||||||
|
if err != nil {
|
||||||
|
return core.NewServErr("添加通道失败")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存代理信息
|
||||||
|
if err := q.Proxy.Create(&m.Proxy{
|
||||||
|
Version: 0,
|
||||||
|
Mac: Mac,
|
||||||
|
IP: orm.Inet{Addr: IP},
|
||||||
|
Secret: u.P(fmt.Sprintf("%s:%s", username, password)),
|
||||||
|
Type: m.ProxyTypeBaiYin,
|
||||||
|
Status: m.ProxyStatusOnline,
|
||||||
|
}); err != nil {
|
||||||
|
return core.NewServErr("保存通道数据失败")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnregisterBaiyin 注销代理服务
|
||||||
|
func (s *proxyService) UnregisterBaiyin(id int) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user