解析異構技術棧如何截長補短,打造高效分析平台。
很多團隊會堅持「單一語言棧」,理由是維護成本低,這我完全理解。但在 Wafer BI 的場景裡,我還是刻意選了異構,原因很實際:
微服務架構的其中一個好處,就是每個服務都可以用「最適合它的語言」。而 K8S 跟容器化,就是讓這群個性完全不同的傢伙能和平共處的關鍵。
graph TD
User((使用者)) --> Ingress[Nginx Ingress]
Ingress --> Frontend[Frontend: React + ECharts]
Ingress --> Gateway[API Gateway: Node.js]
Gateway --> AuthService[User Service: Spring Boot 3]
Gateway --> DataService[Wafer BI Service: FastAPI]
AuthService --> DB[(PostgreSQL)]
DataService --> Delta[(Delta Lake)]
異構最直觀的證據,就是專案的 services/ 目錄——pom.xml(Java)、requirements.txt(Python)、package.json(Node.js)、vite.config.ts(React)全部同框。強迫症看了可能會有點癢,但這就是異構的浪漫 哈哈:

▲ 專案結構:services/ 下 Java、Python、Node.js、React 異構服務並存
wafer-bi/
├── services/
│ ├── user-service/ # Java / Spring Boot 3(pom.xml)
│ ├── wafer-bi/ # Python / FastAPI(requirements.txt)
│ ├── api-gateway/ # Node.js / Express(package.json)
│ ├── frontend/ # React + Vite(vite.config.ts)
│ ├── license-service/ # Java(授權管理)
│ └── ai-mcp-service/ # Python(AI 助理,之後的彩蛋)
├── k8s/ # K8S Manifests
├── helm/ # Helm Chart
├── monitoring/ # Prometheus / Grafana 配置
└── docker-compose.yml # 本地一鍵啟動
異構不是免費的午餐,先老實把代價列出來,後面的文章會一個一個拆解:
| 挑戰 | 對策 | 相關章節 |
|---|---|---|
| 各服務建置方式不同 | 統一用 Dockerfile 封裝 | Day 3~4 |
| 跨服務認證 | Gateway 統一驗 JWT | Day 6 |
| 本地環境難以複製 | Docker Compose 一鍵啟動 | Day 7 |
| 部署文件爆炸 | Helm Template 管理 | Day 10 |
| 跨語言追蹤困難 | OpenTelemetry 統一鏈路 | Day 24 |
明天開始動手:先把 Java 服務裝進 Docker,讓 Spring Boot 3 搬進容器新家。