前言
公司的所有cloud微服务项目,目前都是在配置文件中配置了多套环境的配置文件,然后在启动时指定配置文件来加载启动。这样虽说可以,但是十分不便捷。在项目启动后,不能动态的修改配置参数,如果修改配置信息,只能通过重启服务器来实现。
介绍
可以看到整个结构包括三个部分,客户端(各个微服务应用),服务端(中介者),配置仓库(可以是本地文件系统或者远端仓库,包括git,svn等)。
- 配置仓库中放置各个配置文件(.yml 或者.properties)
- 服务端指定配置文件存放的位置
- 客户端指定配置文件的名称
这中结构配置进行集中化管理,因为是分布式应用,当修改某个应用的配置的时候,就不需要到该应用中去修改相关的配置,并且修改之后还有重启应用,相对来说很麻烦。当迁移仓库的位置时,只需要修改server中的配置即可,Client中无需进行任何修改。
并且spring cloud config还支持热更新,当你修改了配置文件中的配置,通过post: http://hostname:port/actuator/refresh 到server 应用操作,可以实现配置热更新,当Client中的类使用了@RefreshScope 注解,那么该类再次使用时,新更改的配置会生效。
项目结构
1、依赖
1.1、父模块依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>2.6.11</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springcloudalibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.2、子模块依赖
<dependencies>
<!--config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- spring boot starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--mybatis-plus-->
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!--MySQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
</dependencies>
2、配置文件
1、bootstrap.yml
spring:
application:
name: nacos-config-client #默认,如果配置中心有则读取配置中心的
cloud:
nacos:
discovery:
server-addr: localhost:8848 #将Nacos服务作为注册中心
config:
server-addr: localhost:8848 #将Nacos作为配置中心
file-extension: yaml #指定yaml格式的配置
2、application.yaml
spring:
profiles:
active: dev #激活开发环境的配置文件
server:
port: 3355
3、controller
@RestController()
@RefreshScope//nacos配置文件动态刷新
@RequestMapping("/config")
public class ConfigController {
@Value("${spring.application.name}")
private String name;
@Resource
private TestServiceImpl testService;
/**
* 测试远程获取配置文件
* @return
*/
@GetMapping("/getname")
public String getName(){
return name;
}
/**
* 获取集合列表
* @return
*/
@GetMapping("/getlist")
public List<Test> getList(){
return testService.list();
}
}
@RefreshScope:nacos配置文件动态刷新 ,如不加此注解每次修改nacos中的配置文件需要重启服务。:
4、界面端
DataID:DataId 默认使用 spring.application.name
配置跟文件扩展名结合(配置格式默认使用 yaml)
dataid配置默认使用服务应用名称
浏览器访问:输出的是配置中心的
5、踩坑记录
1、boot版本高于2.4,bootstrap文件不生效,导致启动报错
解决方案:
@SpringBootApplication
@EnableDiscoveryClient
public class Config_3001 {
public static void main(String[] args) {
//解决bootstrap.yml 文件找不到问题 boot版本高于2.4
System.setProperty("spring.cloud.bootstrap.enabled", "true");
SpringApplication.run(Config_3001.class, args);
}
}
6、整合MyBatisPlus
修改Nacos中的配置文件
spring:
application:
name: nacos-config-server
# 配置数据源
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/index_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
# 配置mybatis-plus
mybatis-plus:
type-aliases-package: com.example.demo.entity
mapper-locations: classpath:mapper/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
浏览器访问:localhost:3355/config/getlist