1. 解决的问题:
- 配置动态更新
- 配置集中式管理
- 配置内容的安全性和权限
- 不同部署环境下的配置
2. 环境:
- idea
- spring cloud
- spring-cloud-alibaba nacos
- maven
- mqtt (客户端,服务器采用的是EMQ X 5.0 )
3. pom依赖
3.1 父级项目pom依赖
<properties>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<spring-cloud-alibaba-dependencies.version>2.2.8.RELEASE</spring-cloud-alibaba-dependencies.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring-cloud-alibaba 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-cloud 分布式架构引进-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</project>
3.2 模块中pom依赖
<!--nacos + feign-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--mqtt-->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 热部署模块 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
4.实战
4.1 配置文件
4.1.1 spring boot 配置文件加载优先级
spring boot 中两种以上文件时
- bootstrap 优先于 application
- Properties 优先于yaml/yml
本案例使用
- bootstrap.yaml ---- 连接nacos注册中心和配置中心信息
- application.yml ---- 环境配置
4.2 bootstrap.yaml
其中
- config-namespace: xxx-xxx-xxx-xxx-xxx 对应的是 iot
- spring.cloud.name: emq-client
- spring.cloud.nacos.config.group: AIOT
- spring.cloud.nacos.config.file-extension: yaml
nacos-server-addr: xxx.xxx.xxx.xxx:8848
discovery-namespace: xxx-xxx-xxx-xxx-xxx #建议discovery-namespace = config-namespace
config-namespace: xxx-xxx-xxx-xxx-xxx
spring:
application:
name: emq-client
cloud:
nacos:
discovery:
server-addr: ${nacos-server-addr} #注册中心地址
namespace: ${discovery-namespace}
# ip: ${host} #项目ip地址,当在生产环境时: 防止服务在注册中心的ip为内网地址
config:
auto-refresh: true # 开启自动刷新
# 配置文件的环境
group: AIOT
# 配置文件的格式
file-extension: yaml
# 配置中心的地址
server-addr: ${nacos-server-addr}
# 配置文件prefix
prefix: ${spring.application.name}
#命名空间
namespace: ${config-namespace}
#预加载功能:感觉该功能没有实际效果,可能是2.1.0版本已经优化,不需要该配置
# bootstrap:
# enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。
# log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。
4.3 application.yml
其中 spring.profiles.active: prod
spring:
profiles:
active: prod
4.4 naocs上建立配置文件
命名规范:
- ${spring.cloud.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
- 使用需要的文件名为 emq-client-prod.yaml
- 配置空间为:iot
- group: AIOT
故:需要在 iot 空间下建立 emq-client-prod.yaml 文件,分组 AIOT 中
5. 验证是否启动成功
- 读取远程nacos配置日志
- spring boot 启动成功日志