random-api-go GO重构版

仓库地址

示例和使用链接


前景提要

原来的nodejs和worker版本: Random-Api 随机文件API - 资源 - Q58论坛

之所以使用go重构, 还是因为性能和并发问题. 使用go重构后, 单个处理速度一般在5微秒, 内存占用低至4M


特性

  • 动态加载和缓存 CSV 文件内容
  • 支持图片和视频随机分发
  • 可自定义的 URL 路径配置
  • Docker 支持,便于部署和扩展
  • 详细的日志记录

部署方法

docker compose:

解释:

  1. public目录放 index.html index.md css文件等, 如果刚创建容器, 会自动复制一份项目里的过去, 按需修改即可
  2. data目录里放 server.log stats.json, 分别是日志和统计数据
  3. BASE_URLurl.json里csv文件的请求前缀, 自动适配https, 支持路径

详细步骤

  1. 新建你的csv文件, 在里面放图片链接, 一行一个, 比如 ecy.csv, 然后访问路径是https://file.example.com/random/pic/ecy.csv ;
    CSV 文件应包含每行一个 URL。例如:
    https://example.com/image1.jpg
    https://example.com/image2.jpg
    https://example.com/image3.jpg
    
  2. 新建你的url.json, 访问链接是https://file.example.com/random/url.json比如:
    {
      "pic": {
        "ecy": "pic/ecy.csv"
      }
    }
    
    如果你不用pic, 改了其他的前缀名称, 那么你需要在下面代码处添加一下, 按照示例即可
  1. 部署docker, 按照这个docker-compose.yml

    services:
      random-api-go:
        container_name: random-api-go
        image: woodchen/random-api-go:latest
        ports:
          - "5003:5003"
        volumes:
          - ./public:/root/public
          - ./data:/root/data
        environment:
          - TZ=Asia/Shanghai
          - BASE_URL=https://file.example.com/random
        restart: unless-stopped
    
  2. nginx反代5003接口, 示例配置:

    location ^~ / {
        proxy_pass http://127.0.0.1:5003; 
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header REMOTE-HOST $remote_addr; 
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection "upgrade"; 
        proxy_set_header X-Forwarded-Proto $scheme; 
        proxy_http_version 1.1; 
        add_header X-Cache $upstream_cache_status; 
        add_header Cache-Control no-cache; 
        proxy_ssl_server_name off; 
        add_header Strict-Transport-Security "max-age=31536000"; 
    }
    
  3. 访问域名/pic/ecy即会302重定向到图片链接.

  4. 访问域名会显示首页, 相关内容自行在public/index.html, public/index.md调整.

注意

  1. 现在版本取消了定期清理csv缓存重新获取的机制, 因为没有必要, 并且会速度变慢. 修改文件后重启容器就会重新获取文件;
  2. 如果有问题, 记得看容器日志, 日志已经很详细, 并且是中文日志;
  3. 如果不想单独放静态文件, 那么可以把url.jsonpic/ecy.csv放在public目录下, 然后不配置BASE_URL即可, 在不配置的情况下, 请求域名为当前项目访问域名, 也就是会请求https://random.com/url.jsonhttps://random.com/pic/ecy.csv;
  4. 其他疑问请留言

多路径url.json示例:

{
  "pic": {
    "all": "url/pic/all.csv",
    "fj": "url/pic/fj.csv",
    "czlwb": "url/pic/czl-website-background.csv",
    "truegirl": "url/pic/truegirl.csv",
    "truegirl1": "url/pic/truegirl1.csv",
    "truegirl2": "url/pic/truegirl2.csv",
    "girl-gif": "url/pic/girl-gif.csv",
    "ecy": "url/pic/ecy.csv",
    "ecy1": "url/pic/ecy1.csv",
    "ecy2": "url/pic/ecy2.csv",
    "ai": "url/pic/ai.csv",
    "loading": "url/pic/loading.csv"
  },
  "video": {
    "all": "url/video/all.csv"
  }
}

今天新增了调用统计, 只统计次数, 不记录调用域名和IP等

因为新增了统计, 部分请求时间大概延长了3-5µs, 不过我感觉是值得的, 因为感觉不出来.

而且统计也做了优化, 3秒合并写入一次.

删除了url.json这种定期缓存读取, 改为容器启动时读取一次.

CSV文件一小时刷新一次

如果修改了内容, 就重启容器生效即可.

2024.10.27更新

可选: 新增环境变量"BASE_URL"

如果配置了, 会在url.json前面加上请求前缀, 适合把文件和容器不放在一起的用户, 也方便隐藏csv文件的位置和内容.

也适配了前面是否配置http://https://的情况, 如果不加的话, 会自动添加https://

带路径的也可以, /进行了处理

BASE_URL=https://example.com/csvfile

最新更新

需要额外配置一个endpoint.json, 放在一个可访问的链接里, 类似这样:

{
  "pic/all": {
      "name": "全部图片",
      "order": 1
  },
  "pic/ai": {
      "name": "AI绘图",
      "order": 2
  }
}

然后nginx配置:

location = /config/endpoint.json {
    proxy_pass https://randomfile.com/endpoint.json;
    proxy_set_header Host github-file.czl.net;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_ssl_verify off;  # 如果需要的话
    
    # 添加缓存配置
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
    proxy_cache_valid 200 5m;  # 缓存成功响应5分钟
    add_header X-Proxy-Cache $upstream_cache_status;  # 显示缓存状态
    
    # 允许跨域
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, OPTIONS';
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
}

前端就可以根据json配置可选显示接口了

因为有些接口可能想隐藏, 不方便公开.

本来

现在

自动生成文件和流程参考:

压测

2024.11.30更新

Random-API 项目重构总结

1. 配置管理优化

新增配置文件 data/config.json
{
  "server": {
    "port": ":5003",
    "read_timeout": "30s",
    "write_timeout": "30s",
    "max_header_bytes": 1048576
  },
  "storage": {
    "data_dir": "/root/data",
    "stats_file": "/root/data/stats.json",
    "log_file": "/root/data/logs/server.log"
  },
  "api": {
    "base_url": "",
    "request_timeout": "10s"
  }
}
改进配置包 config/config.go
  • 添加结构化配置支持
  • 支持环境变量覆盖配置文件
  • 统一常量管理

2. 架构重构

新增路由层 router/router.go
  • 添加路由接口
  • 实现中间件链
  • 统一路由管理
重构处理器 handlers/handlers.go
  • 实现面向接口的处理器
  • 统一错误处理
  • 规范化路由注册
优化中间件 middleware/metrics.go
  • 添加监控中间件
  • 实现请求追踪
  • 统一日志记录

3. 应用初始化优化 main.go

type App struct {
    server *http.Server
    router *router.Router
    Stats  *stats.StatsManager
}
  • 实现优雅启动
  • 实现优雅关闭
  • 统一错误处理

5. 主要改进点

  1. 配置管理

    • 支持配置文件
    • 支持环境变量覆盖
    • 统一配置接口
  2. 代码组织

    • 更清晰的项目结构
    • 更好的关注点分离
    • 更容易维护和测试
  3. 错误处理

    • 统一的错误处理机制
    • 更好的错误追踪
    • 更友好的错误提示
  4. 性能监控

    • 请求追踪
    • 性能指标收集
    • 系统状态监控
  5. 部署优化

    • 配置文件集中管理
    • 更灵活的环境变量支持
    • 更好的日志管理

6. 后续优化建议

  1. 添加单元测试
  2. 添加性能基准测试
  3. 完善文档
  4. 添加 API 文档
  5. 添加监控告警

2024.11.30再次调整

publiclogs目录统一放到data目录下, 这样创建时只需要映射一个data目录就可以了