作用:
- 实现配置热更新
- 实现网关配置热部署
配置模板
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${db.gulimall.host:192.168.229.128}:${db.gulimall.port:3306}/{$db.gulimall.database:my_db}
username: ${db.gulimall.user:root}
password: ${db.gulimall.password:dzjdzj}
${导入时需要额外在配置文件声明的内容:没有声明的话,填值的默认内容}
通常共享的配置为shared-开头
实现从nacos导入配置
使用springcloud与springboot的启动流程有所不同,所以cloud统一结合了一下
不一定非要bootstrap,使用application.properties也可以,关键在于这个流程中进行的顺序(只要别配置nacos到yml文件即可)
导入依赖
<!-- nacos配置管理依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.0.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
配置模板
spring:
application:
name: hhhh
profiles:
active: dev #为什么这个和application name也要放这里?下面有填坑
cloud:
nacos:
config:
shared-configs:
- dataId: shared-jdbc.yaml
file-extension: yaml
server-addr: 192.168.229.128:8848
关于dataId,其实可以配置的不止dataId,共有以下三个
private String dataId;
private String group;
private boolean refresh;
配置热更新
之前配置的那些mybatis,mysql都不支持热更新
这是相当合理的行为:
- springboot会生成不少组件,如果这些支持热更新,那么需要他们把对应bean的属性更改,但是他们并没有这样
- 通常这些东西实现热更新是高风险行为,如果真该热更新,应该停服重启
真正该热更新的是我们业务中的需要热更新的业务
如:购物车的存储上限
需要配置一个配置类
@Data
@Component
@ConfigurationProperties(prefix="db.gulimall")
public class CartProperties{
private int maxSize;//最好与配置文件同名,大概通过get/set设置,这是规范
}
填坑为什么还要application name 和 profile active
因为在连上nacos后,启动项目会自动找application name-active.yaml和application name.yaml来读取配置
所以nacos配置某服务特有配置文件时
要按照对应的规格application name-profile active.yaml
动态路由
正常情况下,路由不需要实现热更新,如果要实现,由于是springcloud的实现,所以我们需要额外处理业务
注意点
- nacos关于网关的配置只支持JSON形式
[
{
"id":"item",
"predicates":[{
"name":"Path",
"args":{"genkey 0":"/items/**","genkey 1":"search/**"}
}],
"filters":[],
"uri":"lb;//item-service"
},
]
- 使用cloud route更新的RouteDefinitionWriter写入以及删除机制(注入RouteDefinitionWriter)
- 他插入的模式不太一样,需要用到Mono,Mono类似一个容器,然后just是发射的功能/意思,subscribe是订阅
- 在更新时,要先删除旧有的routeDifinition
- 需要使用到NacosConfigManager组件来定义监听器
- ctrl+shift+U:转为大写
- 还要@PostConstruct在组件注入后再调用该方法生成监听器
模板:
@Component
@RequiredArgsConstructor
public class RouteConfigLoader {
private final NacosConfigManager configManager;
private final static String DATA_ID="gateway.json";
private final static String GROUP="DEFAULT";
private final RouteDefinitionWriter writer;
private Set<String> oldIds=new HashSet<>();
@PostConstruct
public void routeInit() throws NacosException {
String configInfo = configManager.getConfigService().getConfigAndSignListener(DATA_ID, GROUP, 5000, new Listener() {
@Override
public Executor getExecutor() {
return Executors.newSingleThreadExecutor();
}
@Override
public void receiveConfigInfo(String configInfo) {
updateRoutes(configInfo);
}
});
updateRoutes(configInfo);
}
private void updateRoutes(String configInfo) {
List<RouteDefinition> routeDefinitions = JSONUtil.toList(configInfo, RouteDefinition.class);
//删除旧有的routes
for (String oldId : oldIds) {
writer.delete(Mono.just(oldId)).subscribe();//删除
}
//新增目前的routes
oldIds.clear();
for (RouteDefinition routeDefinition : routeDefinitions) {
writer.save(Mono.just(routeDefinition)).subscribe();//添加进去
oldIds.add(routeDefinition.getId());
}
}
}
标签:String,spring,配置,配置管理,private,db,cloud,name
From: https://www.cnblogs.com/seamount3/p/17784197.html