配置服务
服务的配置方式与任何 Spring Boot 应用一样:application.yaml、profile、环境变量和命令行参数,前缀为 wow。大多数键的默认值都适合生产环境。本页说明配置怎样生效,以及宿主检查什么。所有的键及其类型和默认值,见配置项。
值从哪里来
宿主读取 Spring Boot 的环境,所以 Spring Boot 认识的每种来源都有效,并按它的优先级生效:命令行参数优先于环境变量,环境变量优先于 profile 专属的文件,后者又优先于 application.yaml。名字按宽松规则绑定:wow.log.max-poll-interval、wow.log.maxPollInterval 和环境变量 WOW_LOG_MAXPOLLINTERVAL 是同一个键。
不要把密钥写进文件。eShop 的配置从环境变量读取每个密钥,并在旁边给出开发用的默认值,例如 ${WOW_INTERNAL_TOKEN:…},部署时由它的密钥存储设置这个变量。
怎样写值
| 值 | 写法 |
|---|---|
| 时长 | 500ms、30s、5m,或 ISO-8601 的 PT30S |
| 列表 | YAML 列表,或者来自环境变量的逗号分隔字符串:WOW_INTERNAL_TOKEN=a…,b… |
| 包含点的 map 的键 | 放在方括号里:wow.aggregates.[eshop-ordering.order].tenant、wow.subscriptions.[OrderSummaryProjection.onEvent].start |
在 YAML 中,给带方括号的键加上引号,让方括号保留为键的一部分:
wow:
subscriptions:
"[ShipmentNotifier.onOrderShipped]":
retry:
max-attempts: 8名字会被检查
对于与它所提供的任何东西都不匹配的名字,宿主不会忽略,而是拒绝启动:wow.subscriptions 下没有对应处理函数的订阅、wow.aggregates 下节点不提供的聚合类型、wow.contexts 下不在任何类路径上的上下文、没有任何东西提供的 ID 生成器。
键会被检查
Spring 会忽略没有属性绑定的键,所以拼错的键会一声不响地保留默认值。宿主在启动时把每个 wow.* 键与类路径上的配置元数据比较:
- 未知的键记一条警告,并指明它。
wow.cosec.、wow.http.services.、wow.calls.或wow.internal.下的未知键会阻止启动。在wow.http.services和wow.calls.contexts下,每一项自己的键也会检查:否则拼错的commands会让一个服务可以调用每条命令。
环境变量不检查,因为它们的名字无法反向列举。设置部署的环境变量时,对照参考检查它们。
哪些必须在各节点间一致
一个服务的节点组成一个集群,所以有些设置必须在每个节点上相同,并且只能按参考所说的方式改变:
wow.service,服务的名字,默认是spring.application.name。wow.log.partitions:能整除 4,096 的 2 的幂(默认 64),日志有了条目之后就固定不变。在首次部署之前选定。wow.internal.token:集群令牌。轮换令牌时,先把新令牌加在第二位,再在每个节点上把它移到第一位,最后删除旧令牌。- 存储以及每个聚合类型的放置:
wow.backend、wow.stores、wow.log.store、wow.snapshot.*、wow.aggregates.*.log。
开发与生产
在开发 profile(dev、local、test 或 demo,即 wow.internal.dev-profiles)中,或者内部端口只绑定在回环网卡上时,有几个默认值会放宽:
| 没有 | 开发环境中 | 生产环境中 |
|---|---|---|
DataSource 或 MongoClient | 在内存中运行,并发出警告 | 拒绝启动 |
| 集群令牌 | 内部端口不带令牌运行 | 拒绝启动 |
所以笔记本上不需要数据库,也不需要密钥,而生产节点缺少其中任何一样都无法启动。wow.ddl: validate 防止生产节点建表(PostgreSQL)。
查看节点采用了什么
应用暴露了 Spring Boot Actuator 的 configprops 和 env 端点时,它们会显示每个键绑定的值。只在管理端口上暴露它们:它们展示的是节点的配置。