随着业务的倒退、微服务架构的降级,服务的数量、程序的配置日益增多(各种微服务、各种服务器地址、各种参数),传统的配置文件形式和数据库的形式已无奈满足开发人员对配置管理的要求:
- 安全性:配置追随源代码保留在代码库中,容易造成配置透露。
- 时效性:批改配置,须要重启服务能力失效。
- 局限性:无奈反对动静调整:例如日志开关、性能开关。
因而,分布式配置核心应运而生!
应用 Nacos 之前首先理解一下 SpringBoot 配置文件 bootstrap 与 application 的加载程序: - bootstrap.yml(bootstrap.properties)先加载
- application.yml(application.properties)后加载
- bootstrap.yml 用于应用程序上下文的疏导阶段
- bootstrap.yml 由父 Spring ApplicationContext 加载
Nacos 的 Config 默认读取的是 bootstrap.yml 配置文件,如果将 Nacos Config 的配置写到 application.yml 外面,工程启动时就会始终报错。
1、在 GitEgg-Platform 工程的子工程 gitegg-platform-cloud 中引入 spring-cloud-starter-alibaba-nacos-config 依赖, 从新 install GitEgg-Platform 工程,而后 GitEgg-Cloud 我的项目须要从新在 IDEA 中执行 Reload All Maven Projects。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>GitEgg-Platform</artifactId>
<groupId>com.gitegg.platform</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gitegg-platform-cloud</artifactId>
<name>${project.artifactId}</name>
<version>${project.parent.version}</version>
<packaging>jar</packaging>
<dependencies>
<!-- Nacos 服务注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos 分布式配置 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
</project>
2、因为 Nacos 默认读取服务配置要写在 bootstrap.yml 中,所以咱们在 gitegg-service-system 工程下新建 bootstrap.yml 文件,同时在 bootstrap.yml 做好 Nacos Config 的配置
server:
port: 8001
spring:
application:
name: gitegg-service-system
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yml
group: DEFAULT_GROUP
enabled: true
3、在 Nacos 服务器上新建 gitegg-service-system.yaml 配置,将 application.yml 外面的配置信息复制到 Nacos 服务器上的配置信息里,而后删除 application.yml,在 Nacos Spring Cloud 中,dataId
的残缺格局如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也能够通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为以后环境对应的 profile,详情能够参考 Spring Boot 文档。 留神:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格局变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,能够通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只反对properties
和yaml
类型。
具体配置信息能够参考 Spring Boot 文档
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1/gitegg_cloud?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
username: root
password: root
initialSize: 1
minIdle: 3
maxActive: 20
# 配置获取连贯期待超时的工夫
maxWait: 60000
# 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连贯在池中最小生存的工夫,单位是毫秒
minEvictableIdleTimeMillis: 30000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 关上 PSCache,并且指定每个连贯上 PSCache 的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦挡的 filters,去掉后监控界面 sql 无奈统计,'wall' 用于防火墙
filters: config,stat,slf4j
# 通过 connectProperties 属性来关上 mergeSql 性能;慢 SQL 记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
# 合并多个 DruidDataSource 的监控数据
useGlobalDataSourceStat: true
mybatis-plus:
mapper-locations: classpath*:/com/gitegg/*/*/mapper/*Mapper.xml
typeAliasesPackage: com.gitegg.*.*.entity
global-config:
#主键类型 0:"数据库 ID 自增", 1:"用户输出 ID",2:"全局惟一 ID (数字类型惟一 ID)", 3:"全局惟一 ID UUID";
id-type: 2
#字段策略 0:"疏忽判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: true
#刷新 mapper 调试神器
refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
#逻辑删除配置
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
4、以上就能够读取配置文件了,咱们在 SystemController.java 外面增加读取配置的测试代码,读取配置的某一个属性,如果须要读取实时刷新数据,能够增加 @RefreshScope 注解
package com.gitegg.service.system.controller;
import com.gitegg.platform.boot.common.base.Result;
import com.gitegg.platform.boot.common.exception.BusinessException;
import com.gitegg.service.system.dto.SystemDTO;
import com.gitegg.service.system.service.ISystemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping(value = "system")
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@Api(tags = "gitegg-system")
@RefreshScope
public class SystemController {
private final ISystemService systemService;
@Value("${spring.datasource.maxActive}")
private String nacosMaxActiveType;
@GetMapping(value = "list")
@ApiOperation(value = "system list 接口")
public Object list() {return systemService.list();
}
@GetMapping(value = "page")
@ApiOperation(value = "system page 接口")
public Object page() {return systemService.page();
}
@GetMapping(value = "exception")
@ApiOperation(value = "自定义异样及返回测试接口")
public Result<String> exception() {return Result.data(systemService.exception());
}
@PostMapping(value = "valid")
@ApiOperation(value = "参数校验测试接口")
public Result<SystemDTO> valid(@Valid @RequestBody SystemDTO systemDTO) {return Result.data(systemDTO);
}
@PostMapping(value = "nacos")
@ApiOperation(value = "Nacos 读取配置文件测试接口")
public Result<String> nacos() {return Result.data(nacosMaxActiveType);
}
}
5、启动我的项目,关上浏览器拜访:http://127.0.0.1:8001/doc.html,点击 Nacos 读取配置文件测试接口菜单,进行测试,能够查看读取到的配置信息,因为增加了 @RefreshScope,咱们测试实时刷新性能,手动批改 Nacos 外面的 spring.datasource.maxActive 配置,再次执行测试接口,能够看到读取到的配置信息已刷新
本文源码在 https://gitee.com/wmz1930/GitEgg 的 chapter-10 分支。