动态配置,不用重新启动项目
在云端设置一套配置信息,所有的项目都读取这一套配置
1.专业名词解释
Namespace:代表不同环境,如开发、测试、生产环境。
Group:代表某项目,如XX医疗项目、XX电商项目
DataId:每个项目下往往有若干个工程(微服务),每个配置集(DataId)是一个工程(微服务)的主配置文件
namespace:相当于环境,开发环境 测试环境 生产环境 ,每个空间里面的配置是独立的 (默认是 public)
group:这个类似我们的项目,比如 风控系统 ,交易系统, 就是不同的项目
2.配置获取的步骤如下
配置中心的启动相关配置,如group,server-addr 是从application.yml中读取的
3.项目实践
实现效果 dev/pro 不同命名空间下,对某个项目(组) 读取开发环境、生产环境的数据库信息
3.1 创建一个新的Maven子项目 cloud-config-nacos-client3377
3.1.1 pom.xml 引入关键依赖 因为要连接数据库
<dependencies> <!--公共项目--> <dependency> <groupId>ins.cloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!--nacos-config 配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--nacos-discovery 注册中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- Fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency> </dependencies>
3.1.2 resources文件夹下新建 bootstrap.yml
3.1.2.1 使用 bootstrap.yml ;该配置文件优先级高于 application
3.1.2.2 Namespace必须在bootstrap.yml
配置文件中指定,否则不生效。
3.1.2.3 application.yml
spring:
profiles:
active: dev
3.1.2.4 bootstrap.yml
server:
port: 3377
spring:
application:
name: @project.artifactId@
profiles:
active: dev
cloud:
nacos:
# Nacos 认证用户
username: nacos
# Nacos 认证密码
password: nacos
discovery:
#服务注册中心地址
server-addr: ${NACOS_HOST:82.156.175.242}:${NACOS_PORT:8848}
config:
#配置中心地址
server-addr: ${spring.cloud.nacos.discovery.server-addr}
#指定yaml格式的配置(yml和yaml都可以)
file-extension: yaml
#指定命名空间 开发工作空间
namespace: f2475b83-0fa8-42c4-acf0-1c64875cce92
#指定组
group: MES_DEV_GROUP
-- yml文件中${}的使用
${key:default_value}
这种表达方式是通过key来获取value,如果获取不到就使用后面默认值。
可以在jar包启动的时候 指定key
-- 读取pom文件中的配置 @artifactId@
-- 解决问题:SpringBoot中application.yml无法使用@@读取pom.xml中标签值
父级项目中配置
<build> <!--如果不设置resource 会导致application.yml中的@@找不到pom文件中的配置--> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
3.1.3 启动类
@EnableDiscoveryClient @SpringBootApplication public class NacosConfigClientMain3377{ public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class, args); } }
3.1.3 业务类:ConfigClientController
@RestController @RefreshScope //通过SpringCould原生注解@RefreshScope实现配置自动更新 public class ConfigClientController{ @Value("${config.info}") //对应nacos配置:nacos-config-client-dev.yaml private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }
// 数据库查询接口
通过SpringCould原生注解@RefreshScope实现配置自动更新
3.2 nocos图形化操作
3.2.1 新建两个命名空间,记住命名空间ID配置中会用到
3.2.2 DataId 说明
公式: ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
项目名-当前环境对应的profile.数据格式
3.2.3 nacos 中配置项目的连接池,mysql的连接信息等信息
spring: datasource: druid: url: jdbc:mysql://ip:3306/tsbx_cloud?Timezone=UTC&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useServerPrepStmts=true&cachePrepStmts=true&useSSL=false username: root password: tsbx8888 max-wait: 10000 min-idle: 5 initial-size: 5 max-active: 100 web-stat-filter: enabled: false devtools: add-properties: false management: endpoints: web: exposure: include: '*' mybatis: mapperLocations: classpath:/mapper/*/*.xml #实体类所在的包,配置号后mapper.xml不需要写实体类的完整路径 #type-aliases-package: com.atguigu.springcloud.entities config: info: nacos-config-client-dev.yaml正式
4. 历史配置:Nacos会记录配置文件的历史版本默认保留30天
5.多环境的配置
5.1 springboot 多环境配置
spring cloud用上了配置中心,配置中心就会默认只读取bootstrap.yml,配置中心的启动相关配置,如group,server-addr
5.2 nacos配置中心多环境配置
5.3 Nacos(五):多环境下如何“读取”Nacos中相应的配置 Nacos(六):多环境下如何“管理”及“隔离”配置和服务 (没看懂)
5.2 思路: 通过配置父pom ,子项目 bootstrap.yml文件中读取父项目的pom
5.2.1 父项目 pom文件的配置
<build> <!--如果不设置resource 会导致yml中的@@找不到pom文件中的配置--> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.1</version> <!-- 解决 jar包中没有主清单属性的问题--> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <!--热部署工具--> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build> <!-- 环境 --> <profiles> <!--开发--> <profile> <id>dev</id> <activation> <!-- 默认激活配置 --> <activeByDefault>true</activeByDefault> </activation> <properties> <!--当前环境--> <profile.name>dev</profile.name> <!--配置文件前缀--> <!-- <prefix.name>mes</prefix.name>--> <!--Nacos配置中心地址--> <config.server-addr>82.156.175.242</config.server-addr> <!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空--> <config.namespace>f2475b83-0fa8-42c4-acf0-1c64875cce92</config.namespace> <!--Nacos配置分组名称--> <config.group>MES_DEV_GROUP</config.group> <!--Nacos服务发现地址--> <discovery.server-addr>82.156.175.242</discovery.server-addr> </properties> </profile> <!--生产--> <profile> <id>prod</id> <properties> <!--当前环境--> <profile.name>prod</profile.name> <!--配置文件前缀--> <!-- <prefix.name>mes</prefix.name>--> <!--Nacos配置中心地址--> <config.server-addr>82.156.175.242</config.server-addr> <!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空--> <config.namespace>52319686-40f5-4725-9746-a29b0275f3db</config.namespace> <!--Nacos配置分组名称--> <config.group>MES_PROD_GROUP</config.group> <!--Nacos服务发现地址--> <discovery.server-addr>82.156.175.242</discovery.server-addr> </properties> </profile> </profiles>
5.2.2 子项目中bootstrap.yml 通过@XX@ 读取 父项目pom文件中配置信息
server: port: 3377 spring: application: name: @project.artifactId@ profiles: active: @profile.name@ cloud: nacos: # Nacos 认证用户 username: nacos # Nacos 认证密码 password: nacos discovery: #服务注册中心地址 server-addr: @discovery.server-addr@ config: #配置中心地址 server-addr: ${spring.cloud.nacos.discovery.server-addr} #指定yaml格式的配置(yml和yaml都可以) file-extension: yaml #指定命名空间 开发工作空间 namespace: @config.namespace@ #指定组 group: @config.group@
5.x 多环境 启动和打包 选择
6.nacos 共享配置
6.2 当前环境 > 共享环境 》本地环境
6.3 实操 bootstrap.yml 添加共享配置信息,多个 配置文件 用逗号隔开
6.4 Nacos 新建配置 dev/prod 环境下 所有的 项目共享
7.多环境打jar包启动 spring-boot-maven-plugin:没有主清单程序
解决方法:父项目pom.xml 在引入该插件的标签内加上 <executions> 标签
<build> <!--如果不设置resource 会导致yml中的@@找不到pom文件中的配置--> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.1</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build>
8. 公共依赖项目 install IDEA打包出现Unable to find main class
解决方法 在pom.xml中加入以下配置: 目前其他子模块是没有引入maven插件的
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.1</version> <configuration> <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 --> </configuration> <executions> <execution> <phase>none</phase> </execution> </executions> </plugin> </plugins> </build>
9. jar包在本地启动的时候报错 需要指定编码格式 且要使用cmd 不能用powershell
9.1 parse data from Nacos error,dataId
- 分析原因,nacos读取配置文件默认使用UTF-8,通过cmd启动项目,项目默认编码格式为GBK,导致问题出现
- 解决办法:添加启动参数-Dfile.encoding=utf-8 ,则能正常启动并读取远程配置
java -Dfile.encoding=utf-8 -jar test.jar
9.2 使用powershell 打开 找不到或无法加载主类 .encoding=utf-8 解决
解决办法: 使用cmd 进行打开
10.1 进入 com.alibaba.cloud.nacos.client.NacosPropertySourceLocator#loadApplicationConfiguration 这个方法
10.2 com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder#loadNacosData
看看请求com.alibaba.nacos.client.config.http.ServerHttpAgent#httpGet