第 8 章 · 组件选型矩阵与全栈联调
本章汇总 何时选哪个组件,并给出可验收的 全栈联调剧本(含连接串与环境变量一览)。
8.1 按问题选型(决策表)
| 我要解决… | 首选组件 | 商店 id | 备选 |
|---|---|---|---|
| 订单/账户落库 | MySQL | mysql | mariadb、postgresql |
| 复杂查询/JSONB/GIS | PostgreSQL | postgresql | — |
| 商品详情文档结构多变 | MongoDB | mongodb | — |
| 登录 Session / 热点缓存 | Redis | redis | valkey、memcached |
| 纯页面片段缓存 | Memcached | memcached | Redis |
| 异步发邮件/削峰 | RabbitMQ | rabbitmq | — |
| Java 事务/顺序消息 | RocketMQ | rocketmq | Kafka |
| 日志流/埋点管道 | Kafka | kafka | — |
| 微服务注册与配置 | Nacos | nacos | etcd |
| 对外 HTTP 入口 | Nginx | nginx | Ingress 插件 |
| 商品搜索/日志检索 | Elasticsearch | elasticsearch | opensearch |
| 图片附件对象存储 | MinIO | minio | seaweedfs |
| 指标监控大屏 | Prometheus + Grafana | prometheus + grafana | 集群插件一体包 |
| CI 流水线 | Jenkins | jenkins | gitlab-ce |
| Git 仓库 | Gitea | gitea | GitLab |
| 本地大模型 | Ollama | ollama | — |
| LLM 网页对话 | Open WebUI | open-webui | — |
| 分布式链路追踪 | Jaeger | jaeger | — |
| 日志聚合 | Grafana Loki | loki | Elasticsearch |
| 内网镜像仓 | Docker Registry | docker-registry | artifactory-oss |
| K8s Ingress | Ingress-Nginx | 集群插件 ingress-nginx | traefik |
| API 网关限流 | APISIX | apisix | Nginx |
| Java 配置中心 | Apollo | apollo | Nacos |
| 流量治理 | Sentinel | sentinel-dashboard | — |
| OLAP 分析 | ClickHouse | clickhouse | — |
| MQTT 物联网 | EMQX | emqx | — |
| 统一登录 SSO | Keycloak | keycloak | — |
| Node.js API | NestJS 集成 | 第 17 章 | — |
| Go 微服务 | Gin 集成 | 第 17 章 | — |
8.2 连接串速查(集群内,Namespace 示例)
假设:数据层 data,中间件 middleware,应用 app,AI ai。
| 组件 | 连接串 / Endpoint |
|---|---|
| MySQL | mysql://app:pass@mysql.data.svc.cluster.local:3306/appdb |
| PostgreSQL | postgresql://app:pass@postgres.data.svc.cluster.local:5432/appdb |
| MongoDB | mongodb://admin:pass@mongodb.data.svc.cluster.local:27017/appdb?authSource=admin |
| Redis | redis://:pass@redis.data.svc.cluster.local:6379/0 |
| RabbitMQ | amqp://app:pass@rabbitmq.middleware.svc.cluster.local:5672/ |
| RocketMQ | rocketmq-namesrv.middleware.svc.cluster.local:9876 |
| Kafka | kafka.middleware.svc.cluster.local:9092 |
| Nacos | nacos.middleware.svc.cluster.local:8848 |
| Elasticsearch | http://elasticsearch.middleware.svc.cluster.local:9200 |
| MinIO S3 | http://minio.data.svc.cluster.local:9000 |
| Prometheus | http://prometheus:9090 |
| Ollama OpenAI | http://ollama.ai.svc.cluster.local:11434/v1 |
应用在 同一 Namespace 时可简写主机名,如 mysql:3306。
8.3 全栈联调剧本 A:电商最小闭环
目标:浏览器访问 Nginx → API → MySQL + Redis;可观测。
| 步骤 | 组件 | Namespace | 关键配置 |
|---|---|---|---|
| 0 | Longhorn | — | 集群插件 + 资源池 配盘 |
| 1 | MySQL | data | 第 2 章 MYSQL_* env |
| 2 | Redis | data | 第 3 章 requirepass |
| 3 | API | app | 自定义镜像;env 见下表 |
| 4 | Nginx | app | 反代 api:8080,NodePort 80 |
| 5 | Prometheus+Grafana | monitor | 第 6 章或集群插件 |
API Deployment 环境变量示例
env:
- name: DATABASE_URL
value: "mysql://app:pass@mysql.data.svc.cluster.local:3306/appdb"
- name: REDIS_URL
value: "redis://:RedisPass@redis.data.svc.cluster.local:6379/0"
- name: HTTP_PORT
value: "8080"
验收
| # | 检查项 | 命令/操作 |
|---|---|---|
| 1 | MySQL | mysql -h mysql.data -u app -p -e "SELECT 1" |
| 2 | Redis | redis-cli -h redis.data -a pass ping |
| 3 | API | curl http://api.app.svc.cluster.local:8080/health |
| 4 | 外网 | 浏览器 http://<节点IP>:<nginx NodePort>/api/health |
| 5 | Grafana | 面板 up 或 http_requests_total 有数据 |
| 6 | 备份 | 管理 → 备份恢复 导出 data、app Namespace |
8.4 全栈联调剧本 B:微服务 + 消息 + 配置
在剧本 A 上增加:
| 组件 | 作用 | 集成语法 |
|---|---|---|
| Nacos | 注册与配置 | spring.cloud.nacos.discovery.server-addr=nacos.middleware:8848 |
| RabbitMQ | 下单异步 | @RabbitListener(queues="order.created") |
| RocketMQ | 订单事务消息 | rocketmq.name-server=rocketmq-namesrv:9876 |
| Kafka | 行为埋点 | spring.kafka.bootstrap-servers=kafka.middleware:9092 |
Worker 服务(第二个 Deployment)仅消费 RabbitMQ,环境变量:
AMQP_URL=amqp://app:pass@rabbitmq.middleware:5672/
验收:API 发消息 → Worker 日志管理 有消费记录 → RabbitMQ UI 队列 Ready 下降。
8.5 全栈联调剧本 C:搜索 + 对象存储 + AI
| 组件 | 场景 | 关键点 |
|---|---|---|
| Elasticsearch | 商品搜索 | PUT /products 索引 + match 查询 |
| MinIO | 商品图 | uploads Bucket,API 用 boto3 |
| Ollama | 智能客服 | API 调 /v1/chat/completions |
| Open WebUI | 运营调试提示词 | OLLAMA_BASE_URL 指 Ollama |