logo
1
0
WeChat Login
删除冗余注释,修改压测脚本逻辑,增加服务容器重启机制

Product Catalog Service

本项目是一个基于 Go 的商品目录微服务,提供商品查询、搜索和库存扣减等功能,集成了完整的可观测性(链路追踪、监控、日志)和高可用架构。

功能特性

  • 商品管理:商品列表查询、单个商品查询、商品搜索
  • 库存管理:并发安全的库存扣减(带乐观锁)
  • 缓存策略:Redis 缓存 + Redis 哨兵高可用
  • 可观测性:OpenTelemetry 链路追踪、Prometheus 监控、Jaeger 分布式追踪
  • 健康检查:gRPC Health Check
  • 多副本部署:Docker Compose 支持 3 副本部署

技术栈

  • 语言:Go 1.24
  • 框架:gRPC + Protocol Buffers
  • 数据库:MySQL 8.0 + GORM
  • 缓存:Redis 7.0(主从 + 哨兵)
  • 追踪:OpenTelemetry + Jaeger
  • 监控:Prometheus + Grafana
  • 日志:Logrus(JSON 格式)

项目结构

. ├── 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 # 快速启动脚本

快速开始

前置要求

  • Docker 20.10+
  • Docker Compose 2.0+
  • Go 1.24+(本地开发)

一键启动

chmod +x start.sh; ./start.sh

该脚本会自动启动所有服务容器。

手动启动

# 构建并启动所有服务 docker compose up -d --build # 查看服务状态 docker compose ps # 查看日志 docker compose logs -f productcatalogservice

服务端口

服务端口
Product Catalog Service3550
MySQL3306
Redis Sentinel26379
Jaeger UI16686
Prometheus9090
Grafana3000
OTEL Collector4317 (gRPC) / 4318 (HTTP)

压力测试

项目使用ghz进行性能测试。在终端执行以下命令开始压测:

chmod +x test.sh; ./test.sh

环境变量

变量默认值说明
PORT3550服务监听端口
ENABLE_TRACING0是否启用链路追踪
DISABLE_PROFILER0是否禁用性能分析
COLLECTOR_SERVICE_ADDR-OTEL Collector 地址
MYSQL_ADDRroot:root_password@tcp(127.0.0.1:3307)/product_dbMySQL 连接地址
REDIS_SENTINEL_ADDRS-Redis 哨兵地址(逗号分隔)
REDIS_ADDRlocalhost:6380Redis 单机地址(备选)
EXTRA_LATENCY-注入的额外延迟(用于测试)

可观测性

使用指南

  1. 端口转发:在终端栏选择PORTS,点击Forward a Port,依次输入端口(如16686、9090、3000);
  2. 在浏览器中访问
    1. 点击9090端口Forwarded Address栏左侧的剪贴板形状图标复制地址。
    2. 点击3000端口Forwarded Address栏地球形状图标(光标移到上面时显示Open in Browser)即可查看,浏览器跳转到Grafana界面。

Grafana 使用指南

  1. 需转发端口3000。

    • 用户名:admin

    • 密码:admin

  2. 添加Prometheus数据源

    1. 左侧导航栏Connections,选择Add new connection
    2. Data Source处选择Prometheus,点击右上角Add new data source
    3. 在HTTP URL栏粘贴在端口转发时复制的地址(没有复制的请看使用指南第2步在浏览器中访问);
    4. 下滑到页面最底端,点击Save&Test,返回Successfully queried the Prometheus API.即说明添加成功。
  3. 构建Dashboard

    1. 点击跳转链接build a dashboard,选择Add visualization

    2. 在Select data source页面点击刚刚添加的Prometheus数据源;

    3. 在图表下侧的Metric栏选择后,点击Run queries即可绘制图线。

      本项目手动暴露的Metrics:

      • repo_flush_success_totalMySQL落库成功次数
      • repo_flush_fail_totalMySQL落库失败次数
      • repo_ack_fail_totalACK失败次数
      • repo_recover_fail_total恢复失败次数
      • repo_recover_success_total恢复成功次数

架构说明

数据存储架构

  • MySQL:主数据存储,持久化商品信息和库存
  • Redis:缓存层,使用 Redis 哨兵保证高可用
    • 主从复制:读写分离,提升性能
    • 哨兵模式:自动故障转移

缓存策略

  • 采用 Cache-Aside 模式
  • 查询时先查缓存,未命中则查数据库并写入缓存
  • 写操作时更新数据库并删除缓存

并发控制

库存扣减使用数据库乐观锁机制:

UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?

确保库存不会扣成负数,且支持高并发场景。

License

Apache License 2.0