随着业务的倒退、微服务架构的降级,服务的数量、程序的配置日益增多(各种微服务、各种服务器地址、各种参数),传统的配置文件形式和数据库的形式已无奈满足开发人员对配置管理的要求:
- 安全性:配置追随源代码保留在代码库中,容易造成配置透露。
- 时效性:批改配置,须要重启服务能力失效。
- 局限性:无奈反对动静调整:例如日志开关、性能开关。
因而,分布式配置核心应运而生!
应用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: 8001spring: 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: truemybatis-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")@RefreshScopepublic 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分支。