🔥 面向云原生工程实践的多语言微服务样例仓库。
🚀 聚焦配置解耦、可观测性、可替换 AI 推理后端(Gemini/Ollama)和本地化部署。
⭐ 适合作为微服务架构学习、二次开发与工程化改造基线。
- 1. 项目定位
- 2. 改造目标
- 3. 核心改动总览
- 4. 微服务清单
- 5. 架构总览
- 6. 项目结构
- 7. 快速开始
- 8. 配置说明(数据库/Redis/Ollama)
- 9. 部署方式
- 10. 与原版差异
- 11. 仓库信息与协议
- 12. 质量检测与验证
本仓库用于演示“多语言微服务在真实工程中如何持续演进”,重点不在单次跑通,而在长期可维护:
- 支持微服务之间通过 gRPC 协作,前端通过 HTTP 暴露业务入口。
- 支持 Kubernetes/Skaffold/Kustomize 多种部署路径。
- 支持 AI 助手服务按环境切换模型后端(Gemini 或 Ollama)。
- 支持关键地址配置外置,降低硬编码和环境耦合风险。
- 建立统一的项目命名与命名空间规范。
- 将数据库、缓存、模型 API 地址全部参数化。
- 在不破坏主链路的前提下,提升依赖与配置可维护性。
- 对购物助手服务做结构化重构,支持扩展能力。
- 输出完整中文文档,便于交接与二开。
src/adservice已调整构建元信息:group:com.however.microservicesartifact(通过settings.gradle):however-adservice
- Java 包声明已迁移:
hipstershop.*->com.however.microservices.adservice.*
- 新增
configs/however.env.example,统一管理本地化参数。 shoppingassistantservice新增可配置项:MODEL_PROVIDER=gemini|ollamaOLLAMA_BASE_URL/OLLAMA_MODELVECTORSTORE_BACKEND=alloydb|jsonALLOYDB_USER/ALLOYDB_PASSWORD/ALLOYDB_SECRET_NAME
- Node 服务
currencyservice、paymentservice更新了项目元信息(名称、仓库、License、Node 版本约束)。 - Java
adservice启动脚本与 Docker 入口路径同步更新。
shoppingassistantservice 已进行结构化拆分:
AppConfig:统一配置读取CatalogRetriever:检索后端抽象(AlloyDB / JSON 回退)DesignModelClient:模型后端抽象(Gemini / Ollama)- 新增
GET /healthz - 新增本地兜底商品文件:
src/shoppingassistantservice/products.local.json
| 服务 | 语言 | 职责 |
|---|---|---|
frontend |
Go | Web 入口与页面渲染 |
cartservice |
C# | 购物车存储(Redis/替代后端) |
productcatalogservice |
Go | 商品目录检索 |
currencyservice |
Node.js | 汇率与货币转换 |
paymentservice |
Node.js | 支付模拟 |
shippingservice |
Go | 运费与配送模拟 |
emailservice |
Python | 订单邮件模拟 |
checkoutservice |
Go | 结算编排 |
recommendationservice |
Python | 推荐服务 |
adservice |
Java | 广告推荐服务 |
shoppingassistantservice |
Python | 图片/文本购物助手(可切换模型) |
loadgenerator |
Python | 压测流量生成 |
flowchart LR
U[用户浏览器] --> F[frontend]
F --> C[checkoutservice]
F --> CART[cartservice]
F --> P[productcatalogservice]
F --> R[recommendationservice]
F --> A[adservice]
F --> SA[shoppingassistantservice]
C --> PAY[paymentservice]
C --> S[shippingservice]
C --> E[emailservice]
CART --> REDIS[(Redis)]
SA --> MODEL[Gemini / Ollama]
SA --> VDB[AlloyDB / JSON Catalog]
.
├── README.md
├── LICENSE
├── LICENSE-HOWEVER.md
├── configs/
│ └── however.env.example
├── docs/
│ └── img/however-logo.svg
├── kustomize/
│ └── components/
│ ├── shopping-assistant/
│ └── local-endpoints/
└── src/
├── adservice/
├── shoppingassistantservice/
├── frontend/
└── ...
- Docker / Docker Compose
- Kubernetes(可选)
skaffold(可选)
skaffold runskaffold run --module loadgenerator建议先复制配置模板并按环境覆盖:
cp configs/however.env.example .env.local关键变量:
- Redis:
REDIS_ADDR - 模型后端:
MODEL_PROVIDER,OLLAMA_BASE_URL,OLLAMA_MODEL - 向量检索:
VECTORSTORE_BACKEND,VECTOR_TOP_K - AlloyDB:
PROJECT_ID,REGION,ALLOYDB_*
shoppingassistantservice 配置逻辑:
MODEL_PROVIDER=gemini时走 Gemini。MODEL_PROVIDER=ollama时走本地 Ollama API。VECTORSTORE_BACKEND=alloydb时使用 AlloyDB 向量检索。- AlloyDB 不可用时自动回退
products.local.json。
- 使用
kubernetes-manifests或skaffold.yaml原生部署。
- 新增组件:
kustomize/components/local-endpoints - 用于切换到本地 Redis + Ollama + JSON 检索回退。
示例:
components:
- ../components/local-endpoints- 增加
however命名体系(构建标识与 Java 包)。 - 购物助手改为可切换模型后端(Gemini / Ollama)。
- 增加检索后端回退机制(AlloyDB -> JSON)。
- 增加本地化配置模板,敏感参数统一外置。
- 增加本地端点覆盖组件,减少清单硬改。
- 文档全面中文化并补充工程化说明。
- 上游协议:
LICENSE(Apache-2.0) - 本仓库衍生说明:
LICENSE-HOWEVER.md - 仓库描述 / Topics 建议:
.github/HOWEVER_REPO_PROFILE.md
统一检测入口:
bash scripts/checks/run_all_checks.sh或使用 Makefile:
make check-all相关文档:
- 落地清单:
docs/implementation-checklist.md - 测试说明:
docs/testing-and-quality.md
- Put runtime credentials in environment variables.
- Use
.env.exampleas the configuration template.
baseline-ci.ymlprovides a unified pipeline withlint + build + test + secret scan.
- Keep generated files (
dist/,build/,__pycache__/,.idea/,.DS_Store) out of version control.
This repository includes a contract-based quality baseline to keep essential engineering standards stable over time.
- Quality plan: docs/ENGINEERING_QUALITY.md
- Contract tests: tests/repo_contract_test.sh
- Contract CI workflow: .github/workflows/repo-contract-ci.yml
Run local contract checks:
bash tests/repo_contract_test.sh