Compare commits

2 Commits

Author SHA1 Message Date
lzh
98d3db9ade fix: 调整 iot-gateway prod 配置结构与 application.yaml 保持一致
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
- 移除 Nacos 配置(在 application.yaml 中通过 import 引入)
- 保持与 application.yaml 完全相同的结构
- 仅将硬编码值替换为环境变量占位符
2026-01-13 13:51:53 +08:00
lzh
f9aa7828c7 feat: 完善 iot-gateway 生产环境配置
- 添加 IoT 网关特有的配置项环境变量支持
- 支持 HTTP/MQTT/TCP/EMQX 协议配置
- 支持设备 RPC 和 Token 配置
- 支持消息总线配置
- 添加生产环境配置文档
2026-01-13 12:32:14 +08:00
2 changed files with 295 additions and 69 deletions

View File

@@ -0,0 +1,180 @@
# 生产环境配置说明
本文档说明如何使用 `application-prod.yaml` 配置文件。
## 配置架构
### 三层配置体系
```
1. application.yaml (基础配置)
2. application-prod.yaml (生产环境配置 + 环境变量占位符)
3. Nacos 配置中心 (动态配置,优先级最高)
```
### 配置优先级
```
Nacos 配置 > 环境变量 > application-prod.yaml 默认值 > application.yaml
```
## 环境变量命名规范
### 通用环境变量
| 环境变量 | 说明 | 默认值 | 示例 |
|---------|------|--------|------|
| `NACOS_SERVER_ADDR` | Nacos 服务器地址 | 127.0.0.1:8848 | 127.0.0.1:8848 |
| `NACOS_USERNAME` | Nacos 用户名 | 空 | nacos |
| `NACOS_PASSWORD` | Nacos 密码 | 空 | nacos123 |
| `NACOS_NAMESPACE` | Nacos 命名空间 | 空 | prod |
| `NACOS_GROUP` | Nacos 分组 | DEFAULT_GROUP | DEFAULT_GROUP |
### 数据库环境变量
| 环境变量 | 说明 | 默认值 |
|---------|------|--------|
| `MYSQL_HOST` | MySQL 主机地址 | 127.0.0.1 |
| `MYSQL_PORT` | MySQL 端口 | 3306 |
| `MYSQL_DATABASE` | 数据库名 | aiot_platform |
| `MYSQL_USER` | 数据库用户名 | root |
| `MYSQL_PASSWORD` | 数据库密码 | 空 |
### Redis 环境变量
| 环境变量 | 说明 | 默认值 |
|---------|------|--------|
| `REDIS_HOST` | Redis 主机地址 | 127.0.0.1 |
| `REDIS_PORT` | Redis 端口 | 6379 |
| `REDIS_DATABASE` | Redis 数据库索引 | 0 |
| `REDIS_PASSWORD` | Redis 密码 | 空 |
### 消息队列环境变量
| 环境变量 | 说明 | 默认值 |
|---------|------|--------|
| `ROCKETMQ_NAMESRV_ADDR` | RocketMQ NameServer 地址 | 127.0.0.1:9876 |
## 使用方式
### 方式 1: Docker Compose 环境变量注入(推荐)
`docker-compose.core.yml` 中已配置:
```yaml
viewsh-module-system-server:
environment:
SPRING_PROFILES_ACTIVE: prod # ← 激活 prod 配置
NACOS_SERVER_ADDR: ${NACOS_HOST}:${NACOS_PORT}
MYSQL_HOST: ${MYSQL_HOST}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
# ... 其他环境变量
```
### 方式 2: Nacos 配置中心覆盖
在 Nacos 控制台创建配置文件,会覆盖环境变量和本地配置:
**Data ID**: `system-server-prod.yaml`
**Group**: `DEFAULT_GROUP`
```yaml
spring:
datasource:
dynamic:
datasource:
master:
password: 从Nacos管理的密码 # ← 覆盖环境变量
```
### 方式 3: 混合使用(最佳实践)
- **环境变量**配置基础设施连接信息MySQL、Redis、Nacos
- **Nacos**:配置业务参数、功能开关、动态配置
## 各服务配置差异
### 需要 MySQL 的服务
- `viewsh-module-system-server`
- `viewsh-module-infra-server`
- `viewsh-module-iot-server`
### 需要 RocketMQ 的服务
- `viewsh-module-iot-server`
- `viewsh-module-iot-gateway`
### 仅需要 Redis 的服务
- `viewsh-gateway`
- `viewsh-module-iot-gateway`
## 激活生产环境配置
### 在 Docker Compose 中
已在 `docker-compose.core.yml` 中配置:
```yaml
environment:
SPRING_PROFILES_ACTIVE: prod
```
### 手动启动
```bash
java -jar app.jar --spring.profiles.active=prod
```
## 配置验证
### 查看生效的配置
```bash
# 进入容器
docker exec -it aiot-system-server sh
# 查看环境变量
env | grep MYSQL
env | grep REDIS
# 查看 Spring Boot 配置
curl http://localhost:48081/actuator/env
```
## 常见问题
### Q: 如何确认使用了 prod 配置?
A: 查看日志,应该看到:
```
The following 1 profile is active: "prod"
```
### Q: 环境变量和 Nacos 哪个优先级高?
A: Nacos 配置优先级最高,会覆盖环境变量。
### Q: 如何临时修改配置?
A:
1. **临时修改**:在 Nacos 中修改(无需重启)
2. **永久修改**:修改 `.env` 文件并重启容器
## 配置文件位置
```
viewsh-gateway/src/main/resources/application-prod.yaml
viewsh-module-system/viewsh-module-system-server/src/main/resources/application-prod.yaml
viewsh-module-infra/viewsh-module-infra-server/src/main/resources/application-prod.yaml
viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application-prod.yaml
viewsh-module-iot/viewsh-module-iot-gateway/src/main/resources/application-prod.yaml
```
## 下一步
配置完成后,参考 [部署操作指南](deployment-guide.md) 进行部署。

View File

@@ -1,86 +1,132 @@
--- #################### 注册中心 + 配置中心相关配置 ####################
spring:
cloud:
nacos:
server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
username: ${NACOS_USERNAME:}
password: ${NACOS_PASSWORD:}
discovery:
namespace: ${NACOS_NAMESPACE:}
group: ${NACOS_GROUP:DEFAULT_GROUP}
metadata:
version: 1.0.0
config:
namespace: ${NACOS_NAMESPACE:}
group: ${NACOS_GROUP:DEFAULT_GROUP}
application:
name: iot-gateway-server
profiles:
active: prod
--- #################### Redis 配置 ####################
spring:
# Redis 配置
data:
redis:
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:6379}
database: ${REDIS_DATABASE:0}
password: ${REDIS_PASSWORD:}
timeout: 5000ms
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
timeout: ${REDIS_TIMEOUT:30000ms}
--- #################### MQ 消息队列相关配置 ####################
--- #################### 消息队列相关 ####################
# rocketmq 配置项,对应 RocketMQProperties 配置类
rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:127.0.0.1:9876}
# Producer 配置项
producer:
group: ${spring.application.name}_PRODUCER
spring:
rabbitmq:
host: ${RABBITMQ_HOST:127.0.0.1}
port: ${RABBITMQ_PORT:5672}
username: ${RABBITMQ_USERNAME:guest}
password: ${RABBITMQ_PASSWORD:guest}
kafka:
bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092}
--- #################### 服务保障相关配置 ####################
lock4j:
acquire-timeout: 3000
expire: 30000
--- #################### 监控相关配置 ####################
management:
endpoints:
web:
base-path: /actuator
exposure:
include: '*'
spring:
boot:
admin:
client:
instance:
service-host-type: IP
username: ${SPRING_BOOT_ADMIN_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_PASSWORD:admin}
logging:
level:
root: INFO
com.viewsh: ${LOG_LEVEL:INFO}
file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
--- #################### 芋道相关配置 ####################
--- #################### IoT 网关相关配置 ####################
viewsh:
demo: false
env:
tag: ${HOSTNAME:prod}
security:
mock-enable: false
iot:
# 消息总线配置
message-bus:
type: ${IOT_MESSAGE_BUS_TYPE:redis}
# 网关配置
gateway:
# 设备 RPC 配置
rpc:
url: ${IOT_RPC_URL:http://127.0.0.1:48091}
connect-timeout: ${IOT_RPC_CONNECT_TIMEOUT:30s}
read-timeout: ${IOT_RPC_READ_TIMEOUT:30s}
# 设备 Token 配置
token:
secret: ${IOT_TOKEN_SECRET:viewshIotGatewayTokenSecret123456789}
expiration: ${IOT_TOKEN_EXPIRATION:7d}
# 协议配置
protocol:
# ====================================
# 针对引入的 HTTP 组件的配置
# ====================================
http:
enabled: ${IOT_HTTP_ENABLED:true}
server-port: ${IOT_HTTP_PORT:8092}
# ====================================
# 针对引入的 EMQX 组件的配置
# ====================================
emqx:
enabled: ${IOT_EMQX_ENABLED:false}
http-port: ${IOT_EMQX_HTTP_PORT:8090}
mqtt-host: ${IOT_EMQX_MQTT_HOST:127.0.0.1}
mqtt-port: ${IOT_EMQX_MQTT_PORT:1883}
mqtt-username: ${IOT_EMQX_MQTT_USERNAME:admin}
mqtt-password: ${IOT_EMQX_MQTT_PASSWORD:public}
mqtt-client-id: ${IOT_EMQX_MQTT_CLIENT_ID:iot-gateway-mqtt}
mqtt-ssl: ${IOT_EMQX_MQTT_SSL:false}
mqtt-topics:
- "/sys/#"
clean-session: true
keep-alive-interval-seconds: 60
max-inflight-queue: 10000
connect-timeout-seconds: 10
# 是否信任所有 SSL 证书 (默认: false)。警告:生产环境必须为 false
# 仅在开发环境或内网测试时,如果使用了自签名证书,可以临时设置为 true
trust-all: ${IOT_EMQX_TRUST_ALL:false}
# 遗嘱消息配置 (用于网关异常下线时通知其他系统)
will:
enabled: ${IOT_EMQX_WILL_ENABLED:true}
topic: "gateway/status/${viewsh.iot.gateway.emqx.mqtt-client-id}"
payload: "offline"
qos: 1
retain: true
# 高级 SSL/TLS 配置 (当 trust-all: false 且 mqtt-ssl: true 时生效)
ssl-options:
key-store-path: ${IOT_EMQX_SSL_KEYSTORE_PATH:classpath:certs/client.jks}
key-store-password: ${IOT_EMQX_SSL_KEYSTORE_PASSWORD:your-keystore-password}
trust-store-path: ${IOT_EMQX_SSL_TRUSTSTORE_PATH:classpath:certs/trust.jks}
trust-store-password: ${IOT_EMQX_SSL_TRUSTSTORE_PASSWORD:your-truststore-password}
# ====================================
# 针对引入的 TCP 组件的配置
# ====================================
tcp:
enabled: ${IOT_TCP_ENABLED:false}
port: ${IOT_TCP_PORT:8091}
keep-alive-timeout-ms: ${IOT_TCP_KEEPALIVE_TIMEOUT:30000}
max-connections: ${IOT_TCP_MAX_CONNECTIONS:1000}
ssl-enabled: ${IOT_TCP_SSL_ENABLED:false}
ssl-cert-path: ${IOT_TCP_SSL_CERT_PATH:classpath:certs/client.jks}
ssl-key-path: ${IOT_TCP_SSL_KEY_PATH:classpath:certs/client.jks}
# ====================================
# 针对引入的 MQTT 组件的配置
# ====================================
mqtt:
enabled: ${IOT_MQTT_ENABLED:true}
port: ${IOT_MQTT_PORT:1883}
max-message-size: ${IOT_MQTT_MAX_MESSAGE_SIZE:8192}
connect-timeout-seconds: ${IOT_MQTT_CONNECT_TIMEOUT:60}
ssl-enabled: ${IOT_MQTT_SSL_ENABLED:false}
--- #################### 日志相关配置 ####################
# 基础日志配置
logging:
file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
level:
# 应用基础日志级别
com.viewsh.module.iot.gateway: ${LOG_LEVEL_IOT_GATEWAY:INFO}
org.springframework.boot: INFO
# RocketMQ 日志
org.apache.rocketmq: WARN
# MQTT 客户端日志
# io.vertx.mqtt: DEBUG
# 生产环境日志
com.viewsh.module.iot.gateway.protocol.emqx: ${LOG_LEVEL_EMQX:INFO}
com.viewsh.module.iot.gateway.protocol.http: ${LOG_LEVEL_HTTP:INFO}
com.viewsh.module.iot.gateway.protocol.mqtt: ${LOG_LEVEL_MQTT:INFO}
# 根日志级别
root: INFO
debug: false