Browse by type
kratos 框架写商品微服务
本项目是一个使用 Kratos 框架创建的很简单的微服务商城项目。
注: 本项目中但凡 kratos 提供包,就不会自己封装第三方的包。
主要是为了学习 kratos 如何使用,尤其各种中间件之间的调用,包括微服务的一些技术点。
项目具体目录结构初步设计如下:
|-- kratos-shop
|-- service
|-- user // 用户服务 grpc
|-- goods // 商品服务 grpc
|-- cart // 购物车服务 grpc
|-- order // 订单服务 grpc
|-- inventory // 库存服务服务 grpc
|-- shop // shop 商城服务 http (后期会考虑把订单单独拆出来)
├── api // 商城 api
│ ├── service
│ │ └── user
│ │ └── v1 // 用户服务的 proto
│ │ └── goods
│ │ └── v1 // 商品服务的 proto
│ │
│ └── shop
│ └── v1
│ ├── error_reason.proto
│ ├── shop.proto
│── cmd
│── internal
│.....
|-- admin // 后端管理系统 web
项目一共包含 8 个应用服务:user、goods、cart、order、inventory、payment、shop、admin。下面介绍三种启动方式,可以按场景选择。
环境需要 Docker Desktop / OrbStack,在项目根目录执行:
make up
等价于:
docker compose -f deploy/docker-compose.yml up -d --build
该命令会一次性启动全部 8 个应用服务,以及它们依赖的基础设施(Postgres、Redis、RabbitMQ、Consul、Elasticsearch、Jaeger)和可观测性组件(Prometheus、Grafana、Loki、Promtail、Traefik 网关)。
启动完成后可访问:
| 组件 | 地址 |
|---|---|
| 商城 BFF | http://127.0.0.1:8097 |
| 后台管理 | http://127.0.0.1:9099 |
| Consul 服务列表 | http://127.0.0.1:8500/ui |
| Prometheus | http://127.0.0.1:9090 |
| Grafana | http://127.0.0.1:3000(admin / admin) |
| RabbitMQ 管理台 | http://127.0.0.1:15672(root / root) |
| Jaeger | http://127.0.0.1:16686 |
| Traefik Dashboard | http://localhost:8080 |
停止并清理环境:
make down
注意:
make up会占用 5432/6379/5672/8500/9200/80 等端口,如果本机已经有服务占用这些端口,请先停掉。
手动方式适合需要看单个服务日志、打断点调试的场景。需要 Go 1.26.5 和 Docker。
make infra-up
等价于:
docker compose -f deploy/docker-compose.yml up -d postgres redis rabbitmq consul elasticsearch jaeger
./scripts/init-db.sh
make build
shop 和 admin:cd service/user && ./bin/user -conf configs
cd service/goods && ./bin/goods -conf configs
cd service/cart && ./bin/cart -conf configs
cd service/order && ./bin/order -conf configs
cd service/inventory && ./bin/inventory -conf configs
cd service/payment && ./bin/payment -conf configs
cd shop && ./bin/shop -conf configs
cd admin && ./bin/admin -conf configs
curl -X POST http://127.0.0.1:8097/api/users/login \
-H 'Content-Type: application/json' \
-d '{"mobile":"13800138000","password":"12345678"}'
也可以在 Consul UI(http://127.0.0.1:8500/ui)确认 8 个服务都已注册。
停止基础设施:
make infra-down
微服务拆分的目的就是可以按服务独立部署:每个服务都是一个独立二进制,可以运行在不同的服务器上,通过同一个 Consul 互相发现和调用。
cd service/user
make build
如果目标服务器不是当前系统,可以先交叉编译:
cd service/user
GOOS=linux GOARCH=amd64 make build
把 bin/user 和 configs/ 目录一起拷贝到目标服务器。
修改目标服务器上的配置:
configs/config.yaml:把数据库、Redis、RabbitMQ、Elasticsearch、Jaeger 地址改成实际可达的地址(不要用 127.0.0.1,除非依赖就在本机)
configs/registry.yaml:把 consul.address 改成 Consul 所在服务器的地址,所有服务必须注册到同一个 Consul
启动服务:
./bin/user -conf configs
其他服务(goods、cart、order、inventory、payment、shop、admin)按同样方式部署。
discovery:///shop.xxx.service 调用,只要 Consul 配置一致,服务跑在哪台机器上不影响调用关系。各服务默认端口:
| 服务 | 端口 |
|---|---|
| user | 50051 |
| goods | 50052 |
| cart | 50053 |
| order | 50054 |
| inventory | 50055 |
| payment | 50056 |
| shop | 8097(HTTP)/ 9001(gRPC) |
| admin | 9099 |
更详细的多服务器部署说明见 docs/development.md。
web/admin 是基于 Ant Design Pro v6(Umi Max 4 + React 19 + Ant Design 6)的运营后台,菜单顺序为首页 → 用户管理 → 订单管理 → 商品管理 → 商品分类 → 权限管理,登录后默认进入首页看板。当前支持首页数据看板(用户数 / 订单量 / 成交额 / 近 30 天趋势 / 状态分布 / 热销商品)、用户管理(用户列表 / 收货地址管理)、订单管理(列表 / 详情 / 发货 / 退款)、商品管理(分类 / 品牌 / SKU 编码搜索、商品详情含 SKU 与图片、新增 / 上下架 / 删除)、商品分类管理(新增 / 编辑 / 删除)和权限管理(角色权限点配置,前端按钮级隐藏):
cd web/admin
npm install
npm run dev
开发环境访问 http://localhost:8000,/api/* 自动代理到 admin BFF(127.0.0.1:9099)。
需要演示数据时执行(100 个用户、50 个商品、每人 3~5 笔模拟订单):
make seed-demo
make up 启动的整套环境里,除了 8 个应用服务,还包含以下组件:
| 组件 | 作用 | 访问地址 | 默认账号 |
|---|---|---|---|
| Prometheus | 采集 8 个服务及 Postgres/Redis/Consul 的指标 | http://127.0.0.1:9090 | 无 |
| Grafana | 指标与日志可视化,已预置 Prometheus/Loki 数据源 | http://127.0.0.1:3000 | admin / admin |
| RabbitMQ | 订单/支付/库存/商品之间的异步消息队列 | http://127.0.0.1:15672 | root / root |
| Jaeger | 分布式链路追踪,查看请求经过哪些服务 | http://127.0.0.1:16686 | 无 |
| Traefik | API 网关,统一入口转发到 shop 与 admin | http://localhost:8080 | 无 |
| Loki + Promtail | 容器日志采集与存储,在 Grafana 中查询 | 通过 Grafana Explore 使用 | 无 |
/metrics(user 9101 ~ admin 9108)以及 Postgres、Redis、Consul,可在 Status → Targets 确认抓取正常。localhost 路由到商城 BFF,admin.localhost 路由到后台管理(需在 /etc/hosts 添加 127.0.0.1 admin.localhost)。container 或 service 标签过滤。默认账号仅适用于本地环境,公网部署请务必修改密码并限制管理端口暴露。
更详细的组件说明与验证方法见 docs/development.md。
13800138000 / 1234567813501167215 / 12345678以上账号由
sql/初始化脚本写入,仅用于本地演示。
service/payment 目前为本地模拟支付(channel: mock),不会发起真实扣款,适合学习和联调。如需接入真实渠道(支付宝、微信支付、Stripe 等),需要自行扩展支付服务。
config.local.yaml 本地覆盖机制openapi.yaml 可用 Swagger UI / Redoc 查看,例如 npx @redocly/cli preview-docs shop/openapi.yaml
技术栈、快速开始与更详细的说明见 docs/README.md。
browse all types & interfaces →
$ claude mcp add kratos-shop \
-- python -m otcore.mcp_server <graph>