From 6d89470a8954f131dea27c2e9a0a02937fa0789f Mon Sep 17 00:00:00 2001 From: luorijun Date: Tue, 1 Apr 2025 10:51:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E6=9E=90=E4=BC=98=E5=8C=96=20channel?= =?UTF-8?q?=20=E6=8E=A5=E5=8F=A3=E7=94=A8=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/playground/main.go | 8 +-- scripts/sql/init.sql | 22 +++++++ test/test-api.http | 4 +- web/handlers/temp.go | 20 +++++++ web/router.go | 2 + web/services/channel.go | 128 ++++++++++++++++++++++++++++++++-------- web/web.go | 7 ++- 7 files changed, 156 insertions(+), 35 deletions(-) create mode 100644 web/handlers/temp.go diff --git a/cmd/playground/main.go b/cmd/playground/main.go index 7e6261c..1795d8c 100644 --- a/cmd/playground/main.go +++ b/cmd/playground/main.go @@ -1,11 +1,5 @@ package main -import "math" - -var b62Set = make(map[string]struct{}) -var b64Set = make(map[string]struct{}) - func main() { - println(int(math.Ceil(100 * 1.1))) - println(int(math.Ceil(float64(100) * 1.1))) + println(float64(166) * 11 / 10) } diff --git a/scripts/sql/init.sql b/scripts/sql/init.sql index e8f3d99..013b1d8 100644 --- a/scripts/sql/init.sql +++ b/scripts/sql/init.sql @@ -40,6 +40,7 @@ create table admin ( deleted_at timestamp ); create index admin_status_index on admin (status); +create index admin_deleted_at_index on admin (deleted_at); -- admin表字段注释 comment on table admin is '管理员表'; @@ -70,6 +71,7 @@ create table admin_role ( updated_at timestamp default current_timestamp, deleted_at timestamp ); +create index admin_role_deleted_at_index on admin_role (deleted_at); -- admin_role表字段注释 comment on table admin_role is '管理员角色关联表'; @@ -119,6 +121,7 @@ create index user_admin_id_index on "user" (admin_id); create index user_username_index on "user" (username); create index user_email_index on "user" (email); create index user_status_index on "user" (status); +create index user_deleted_at_index on "user" (deleted_at); -- user表字段注释 comment on table "user" is '用户表'; @@ -155,6 +158,7 @@ create table user_role ( updated_at timestamp default current_timestamp, deleted_at timestamp ); +create index user_role_deleted_at_index on user_role (deleted_at); -- user_role表字段注释 comment on table user_role is '用户角色表'; @@ -194,6 +198,7 @@ create table client ( create index client_client_id_index on client (client_id); create index client_name_index on client (name); create index client_status_index on client (status); +create index client_deleted_at_index on client (deleted_at); -- client表字段注释 comment on table client is '客户端表'; @@ -233,6 +238,7 @@ create table permission ( ); create index permission_parent_id_index on permission (parent_id); create index permission_name_index on permission (name); +create index permission_deleted_at_index on permission (deleted_at); -- permission表字段注释 comment on table permission is '权限表'; @@ -260,6 +266,7 @@ create table user_role_link ( ); create index user_role_link_user_id_index on user_role_link (user_id); create index user_role_link_role_id_index on user_role_link (role_id); +create index user_role_link_deleted_at_index on user_role_link (deleted_at); -- user_role_link表字段注释 comment on table user_role_link is '用户角色关联表'; @@ -286,6 +293,7 @@ create table admin_role_link ( ); create index admin_role_link_admin_id_index on admin_role_link (admin_id); create index admin_role_link_role_id_index on admin_role_link (role_id); +create index admin_role_link_deleted_at_index on admin_role_link (deleted_at); -- admin_role_link表字段注释 comment on table admin_role_link is '管理员角色关联表'; @@ -312,6 +320,7 @@ create table user_role_permission_link ( ); create index user_role_permission_link_role_id_index on user_role_permission_link (role_id); create index user_role_permission_link_permission_id_index on user_role_permission_link (permission_id); +create index user_role_permission_link_deleted_at_index on user_role_permission_link (deleted_at); -- user_role_permission_link表字段注释 comment on table user_role_permission_link is '用户角色权限关联表'; @@ -338,6 +347,7 @@ create table admin_role_permission_link ( ); create index admin_role_permission_link_role_id_index on admin_role_permission_link (role_id); create index admin_role_permission_link_permission_id_index on admin_role_permission_link (permission_id); +create index admin_role_permission_link_deleted_at_index on admin_role_permission_link (deleted_at); -- admin_role_permission_link表字段注释 comment on table admin_role_permission_link is '管理员角色权限关联表'; @@ -364,6 +374,7 @@ create table client_permission_link ( ); create index client_permission_link_client_id_index on client_permission_link (client_id); create index client_permission_link_permission_id_index on client_permission_link (permission_id); +create index client_permission_link_deleted_at_index on client_permission_link (deleted_at); -- client_permission_link表字段注释 comment on table client_permission_link is '客户端权限关联表'; @@ -395,6 +406,7 @@ create table proxy ( ); create index proxy_name_index on proxy (name); create index proxy_host_index on proxy (host); +create index proxy_deleted_at_index on proxy (deleted_at); -- proxy表字段注释 comment on table proxy is '代理服务表'; @@ -433,6 +445,7 @@ create index node_isp_index on node (isp); create index node_prov_index on node (prov); create index node_city_index on node (city); create index node_proxy_id_index on node (proxy_id); +create index node_deleted_at_index on node (deleted_at); -- node表字段注释 comment on table node is '节点表'; @@ -466,6 +479,7 @@ create table whitelist ( ); create index whitelist_user_id_index on whitelist (user_id); create index whitelist_host_index on whitelist (host); +create index whitelist_deleted_at_index on whitelist (deleted_at); -- whitelist表字段注释 comment on table whitelist is '白名单表'; @@ -549,6 +563,7 @@ create table product ( updated_at timestamp default current_timestamp, deleted_at timestamp ); +create index product_deleted_at_index on product (deleted_at); -- product表字段注释 comment on table product is '产品表'; @@ -576,6 +591,7 @@ create table resource ( ); create index resource_user_id_index on resource (user_id); create index resource_active_index on resource (active); +create index resource_deleted_at_index on resource (deleted_at); -- resource表字段注释 comment on table resource is '套餐表'; @@ -606,6 +622,7 @@ create table resource_pss ( deleted_at timestamp ); create index resource_pss_resource_id_index on resource_pss (resource_id); +create index resource_pss_deleted_at_index on resource_pss (deleted_at); -- resource_pss表字段注释 comment on table resource_pss is '动态代理套餐表'; @@ -639,6 +656,7 @@ create table resource_psr ( deleted_at timestamp ); create index resource_psr_resource_id_index on resource_psr (resource_id); +create index resource_psr_deleted_at_index on resource_psr (deleted_at); -- resource_psr表字段注释 comment on table resource_psr is '隧道代理套餐表'; @@ -664,6 +682,7 @@ create table resource_pps ( deleted_at timestamp ); create index resource_pps_resource_id_index on resource_pps (resource_id); +create index resource_pps_deleted_at_index on resource_pps (deleted_at); -- resource_pps表字段注释 comment on table resource_pps is '独享代理套餐表'; @@ -700,6 +719,7 @@ create table trade ( ); create index trade_user_id_index on trade (user_id); create index trade_status_index on trade (status); +create index trade_deleted_at_index on trade (deleted_at); -- trade表字段注释 comment on table trade is '订单表'; @@ -741,6 +761,7 @@ create table bill ( ); create index bill_order_id_index on bill (order_id); create index bill_product_id_index on bill (product_id); +create index bill_deleted_at_index on bill (deleted_at); -- bill表字段注释 comment on table bill is '账单表'; @@ -774,6 +795,7 @@ create table refund ( ); create index refund_order_id_index on refund (order_id); create index refund_product_id_index on refund (product_id); +create index refund_deleted_at_index on refund (deleted_at); -- refund表字段注释 comment on table refund is '退款记录表'; diff --git a/test/test-api.http b/test/test-api.http index 0b3ba84..2e4562b 100644 --- a/test/test-api.http +++ b/test/test-api.http @@ -3,7 +3,7 @@ GET http://110.40.82.250:18702/server/index/getToken/key/juipbyjdapiverify ### remote 配置信息 GET http://103.139.212.110:9989/api/auto_query -token: et1wWdrLLRsiQPCar8GunNFEZqcxATFa.anVpcA==.MTc0MzM0MjAwMQ== +token: yzfO0vSEnbOL9fkmd4bgKiEuYw5Kjlfb.anVpcA==.MTc0MzQyOTAwMQ== ### remote 配置连接 POST http://103.139.212.110:9989/api/connect @@ -21,7 +21,7 @@ Content-Type: application/json ### remote 下线全部 POST http://103.139.212.110:9989/api/disconnect -token: et1wWdrLLRsiQPCar8GunNFEZqcxATFa.anVpcA==.MTc0MzM0MjAwMQ== +token: yzfO0vSEnbOL9fkmd4bgKiEuYw5Kjlfb.anVpcA==.MTc0MzQyOTAwMQ== Content-Type: application/json { diff --git a/web/handlers/temp.go b/web/handlers/temp.go new file mode 100644 index 0000000..07ca541 --- /dev/null +++ b/web/handlers/temp.go @@ -0,0 +1,20 @@ +package handlers + +import ( + "platform/pkg/rds" + + "github.com/gofiber/fiber/v2" +) + +func Temp(c *fiber.Ctx) error { + + id := c.Query("id") + result, err := rds.Client.Get(c.Context(), "channel:"+id).Result() + if err != nil { + return err + } + + return c.JSON(fiber.Map{ + "result": result, + }) +} diff --git a/web/router.go b/web/router.go index 3d9d7c9..1bb923b 100644 --- a/web/router.go +++ b/web/router.go @@ -19,4 +19,6 @@ func ApplyRouters(app *fiber.App) { channel := api.Group("/channel") channel.Post("/create", PermitAll(), handlers.CreateChannel) channel.Post("/remove", PermitAll(), handlers.RemoveChannels) + + app.Get("/temp", handlers.Temp) } diff --git a/web/services/channel.go b/web/services/channel.go index 3cdcdb6..0d9bc4a 100644 --- a/web/services/channel.go +++ b/web/services/channel.go @@ -19,6 +19,7 @@ import ( "strings" "time" + "github.com/gofiber/fiber/v2/middleware/requestid" "github.com/google/uuid" "github.com/jxskiss/base62" "github.com/redis/go-redis/v9" @@ -62,8 +63,11 @@ type ResourceInfo struct { // region RemoveChannel func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, id ...int32) error { - // 删除通道 + var step = time.Now() + var rid = ctx.Value(requestid.ConfigDefault.ContextKey).(string) + err := q.Q.Transaction(func(tx *q.Query) error { + // 查找通道 channels, err := tx.Channel.Where( q.Channel.ID.In(id...), @@ -72,6 +76,8 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, return err } + slog.Debug("查找通道", "rid", rid, "step", time.Since(step)) + // 检查权限,如果为用户操作的话,则只能删除自己的通道 for _, channel := range channels { if auth.Payload.Type == PayloadUser && auth.Payload.Id != channel.UserID { @@ -80,6 +86,8 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, } // 查找代理 + step = time.Now() + proxySet := make(map[int32]struct{}) proxyIds := make([]int32, 0) for _, channel := range channels { @@ -92,6 +100,8 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, q.Proxy.ID.In(proxyIds...), ).Find() + slog.Debug("查找代理", "rid", rid, "step", time.Since(step)) + // 删除指定的通道 result, err := tx.Channel. Where(q.Channel.ID.In(id...)). @@ -104,13 +114,20 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, } // 删除缓存,异步任务直接在消费端处理删除 + step = time.Now() + err = deleteCache(ctx, channels) if err != nil { return err } + slog.Debug("删除缓存", "rid", rid, "step", time.Since(step)) + // 禁用代理端口并下线用过的节点 if env.DebugExternalChange { + step = time.Now() + + // 组织数据 var configMap = make(map[int32][]remote.PortConfigsReq, len(proxies)) var proxyMap = make(map[int32]*models.Proxy, len(proxies)) for _, proxy := range proxies { @@ -133,6 +150,9 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, portMap[key] = struct{}{} } + slog.Debug("组织数据", "rid", rid, "step", time.Since(step)) + + // 更新配置 for proxyId, configs := range configMap { if len(configs) == 0 { continue @@ -149,19 +169,29 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, secret[1], ) - // 查询配置的节点 + // 查询节点配置 + step = time.Now() + actives, err := gateway.GatewayPortActive() if err != nil { return err } - // 取消配置 + slog.Debug("查询节点配置", "rid", rid, "step", time.Since(step)) + + // 更新节点配置 + step = time.Now() + err = gateway.GatewayPortConfigs(configs) if err != nil { return err } + slog.Debug("更新节点配置", "rid", rid, "step", time.Since(step)) + // 下线对应节点 + step = time.Now() + var edges []string for portStr, active := range actives { port, err := strconv.Atoi(portStr) @@ -182,6 +212,8 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, return err } } + + slog.Debug("下线对应节点", "rid", rid, "step", time.Since(step)) } } @@ -208,6 +240,8 @@ func (s *channelService) CreateChannel( count int, nodeFilter ...NodeFilterConfig, ) ([]string, error) { + var step = time.Now() + var rid = ctx.Value(requestid.ConfigDefault.ContextKey).(string) filter := NodeFilterConfig{} if len(nodeFilter) > 0 { @@ -218,6 +252,8 @@ func (s *channelService) CreateChannel( err := q.Q.Transaction(func(tx *q.Query) error { // 查找套餐 + step = time.Now() + var resource = new(ResourceInfo) data := q.Resource.As("data") pss := q.ResourcePss.As("pss") @@ -236,6 +272,8 @@ func (s *channelService) CreateChannel( return err } + slog.Debug("查找套餐", "rid", rid, "step", time.Since(step)) + // 检查用户权限 err = checkUser(auth, resource, count) if err != nil { @@ -243,12 +281,18 @@ func (s *channelService) CreateChannel( } // 申请节点 + step = time.Now() + edgeAssigns, err := assignEdge(count, filter) if err != nil { return err } + slog.Debug("申请节点", "rid", rid, "total", time.Since(step)) + // 分配端口 + step = time.Now() + now := time.Now() expiration := now.Add(time.Duration(resource.Live) * time.Second) _addr, channels, err := assignPort(edgeAssigns, auth.Payload.Id, protocol, authType, expiration, filter) @@ -257,7 +301,11 @@ func (s *channelService) CreateChannel( } addr = _addr + slog.Debug("分配端口", "rid", rid, "total", time.Since(step)) + // 更新套餐使用记录 + step = time.Now() + _, err = q.ResourcePss. Where(q.ResourcePss.ResourceID.Eq(resourceId)). Select( @@ -274,12 +322,18 @@ func (s *channelService) CreateChannel( return err } + slog.Debug("更新套餐使用记录", "rid", rid, "step", time.Since(step)) + // 缓存通道数据 + step = time.Now() + err = cache(ctx, channels) if err != nil { return err } + slog.Debug("缓存通道数据", "rid", rid, "step", time.Since(step)) + return nil }) if err != nil { @@ -327,6 +381,8 @@ func checkUser(auth *AuthContext, resource *ResourceInfo, count int) error { func assignEdge(count int, filter NodeFilterConfig) (*AssignEdgeResult, error) { // 查询可以使用的网关 + var step = time.Now() + proxies, err := q.Proxy. Where(q.Proxy.Type.Eq(1)). Find() @@ -334,13 +390,21 @@ func assignEdge(count int, filter NodeFilterConfig) (*AssignEdgeResult, error) { return nil, err } + slog.Debug("查找网关", "step", time.Since(step)) + // 查询已配置的节点 + step = time.Now() + rProxyConfigs, err := remote.Client.CloudAutoQuery() if err != nil { return nil, err } + slog.Debug("查询已配置节点 (remote)", "step", time.Since(step)) + // 查询已使用的节点 + step = time.Now() + var proxyIds = make([]int32, len(proxies)) for i, proxy := range proxies { proxyIds[i] = proxy.ID @@ -364,6 +428,8 @@ func assignEdge(count int, filter NodeFilterConfig) (*AssignEdgeResult, error) { proxyUses[channel.ProxyID]++ } + slog.Debug("查找已使用节点", "step", time.Since(step)) + // 组织数据 var infos = make([]*ProxyInfo, len(proxies)) for i, proxy := range proxies { @@ -397,6 +463,8 @@ func assignEdge(count int, filter NodeFilterConfig) (*AssignEdgeResult, error) { needed -= info.used if env.DebugExternalChange && info.used > info.count { + step = time.Now() + slog.Debug("新增新节点", "proxy", info.proxy.Name, "used", info.used, "count", info.count) err := remote.Client.CloudConnect(remote.CloudConnectReq{ Uuid: info.proxy.Name, @@ -405,12 +473,14 @@ func assignEdge(count int, filter NodeFilterConfig) (*AssignEdgeResult, error) { Province: filter.Prov, City: filter.City, Isp: filter.Isp, - Count: int(math.Ceil(float64(info.used) * 1.1)), + Count: int(math.Ceil(float64(info.used) * 11 / 10)), }}, }) if err != nil { return nil, err } + + slog.Debug("分配新增的节点", "step", time.Since(step)) } configs[i] = &ProxyConfig{ @@ -450,36 +520,44 @@ func assignPort( expiration time.Time, filter NodeFilterConfig, ) ([]string, []*models.Channel, error) { - var assigns = proxies.configs + var step = time.Now() + + var configs = proxies.configs var exists = proxies.channels - // 查询代理已配置端口 - var proxyIds = make([]int32, 0, len(assigns)) - for _, assigned := range assigns { - proxyIds = append(proxyIds, assigned.proxy.ID) - } - // 端口查找表 - var proxyPorts = make(map[uint64]struct{}) + var portsMap = make(map[uint64]struct{}) for _, channel := range exists { key := uint64(channel.ProxyID)<<32 | uint64(channel.ProxyPort) - proxyPorts[key] = struct{}{} + portsMap[key] = struct{}{} + } + + // 查找用户白名单 + var whitelist []string + if authType == ChannelAuthTypeIp { + err := q.Whitelist. + Where(q.Whitelist.UserID.Eq(userId)). + Select(q.Whitelist.Host). + Scan(&whitelist) + if err != nil { + return nil, nil, err + } } // 配置启用代理 var result []string var channels []*models.Channel - for _, assign := range assigns { + for _, config := range configs { var err error - var proxy = assign.proxy - var count = assign.count + var proxy = config.proxy + var count = config.count // 筛选可用端口 var configs = make([]remote.PortConfigsReq, 0, count) for port := 10000; port < 20000 && len(configs) < count; port++ { // 跳过存在的端口 key := uint64(proxy.ID)<<32 | uint64(port) - _, ok := proxyPorts[key] + _, ok := portsMap[key] if ok { continue } @@ -500,14 +578,6 @@ func assignPort( switch authType { case ChannelAuthTypeIp: - var whitelist []string - err := q.Whitelist. - Where(q.Whitelist.UserID.Eq(userId)). - Select(q.Whitelist.Host). - Scan(&whitelist) - if err != nil { - return nil, nil, err - } configs[i].Whitelist = &whitelist configs[i].Userpass = v.P("") for _, item := range whitelist { @@ -547,6 +617,8 @@ func assignPort( } // 保存到数据库 + step = time.Now() + err = q.Channel. Omit( q.Channel.NodeID, @@ -560,8 +632,12 @@ func assignPort( return nil, nil, err } + slog.Debug("保存到数据库", "step", time.Since(step)) + // 提交端口配置并更新节点列表 if env.DebugExternalChange { + step = time.Now() + var secret = strings.Split(proxy.Secret, ":") gateway := remote.InitGateway( proxy.Host, @@ -572,6 +648,8 @@ func assignPort( if err != nil { return nil, nil, err } + + slog.Debug("提交端口配置", "step", time.Since(step)) } } diff --git a/web/web.go b/web/web.go index a0ec864..a4c31e2 100644 --- a/web/web.go +++ b/web/web.go @@ -3,6 +3,7 @@ package web import ( "net/http" "platform/pkg/env" + "runtime" "log/slog" @@ -39,12 +40,16 @@ func (s *Server) Run() error { ErrorHandler: ErrorHandler, }) + s.fiber.Use(logger.New(logger.Config{ + DisableColors: false, + })) s.fiber.Use(requestid.New()) - s.fiber.Use(logger.New()) ApplyRouters(s.fiber) + // pprof go func() { + runtime.SetBlockProfileRate(1) err := http.ListenAndServe(":6060", nil) if err != nil { slog.Error("pprof 服务错误", slog.Any("err", err))