1. Интегрируйте Nacos
1) Настройте файл pom
<!--nacos-config 版本号和springboot对应-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!--nacos-discovery 版本号和springboot对应-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!--nacos-web 需要此依赖,不然服务列表里面服务注册不成功-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2) Изменить файл конфигурации
nacos по умолчанию читает файл bootstrap.xml
spring:
application:
name: test-server-tcp
profiles:
active: dev
cloud:
nacos:
discovery:
namespace: ${spring.profiles.active}
server-addr: 192.168.0.1:8848
config:
namespace: ${spring.profiles.active}
server-addr: 192.168.0.1:8848
ext-config:
- data-id: test-server-tcp.yml
group: ${spring.profiles.active}
refresh: true
3) Настройте интерфейс управления nacos
1. Создайте новое пространство имен
2. Создайте новый файл конфигурации
Во-вторых, конфигурация динамического чтения меняется
Добавьте аннотацию @RefreshScope к классу, который должен ссылаться на конфигурацию.
Образец кода:
@RefreshScope
@RestController
@RequestMapping(value="/config")
public class NacosConfig {
@Value(value = "${nacos.test-name}")
private String testName;
@Value(value = "${nacos.test-port}")
private String testPort;
@GetMapping(value = "/get")
public String getConfig(){
return "name: "+ testName +";" + "port: "+ testPort +";";
}
}
Вы можете проверить, действует ли динамическая конфигурация через URL-адрес http
3. После изменения динамической конфигурации задача синхронизации не выполняется.
Проблема: В программе есть запланированные задачи.Если конфигурация, считываемая запланированными задачами, изменяется динамически, то запланированные задачи выполняться не будут.
Причина: метод ленивой загрузки для запланированной задачи для чтения файла конфигурации
Решение: Реализуйте интерфейс в классе, где находится запланированная задача.
ApplicationListener<RefreshScopeRefreshedEvent> и реализовать его метод, просто пустой метод
PS: Все классы, которые используют временные задачи в программе, должны реализовывать вышеуказанный интерфейс.