+
Skip to content

udeth/godex

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

godex

Go Version Status

🏢 赞助

感谢以下赞助商支持 godex 的开发:

Powered by DartNode

📋 项目简介

godex 是一个Go应用框架。

核心特性

  • 🛡️ 检测: 实时检测域名是否为
  • 🚀 高性能缓存: 将数据加载到内存中,提供毫秒级响应
  • 定时更新: 自动从第三方数据源更新列表
  • 🎯 类型安全: 基于静态声明式API,编译时类型检查
  • 📊 任务调度: 支持定时任务和一次性任务执行
  • 🔧 模块化架构: 支持双模式运行(Web/CLI),组件可选择启用

🚀 快速开始

环境要求

  • Go 1.24+(编译期)

安装与运行

# 克隆项目
git clone <repository-url>
cd godex

# 安装依赖
go mod tidy

# 启动服务
go run cmd/main.go

# 或构建后运行
make build
./app

配置文件

配置文件加载优先级:

  1. .config.yaml (项目根目录)
  2. ./conf/config.yaml (推荐)
  3. /etc/conf/config.yaml (系统级)

⚙️ 配置文件说明

项目使用YAML格式配置文件,示例如下,完整配置可以查看./conf/config-example.yaml

### 系统配置 ###
system:
  show-conf: false                    # 非develop环境中严禁开启
  log:
    level: INFO                      # 日志级别: DEBUG, INFO, WARN, ERROR
    file: "app.log"                 # 日志文件名
  service:
    name: "godex"      # 服务名称
    port: 8000                      # HTTP服务端口
  tasks:                            # 定时任务配置
    - name: "预加载数据到内存"
      enable: true                  # 是否启用该任务
      cron: "@once"                # 启动时执行一次
      function: "LoadPhishingSites2CacheTask"
      description: "启动时预加载数据"
    - name: "定时加载数据到内存"
      enable: true
      cron: "0 0 2 * * *"          # 每天凌晨2点执行 (秒 分 时 日 月 周)
      function: "LoadPhishingSites2CacheTask"
      description: "定时更新数据"
    - name: "测试任务1"
      enable: false                 # 可设为false禁用
      cron: "*/5 * * * * *"        # 每5秒执行一次
      function: "CronTestTask"
      description: "测试任务"
  report:                          # 数据上报配置
    endpoint: https://sys-test.adspower.net
    enable: true                   # 是否启用上报
    aes-public-key: |             # AES加密公钥
      -----BEGIN PUBLIC KEY-----
      [公钥内容]
      -----END PUBLIC KEY-----

### 数据库配置 ###
databases:
  dsn: "user:password@tcp(host:port)/database?parseTime=true&loc=Local"
  driver-name: mysql               # 支持mysql, postgres等
  max-idle: 4                     # 最大空闲连接数
  max-open: 8                     # 最大打开连接数
  max-life-time: 600s             # 连接最大生命周期
  max-idle-time: 300s             # 空闲连接超时时间
  show-sql: false                 # 是否显示SQL语句(调试用)

### 应用设置 ###
app-setting:
  scam-sniffer: "https://raw.githubusercontent.com/scamsniffer/scam-database/refs/heads/main/blacklist/domains.json"
  batch-upsert-size: 5000         # 批量插入数据大小
  batch-load-size: 100000         # 批量加载数据大小
  fixed-sniffer:                  # 固定的列表
    - phishing-sites-foo.com
    - phishing-sites-bar.com

配置要点说明:

  • Cron表达式格式: 支持标准格式"0 0 2 * * *"(秒分时日月周)、特殊关键字@once/@daily/@hourly、间隔表达式@every 5s
  • 任务配置: 通过enable字段控制任务启用/禁用,修改后需重启服务生效
  • 数据库连接: DSN格式为标准数据库连接字符串,支持连接池参数调优
  • 安全配置: 生产环境请使用环境变量或K8s Secret管理敏感信息,不要将密码直接写入配置文件
  • 日志配置: show-sql建议仅在开发环境启用,生产环境关闭以提高性能

🏗️ 架构设计

API设计原则

本项目采用静态声明式API设计,确保类型安全和代码简洁:

// ✅ 推荐的API声明方式
// CheckSites 检查网站是否为
func (c *phishingSitesLogic) CheckSites(ctx context.Context, req api.CheckSitesReq) (api.CheckSitesRsp, error) {
    phishingSites, err := service.NewPhishingSitesService().CheckPhishingSitesWithCache(ctx, req)
    if err != nil {
        return nil, errs.Newf(errors.RequestParamInvalid, "check phishing sites failed")
    }

    var rsp api.CheckSitesRsp
    if err := copier.Copy(&rsp, &phishingSites); err != nil {
        return nil, errs.Newf(errors.InternalError, "copy response data failed: %v", err)
    }

    return rsp, nil
}

核心优势

  • 透明化: 框架自动处理请求绑定、错误处理、响应序列化
  • 类型安全: 编译时验证请求和响应类型
  • 代码简洁: 开发者只需关注核心业务逻辑
  • 一致性: 统一的API声明风格
  • 便捷性: 一个函数声明即可完成完整的API处理

🏗️ 高级特性

模块化启动架构

  • 双模式运行: 同一二进制文件支持Web服务和命令行工具两种模式
  • 组件可选: 可选择性启用数据库、缓存、定时任务等组件
  • 插件式扩展: 支持自定义初始化函数,便于功能扩展
// 支持多种启动模式
serve.WithWebDefault()     // Web服务模式
serve.WithCommandDefault() // 命令行模式
serve.WithCustomInit()     // 自定义初始化

配置热重载

  • 零停机更新: 业务配置文件修改后自动重载,无需重启服务
  • 多路径支持: 支持多个配置文件路径,按优先级自动查找
  • 线程安全: 读写锁保护配置的并发访问

企业级错误处理

  • 错误分类管理: 区分框架错误、业务错误和下游错误
  • 堆栈跟踪: 可配置的错误堆栈跟踪,支持过滤无关信息
  • 优雅降级: 静默错误处理机制,避免非关键错误影响主流程
// 支持堆栈跟踪的错误处理
errs.SetTraceableWithContent("service_name") // 过滤特定内容
logger.IgnoreError(err) // 静默处理非关键错误

数据安全传输

  • 双重加密: AES对称加密 + RSA非对称加密保护敏感数据
  • 异步上报: 数据上报不阻塞主业务流程
  • 可配置开关: 支持按环境启用/禁用上报功能

泛型API处理器

  • 编译时类型安全: 避免运行时类型错误
  • 自动序列化: 框架自动处理JSON序列化/反序列化
  • 错误统一处理: 统一的错误响应格式
// 泛型API处理器示例
func Handler[TReq any, TRsp any](handler func(ctx context.Context, req TReq) (TRsp, error))

开发规范

  1. 错误处理: 必须对所有错误进行适当处理
  2. 上下文传递: Service方法第一个参数必须为context.Context
  3. 接口限制: 非特殊情况不允许定义interface类型的API
  4. 上下文生命周期: 向下传递的ctx不允许被结构体引用
  5. 非develop环境中严禁开启 system.show-conf: true
  6. 错误码管理: 新增错误码必须定义到 internal/errors 目录下,禁止在业务代码中硬编码错误码
  7. 配置管理: 所有配置项必须通过 internal/conf 配合 config.yaml 进行加载,严禁硬编码到项目内

📁 目录结构

├── cmd/                          # 程序入口,仅存放main函数
│   └── main.go
├── conf/                         # 配置文件目录
│   └── config.yaml
├── internal/                     # 内部代码,仅供本服务使用
│   ├── cache/                    # 缓存相关
│   ├── command/                  # 命令模式入口
│   ├── configuration/            # 配置文件加载
│   ├── controller/               # HTTP控制器
│   ├── db/                       # 数据库连接
│   ├── entity/                   # 数据传输对象
│   ├── errors/                   # 错误定义
│   ├── logic/                    # 核心业务逻辑
│   ├── model/                    # 数据模型定义
│   ├── repo/                     # 数据访问层
│   ├── resty/                    # 第三方API调用
│   ├── serve/                    # 服务初始化
│   ├── service/                  # 业务服务层
│   ├── task/                     # 定时任务
│   └── utils/                    # 工具函数
├── pkg/                          # 公共组件,可被外部引用
│   ├── cfgs/                     # 通用配置加载器
│   ├── constant/                 # 常量定义
│   ├── errs/                     # 错误处理基础包
│   ├── logger/                   # 日志组件
│   ├── report/                   # 上报组件
│   ├── retcode/                  # 状态码定义
│   └── scheduler/                # 定时任务组件
├── Makefile                      # 构建脚本
└── README.md                     # 项目文档

🔧 功能模块

检测服务

  • 数据源: 从ScamSniffer等第三方源获取列表
  • 实时检测: 提供HTTP API检查域名安全性
  • 缓存机制: 内存缓存提高查询性能
  • 自动更新: 定期同步最新的威胁情报

定时任务系统

支持多种类型的定时任务:

  • 一次性任务: 启动时执行的初始化任务
  • 定时任务: 基于Cron表达式的周期性任务
  • 手动触发: 支持命令行手动执行任务

命令行工具

# 手动更新数据
./app importPhishingSites

# 查看可用命令
./app --help

📊 服务监控

启动成功日志示例

INFO[2025-06-05T14:57:38+08:00] 🎉 Logger initialized successfully with daily rotation (max_days: 30, timezone: ) 
INFO[2025-06-05T14:57:38+08:00] [task/scheduler.go:105] 🎉 Scheduling one-time task: 预加载数据到内存 
INFO[2025-06-05T14:57:38+08:00] [task/scheduler.go:137] 🎉 Registered task: 定时加载数据到内存 (cron: 0 0 2 * * *, function: LoadPhishingSites2CacheTask) 
INFO[2025-06-05T14:57:38+08:00] [task/scheduler.go:137] 🎉 Registered task: 测试任务1 (cron: */5 * * * * *, function: CronTestTask) 
INFO[2025-06-05T14:57:38+08:00] [task/scheduler.go:73] 🎉 Available task functions: [CronTestTask LoadPhishingSites2CacheTask OnceTestTask] 
INFO[2025-06-05T14:57:38+08:00] [task/scheduler.go:77] 🎉 Task scheduler started successfully 
INFO[2025-06-05T14:57:38+08:00] [serve/serve.go:242] 🚀 [Web] Application started. listening on :8000. Press CTRL+C to shut down. 

🛠️ 开发指南

Make命令

make          # 构建项目
make check    # 代码检查
make unit-test    # 单元测试
make api-test     # API测试
make upload       # 上传部署

配置管理

  • 开发环境:使用 ./conf/config.yaml
  • 生产环境:建议使用K8s ConfigMap挂载配置文件
  • 配置修改后需要重启服务生效(定时任务配置)

数据库依赖

根据配置文件中的数据库设置,支持多种数据库类型。具体配置请参考 ./conf/config.yaml 示例。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载