package routes;
import cn.hutool.json.JSONUtil;
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor;
@Slf4j
@Component
@RequiredArgsConstructor
public class DynamicRouteLoader {
//获取congfigservice
private final NacosConfigManager nacosConfigManager;
//路由跟新工具
private final RouteDefinitionWriter routeDefinitionWriter;
//定义一个容器记忆删除的路由
private final Set<String> routesId= new HashSet<>();
private final String dataId="gateway-routes.json";
private final String group ="DEFAULT_GROUP";
@PostConstruct //bean被注入之后就会自动执行这个方法
public void initRouteConfigListener() throws NacosException {
//1.项目启动时,会先拉取一次配置,并且添加监听器
String configInfo = nacosConfigManager.getConfigService().getConfigAndSignListener(dataId, group, 5000, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String s) {
//监听到配置变更后,需要更新路由表
updateConfigInfo(s);
}
});//获取配置并添加监听器
//2.将第一次拉取到的配置更新到路由表上
updateConfigInfo(configInfo);
}
//定义一个更新路由表的方法
public void updateConfigInfo(String configInfo){
log.debug("监听到路由配置信息:{}",configInfo);
//解析configInfo,转成routedefinition文件
List<RouteDefinition> routeDefinitions = JSONUtil.toList(configInfo, RouteDefinition.class);
//先删除旧的全部的路由表
for (String s : routesId) {
routeDefinitionWriter.delete(Mono.just(s)).subscribe();
}
routesId.clear();
//跟新路由表
for (RouteDefinition routeDefinition : routeDefinitions) {
//使用工具来进行更新,mono是一个容器,封装一个数据
routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();
//记录路由id,便于下一次更新时删除
routesId.add(routeDefinition.getId());
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式项目仓库springCloud项目-分布式
资源推荐
资源详情
资源评论
收起资源包目录
spring-cloud-project-master.zip (11个子文件)
spring-cloud-project-master
hm-common
src
main
resources
META-INF
spring.factories 219B
java
com
hmall
common
config
Mqconfig.java 453B
MvcConfig.java 809B
interceptors
UserinfoInterceptor.java 925B
hm-geteway
src
main
resources
bootstrap.yaml 249B
java
routes
DynamicRouteLoader.java 3KB
cart--service
src
main
resources
bootstrap.yaml 333B
java
com
hmall
cart
listener
CartListener.java 1KB
config
CartConfig.java 447B
hm-api
src
main
java
com
hmall
api
fallback
ItemClientFallbackFactory.java 794B
config
Intercepterconfig.java 825B
共 11 条
- 1
资源评论
tutu-ren
- 粉丝: 1513
- 资源: 144
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功