本项目是一个基于 Go 的商品目录微服务,提供商品查询、搜索和库存扣减等功能,集成了完整的可观测性(链路追踪、监控、日志)和高可用架构。
. ├── configs/ # 配置文件目录 │ ├── mysql/ # MySQL 初始化脚本 │ ├── redis/ # Redis 哨兵配置 │ ├── otel/ # OpenTelemetry Collector 配置 │ └── prometheus/ # Prometheus 配置 ├── genproto/ # Protocol Buffer 生成代码 ├── model/ # 数据模型 ├── repository/ # 数据访问层(含缓存) ├── server.go # 主服务入口 ├── Dockerfile # Docker 镜像构建 ├── docker-compose.yaml # 容器编排 ├── test.sh # 一键压测脚本 └── start.sh # 快速启动脚本
chmod +x start.sh; ./start.sh
该脚本会自动启动所有服务容器。
# 构建并启动所有服务
docker compose up -d --build
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f productcatalogservice
| 服务 | 端口 |
|---|---|
| Product Catalog Service | 3550 |
| MySQL | 3306 |
| Redis Sentinel | 26379 |
| Jaeger UI | 16686 |
| Prometheus | 9090 |
| Grafana | 3000 |
| OTEL Collector | 4317 (gRPC) / 4318 (HTTP) |
项目使用ghz进行性能测试。在终端执行以下命令开始压测:
chmod +x test.sh; ./test.sh
| 变量 | 默认值 | 说明 |
|---|---|---|
| PORT | 3550 | 服务监听端口 |
| ENABLE_TRACING | 0 | 是否启用链路追踪 |
| DISABLE_PROFILER | 0 | 是否禁用性能分析 |
| COLLECTOR_SERVICE_ADDR | - | OTEL Collector 地址 |
| MYSQL_ADDR | root:root_password@tcp(127.0.0.1:3307)/product_db | MySQL 连接地址 |
| REDIS_SENTINEL_ADDRS | - | Redis 哨兵地址(逗号分隔) |
| REDIS_ADDR | localhost:6380 | Redis 单机地址(备选) |
| EXTRA_LATENCY | - | 注入的额外延迟(用于测试) |
PORTS,点击Forward a Port,依次输入端口(如16686、9090、3000);Forwarded Address栏左侧的剪贴板形状图标复制地址。Forwarded Address栏地球形状图标(光标移到上面时显示Open in Browser)即可查看,浏览器跳转到Grafana界面。需转发端口3000。
用户名:admin
密码:admin
添加Prometheus数据源
Connections,选择Add new connection;Add new data source;Save&Test,返回Successfully queried the Prometheus API.即说明添加成功。构建Dashboard
点击跳转链接build a dashboard,选择Add visualization;
在Select data source页面点击刚刚添加的Prometheus数据源;
在图表下侧的Metric栏选择后,点击Run queries即可绘制图线。
本项目手动暴露的Metrics:
repo_flush_success_total,MySQL落库成功次数;repo_flush_fail_total,MySQL落库失败次数;repo_ack_fail_total,ACK失败次数;repo_recover_fail_total,恢复失败次数;repo_recover_success_total,恢复成功次数。库存扣减使用数据库乐观锁机制:
UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?
确保库存不会扣成负数,且支持高并发场景。
Apache License 2.0