分析优化 channel 接口用时

This commit is contained in:
2025-04-01 10:51:32 +08:00
parent 47bb49ce70
commit 6d89470a89
7 changed files with 156 additions and 35 deletions

View File

@@ -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)
}

View File

@@ -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 '退款记录表';

View File

@@ -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
{

20
web/handlers/temp.go Normal file
View File

@@ -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,
})
}

View File

@@ -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)
}

View File

@@ -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))
}
}

View File

@@ -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))