- 新增 docker-compose.dev-apps.yml:7 个应用服务容器化
(iam/classes/core-edu/content/msg/push-gateway/api-gateway)
+ apollo-router override
- 新增 apollo-router dev-apps-entrypoint.sh / dev-apps-supergraph.yaml
仅等待 5 个子图(iam/core-edu/content/msg/config-service)
避免等待未启动的 ai/data-ana
- router.yaml:移除 v1.45 不兼容键
(require_manifest/manifest_path/max_cost/max_batch_size)
移除 ELv2 受限特性(persisted_queries/limits.max_depth)
自托管无 GraphOS license
- docker-compose.yml:config-service 添加 NODE_ENV=production
修复 pino-pretty devDep 误用
apollo-router 添加 APOLLO_PERSISTED_QUERIES env
- services/{classes,core-edu,content,config-service}/Dockerfile
重写为 repo 根 context + shared-ts/shared-proto 工作区依赖
+ --ignore-scripts
修复 ERR_PNPM_WORKSPACE_PKG_NOT_FOUND 与 ERR_PNPM_IGNORED_BUILDS
- api-gateway healthcheck:wget --spider 改为 wget -O /dev/null
修复 busybox 对 200+body 误报 exit 8
config-service
v2.1 M3 / ADR-026:从 iam 拆分插件配置 + 布局 + 用户偏好职责
端口
- HTTP: 3011
- gRPC: 50059
职责
config-service 负责插件化仪表盘的后端配置管理(portal-shell spec §6):
- 插件注册表(
config_plugin_registry):系统级插件元数据 - 角色-插件映射(
config_role_plugin_mapping):角色可用插件集 - 角色 Layout 默认(
config_role_layout_default):角色默认布局模板 - Layout 模板(
config_layout_templates):5 种内置模板 - 用户布局覆盖(
config_user_layout_override):用户自定义 - Outbox(
config_outbox):v2.1 ADR-032,Debezium 监听 binlog
不涉及
- DataScope(仍归 iam)
- 认证 / JWT(仍归 iam)
- 权限点 DB 查询(简化为角色判断)
架构
HTTP 3011 ─┬─ /v1/config/plugin-config (用户三层合并)
├─ /v1/config/layout-templates (用户列模板)
├─ /v1/config/user-layout (用户更新布局)
├─ /v1/config/admin/* (admin CRUD)
├─ /healthz, /readyz (健康检查)
├─ /metrics (Prometheus)
└─ /graphql (Federation 子图)
gRPC 50059 ── ConfigService (BFF 聚合调用)
三层合并算法
getPluginConfig(userId, userRole) 的合并逻辑(portal-shell spec §6.4):
- 查
config_plugin_registry WHERE is_active=TRUE - 查
config_role_plugin_mapping WHERE role=:userRole - 查
config_user_layout_override WHERE user_id=:userId - 对每个 plugin:
finalProps = merge(registry.default_props, roleMapping.widget_props, userPlacement.props)finalSlot = userPlacement.slot ?? roleMapping.slot ?? registry.default_slotisVisible = !hidden.includes(pluginId) && (roleMapping.is_enabled ?? true) && registry.is_active
缓存
Redis 缓存(TTL 5min):
config:plugin:{pluginId}— 插件注册表项config:user-layout:{userId}— 用户布局覆盖
失效策略:admin 修改配置或用户更新布局时主动 del。
事件
v2.1 ADR-032:业务写 config_outbox 表,Debezium 监听 binlog 投递到 Kafka。
事件命名:<Aggregate>.<Action>
PluginRegistry.updatedRolePluginMapping.updatedRoleLayoutDefault.updatedUserLayoutOverride.upserted/UserLayoutOverride.reset
开发
# 安装依赖
pnpm install
# 类型检查
pnpm --filter @edu/config-service run typecheck
# Lint
pnpm --filter @edu/config-service run lint
# 开发模式
pnpm --filter @edu/config-service run dev
环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
| PORT | 3011 | HTTP 端口 |
| GRPC_PORT | 50059 | gRPC 端口 |
| DATABASE_URL | — | MySQL 连接串 |
| REDIS_URL | — | Redis 连接串 |
| KAFKA_BROKERS | — | Kafka broker 列表 |
| ROUTER_AUTH_SECRET | dev-router-secret | Apollo Router 信任凭证 |
| DEV_MODE | false | 开发模式(放行权限校验) |
| OTEL_EXPORTER_OTLP_ENDPOINT | — | OTLP exporter 端点 |