@Component
@Configuration
public class DynamicRouteConfig implements ApplicationContextAware {
private static final Log log = LogFactory.getLog(DynamicRouteConfig.class);
@Autowired
private ApplicationContext applicationContext;
@Autowired
private RouteLocator routeLocator;
@Autowired
private ZuulProperties properties;
/**
* Description @ApolloConfigChangeListener配置改变监听器,触发时将会指向configChange()方法
* 获取到所有改变的配置中心的key
* value = "zuul-config" 为apollo中namespace名称
*
* @date 2023/5/6 17:22
* @param: changeEvent
* @return: void
*/
@ApolloConfigChangeListener(value = "zuul-config.yaml")
private void configChange(ConfigChangeEvent changeEvent) {
// 获取路由
Map<String, ZuulProperties.ZuulRoute> routes = properties.getRoutes();
boolean flat = false;
for (String key : changeEvent.changedKeys()) {
// 事件内容判断
if (key.startsWith("zuul.") || key.contains("ribbon.listOfServers")) {
// 路由是否需要刷新的标识
flat = true;
// 根据路由改变类型判断路由是否需要删除
PropertyChangeType changeType = changeEvent.getChange(key).getChangeType();
// 删除类的改变类型
if (PropertyChangeType.DELETED.equals(changeType)) {
String[] split = key.split("\\.");
String deleteTarget = split[2];
Set<String> needDeleteKeys = routes.keySet();
if (needDeleteKeys.contains(deleteTarget)) {
routes.remove(deleteTarget);
}
}
}
}
// 重新设置路由
properties.setRoutes(routes);
// zuul路由刷新
if (flat) {
this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
this.applicationContext.publishEvent(new RoutesRefreshedEvent(this.routeLocator));
}
}
/**
* Description 路由更新操作
*
* @date 2023/5/8 14:06
* @param: routeEntries
* @return: void
*/
private void addConfiguredRoutes(List<ZuulProperties.ZuulRoute> routeEntries) {
// key为yaml中定义的信息
Map<String, ZuulProperties.ZuulRoute> routes = this.properties.getRoutes();
for (ZuulProperties.ZuulRoute routeEntry : routeEntries) {
String route = routeEntry.getPath();
if (routes.containsKey(route)) {
log.warn("Overwriting route " + route + ": already defined by "
+ routes.get(route));
}
routes.put(route, routeEntry);
}
//新路由集合重新设置
this.properties.setRoutes(routes);
}
/**
* Description 获取web上下文
*
* @date 2023/5/6 17:21
* @param: applicationContext
* @return: void
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* Description 从path中提取ZuulRoute的id
*
* @date 2023/5/8 14:30
* @param: path
* @return: java.lang.String
*/
private String extractId(String path) {
path = path.startsWith("/") ? path.substring(1) : path;
path = path.replace("/*", "").replace("*", "");
return path;
}
}
zuul+apollo实现zuul网关动态路由
最新推荐文章于 2024-05-01 19:17:00 发布