完善资源关闭逻辑,添加数据库和Redis连接的退出处理
This commit is contained in:
27
README.md
27
README.md
@@ -10,7 +10,8 @@
|
|||||||
- [ ] 实名认证
|
- [ ] 实名认证
|
||||||
- [ ] 充值余额
|
- [ ] 充值余额
|
||||||
- [ ] 选择套餐
|
- [ ] 选择套餐
|
||||||
- [ ] 提取 IP
|
- [X] 提取 IP
|
||||||
|
- [ ] 长效提取
|
||||||
- [ ] 连接
|
- [ ] 连接
|
||||||
|
|
||||||
中间件:
|
中间件:
|
||||||
@@ -19,18 +20,17 @@
|
|||||||
- [ ] Limiter
|
- [ ] Limiter
|
||||||
- [ ] Compress
|
- [ ] Compress
|
||||||
|
|
||||||
channel 数据存入顺序,数据库 > 缓存 > 外部接口
|
channel 优化:
|
||||||
|
- 重新梳理逻辑流程,简化循环
|
||||||
|
- 端口分配时加锁
|
||||||
|
- 数据存入顺序,数据库 > 缓存 > 外部接口
|
||||||
|
|
||||||
remote 令牌问题
|
remote 令牌问题
|
||||||
|
|
||||||
用对称加密处理密钥
|
用对称加密处理密钥
|
||||||
|
|
||||||
现在的节点分配逻辑是,每个 user_host:node_port 组算一个分配数,考虑是否改成每个用户算一个分配数
|
|
||||||
|
|
||||||
考虑将鉴权逻辑放到 handler 里,统一动静态鉴权以及解耦服务层
|
考虑将鉴权逻辑放到 handler 里,统一动静态鉴权以及解耦服务层
|
||||||
|
|
||||||
有些地方在用手动事务,有时间改成自动事务
|
|
||||||
|
|
||||||
重新手动实现 model 层
|
重新手动实现 model 层
|
||||||
|
|
||||||
环境变量配置默认会话配置
|
环境变量配置默认会话配置
|
||||||
@@ -41,16 +41,8 @@ oauth token 验证授权范围
|
|||||||
|
|
||||||
账单数据表结构修改
|
账单数据表结构修改
|
||||||
|
|
||||||
captcha 自定义生成流程,弃用 store
|
|
||||||
|
|
||||||
短信发送日志
|
短信发送日志
|
||||||
|
|
||||||
captcha_id 关联用户本机信息,实现验证码设备绑定(或者其他方式)
|
|
||||||
|
|
||||||
退出时主动断开数据库缓存等连接
|
|
||||||
|
|
||||||
固有字段统一放在最开始
|
|
||||||
|
|
||||||
## 环境变量
|
## 环境变量
|
||||||
|
|
||||||
在 init/env 中有定义和默认值
|
在 init/env 中有定义和默认值
|
||||||
@@ -71,10 +63,3 @@ captcha_id 关联用户本机信息,实现验证码设备绑定(或者其他
|
|||||||
api账密:api:123456
|
api账密:api:123456
|
||||||
|
|
||||||
## 业务逻辑
|
## 业务逻辑
|
||||||
|
|
||||||
### 动态 ip 淘汰策略
|
|
||||||
|
|
||||||
1. 用户请求节点
|
|
||||||
2. 查询对应条件下的节点池
|
|
||||||
3. 选择对应数量的节点,发起连接
|
|
||||||
4.
|
|
||||||
|
|||||||
@@ -65,4 +65,14 @@ func main() {
|
|||||||
slog.Error("Server error", slog.Any("err", err))
|
slog.Error("Server error", slog.Any("err", err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 关闭资源
|
||||||
|
err = orm.Exit()
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Failed to close database connection", slog.Any("err", err))
|
||||||
|
}
|
||||||
|
err = rds.Exit()
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Failed to close redis connection", slog.Any("err", err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,17 @@ func Init() {
|
|||||||
DB = db
|
DB = db
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Exit() error {
|
||||||
|
if DB != nil {
|
||||||
|
conn, err := DB.DB()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return conn.Close()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type WithAlias interface {
|
type WithAlias interface {
|
||||||
Alias() string
|
Alias() string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,3 +16,10 @@ func Init() {
|
|||||||
Password: env.RedisPass,
|
Password: env.RedisPass,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Exit() error {
|
||||||
|
if Client != nil {
|
||||||
|
return Client.Close()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -52,33 +52,33 @@ func loginByPhone(c *fiber.Ctx, req *LoginReq) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查找用户 todo 获取权限信息
|
// 查找用户 todo 获取权限信息
|
||||||
var tx = q.Q.Begin()
|
|
||||||
|
|
||||||
var user *models.User
|
var user *models.User
|
||||||
user, err = tx.User.
|
err = q.Q.Transaction(func(tx *q.Query) error {
|
||||||
Where(tx.User.Phone.Eq(req.Username)).
|
user, err = tx.User.
|
||||||
Take()
|
Where(tx.User.Phone.Eq(req.Username)).
|
||||||
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
Take()
|
||||||
return err
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
}
|
return err
|
||||||
|
|
||||||
// 如果用户不存在,初始化用户 todo 保存默认权限信息
|
|
||||||
if user == nil {
|
|
||||||
user = &models.User{
|
|
||||||
Phone: req.Username,
|
|
||||||
Name: req.Username,
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// 更新用户的登录时间
|
// 如果用户不存在,初始化用户 todo 保存默认权限信息
|
||||||
user.LastLogin = time.Now()
|
if user == nil {
|
||||||
user.LastLoginHost = c.IP()
|
user = &models.User{
|
||||||
user.LastLoginAgent = c.Get("User-Agent")
|
Phone: req.Username,
|
||||||
if err := tx.User.Omit(q.User.AdminID).Save(user); err != nil {
|
Name: req.Username,
|
||||||
return err
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = tx.Commit()
|
// 更新用户的登录时间
|
||||||
|
user.LastLogin = time.Now()
|
||||||
|
user.LastLoginHost = c.IP()
|
||||||
|
user.LastLoginAgent = c.Get("User-Agent")
|
||||||
|
if err := tx.User.Omit(q.User.AdminID).Save(user); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,22 @@
|
|||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"platform/pkg/rds"
|
q "platform/web/queries"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Temp(c *fiber.Ctx) error {
|
func Temp(c *fiber.Ctx) error {
|
||||||
|
|
||||||
id := c.Query("id")
|
channels, err := q.Channel.Debug().Where(
|
||||||
result, err := rds.Client.Get(c.Context(), "channel:"+id).Result()
|
q.Channel.Expiration.Lt(time.Now().Add(3 * time.Minute)),
|
||||||
|
).Find()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.JSON(fiber.Map{
|
return c.JSON(fiber.Map{
|
||||||
"result": result,
|
"result": channels,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
11
web/web.go
11
web/web.go
@@ -10,6 +10,8 @@ import (
|
|||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/gofiber/fiber/v2/middleware/logger"
|
"github.com/gofiber/fiber/v2/middleware/logger"
|
||||||
"github.com/gofiber/fiber/v2/middleware/requestid"
|
"github.com/gofiber/fiber/v2/middleware/requestid"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/jxskiss/base62"
|
||||||
)
|
)
|
||||||
|
|
||||||
import _ "net/http/pprof"
|
import _ "net/http/pprof"
|
||||||
@@ -36,6 +38,7 @@ func New(config *Config) (*Server, error) {
|
|||||||
|
|
||||||
func (s *Server) Run() error {
|
func (s *Server) Run() error {
|
||||||
|
|
||||||
|
// config
|
||||||
s.fiber = fiber.New(fiber.Config{
|
s.fiber = fiber.New(fiber.Config{
|
||||||
ErrorHandler: ErrorHandler,
|
ErrorHandler: ErrorHandler,
|
||||||
})
|
})
|
||||||
@@ -43,7 +46,12 @@ func (s *Server) Run() error {
|
|||||||
s.fiber.Use(logger.New(logger.Config{
|
s.fiber.Use(logger.New(logger.Config{
|
||||||
DisableColors: false,
|
DisableColors: false,
|
||||||
}))
|
}))
|
||||||
s.fiber.Use(requestid.New())
|
s.fiber.Use(requestid.New(requestid.Config{
|
||||||
|
Generator: func() string {
|
||||||
|
binary, _ := uuid.New().MarshalBinary()
|
||||||
|
return base62.EncodeToString(binary)
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
|
||||||
ApplyRouters(s.fiber)
|
ApplyRouters(s.fiber)
|
||||||
|
|
||||||
@@ -56,6 +64,7 @@ func (s *Server) Run() error {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// listen
|
||||||
port := env.AppPort
|
port := env.AppPort
|
||||||
slog.Info("Server started on :" + port)
|
slog.Info("Server started on :" + port)
|
||||||
err := s.fiber.Listen(":" + port)
|
err := s.fiber.Listen(":" + port)
|
||||||
|
|||||||
Reference in New Issue
Block a user