wood
1
仓库地址
示例和使用链接
前景提要
原来的nodejs和worker版本: Random-Api 随机文件API - 资源 - Q58论坛
之所以使用go重构, 还是因为性能和并发问题. 使用go重构后, 单个处理速度一般在5微秒, 内存占用低至4M
特性
- 动态加载和缓存 CSV 文件内容
- 支持图片和视频随机分发
- 可自定义的 URL 路径配置
- Docker 支持,便于部署和扩展
- 详细的日志记录
部署方法
docker compose:
解释:
- public目录放
index.html
index.md
css
文件等, 如果刚创建容器, 会自动复制一份项目里的过去, 按需修改即可
- data目录里放
server.log
stats.json
, 分别是日志和统计数据
BASE_URL
是url.json
里csv文件的请求前缀, 自动适配https, 支持路径
详细步骤
- 新建你的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
- 新建你的url.json, 访问链接是
https://file.example.com/random/url.json
比如:{
"pic": {
"ecy": "pic/ecy.csv"
}
}
如果你不用pic
, 改了其他的前缀名称, 那么你需要在下面代码处添加一下, 按照示例即可
-
部署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
-
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";
}
-
访问域名/pic/ecy
即会302重定向到图片链接.
-
访问域名
会显示首页, 相关内容自行在public/index.html
, public/index.md
调整.
注意
- 现在版本取消了定期清理csv缓存重新获取的机制, 因为没有必要, 并且会速度变慢. 修改文件后重启容器就会重新获取文件;
- 如果有问题, 记得看容器日志, 日志已经很详细, 并且是中文日志;
- 如果不想单独放静态文件, 那么可以把
url.json
和pic/ecy.csv
放在public目录下, 然后不配置BASE_URL
即可, 在不配置的情况下, 请求域名为当前项目访问域名, 也就是会请求https://random.com/url.json
和https://random.com/pic/ecy.csv
;
- 其他疑问请留言
多路径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"
}
}
wood
2
今天新增了调用统计, 只统计次数, 不记录调用域名和IP等
wood
3
因为新增了统计, 部分请求时间大概延长了3-5µs, 不过我感觉是值得的, 因为感觉不出来.
而且统计也做了优化, 3秒合并写入一次.
删除了url.json
这种定期缓存读取, 改为容器启动时读取一次.
CSV文件一小时刷新一次
如果修改了内容, 就重启容器生效即可.
wood
4
2024.10.27更新
可选: 新增环境变量"BASE_URL"
如果配置了, 会在url.json
前面加上请求前缀, 适合把文件和容器不放在一起的用户, 也方便隐藏csv文件的位置和内容.
也适配了前面是否配置http://
和https://
的情况, 如果不加的话, 会自动添加https://
带路径的也可以, /
进行了处理
BASE_URL=https://example.com/csvfile
wood
5
最新更新
需要额外配置一个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配置可选显示接口了
因为有些接口可能想隐藏, 不方便公开.
本来
现在
wood
8
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. 主要改进点
-
配置管理
-
代码组织
- 更清晰的项目结构
- 更好的关注点分离
- 更容易维护和测试
-
错误处理
- 统一的错误处理机制
- 更好的错误追踪
- 更友好的错误提示
-
性能监控
-
部署优化
- 配置文件集中管理
- 更灵活的环境变量支持
- 更好的日志管理
6. 后续优化建议
- 添加单元测试
- 添加性能基准测试
- 完善文档
- 添加 API 文档
- 添加监控告警
wood
9
2024.11.30再次调整
把public
和logs
目录统一放到data
目录下, 这样创建时只需要映射一个data
目录就可以了