feat(upms): 单体模式下不执行路由初始化

This commit is contained in:
冷冷 committed 2025-03-09 21:30:22 +08:00
1 parent eb161c980c
commit 3f61218111
1 file changed
+52 -47
@@ -27,11 +27,13 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@@ -51,62 +53,65 @@ import java.util.Map;
@Slf4j
@Configuration
@RequiredArgsConstructor
@ConditionalOnDiscoveryEnabled
public class DynamicRouteInitRunner implements InitializingBean {
private final RedisTemplate redisTemplate;
private final RedisTemplate<String, String> redisTemplate;
private final SysRouteConfService routeConfService;
private final SysRouteConfService routeConfService;
private final RedisMessageListenerContainer listenerContainer;
private final RedisMessageListenerContainer listenerContainer;
/**
* WebServerInitializedEvent 使用 TransactionalEventListener 时启动时无法获取到事件
*/
@Async
@Order
@EventListener({ WebServerInitializedEvent.class })
public void WebServerInit() {
this.initRoute();
}
/**
* WebServerInitializedEvent 使用 TransactionalEventListener 时启动时无法获取到事件
*/
@Async
@Order
@EventListener({WebServerInitializedEvent.class})
public void WebServerInit() {
this.initRoute();
}
@Async
@Order
@TransactionalEventListener({ DynamicRouteInitEvent.class })
public void initRoute() {
redisTemplate.delete(CacheConstants.ROUTE_KEY);
log.info("开始初始化网关路由");
@Async
@Order
@TransactionalEventListener({DynamicRouteInitEvent.class})
public void initRoute() {
redisTemplate.delete(CacheConstants.ROUTE_KEY);
log.info("开始初始化网关路由");
routeConfService.list().forEach(route -> {
RouteDefinitionVo vo = new RouteDefinitionVo();
vo.setRouteName(route.getRouteName());
vo.setId(route.getRouteId());
vo.setUri(URI.create(route.getUri()));
vo.setOrder(route.getSortOrder());
routeConfService.list().forEach(route -> {
RouteDefinitionVo vo = new RouteDefinitionVo();
vo.setRouteName(route.getRouteName());
vo.setId(route.getRouteId());
vo.setUri(URI.create(route.getUri()));
vo.setOrder(route.getSortOrder());
JSONArray filterObj = JSONUtil.parseArray(route.getFilters());
vo.setFilters(filterObj.toList(FilterDefinition.class));
JSONArray predicateObj = JSONUtil.parseArray(route.getPredicates());
vo.setPredicates(predicateObj.toList(PredicateDefinition.class));
vo.setMetadata(JSONUtil.toBean(route.getMetadata(), Map.class));
log.info("加载路由ID:{},{}", route.getRouteId(), vo);
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class));
redisTemplate.opsForHash().put(CacheConstants.ROUTE_KEY, route.getRouteId(), vo);
});
JSONArray filterObj = JSONUtil.parseArray(route.getFilters());
vo.setFilters(filterObj.toList(FilterDefinition.class));
JSONArray predicateObj = JSONUtil.parseArray(route.getPredicates());
vo.setPredicates(predicateObj.toList(PredicateDefinition.class));
vo.setMetadata(JSONUtil.toBean(route.getMetadata(), Map.class));
log.info("加载路由ID:{},{}", route.getRouteId(), vo);
// 通知网关重置路由
redisTemplate.convertAndSend(CacheConstants.ROUTE_JVM_RELOAD_TOPIC, "路由信息,网关缓存更新");
log.debug("初始化网关路由结束 ");
}
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class));
HashOperations<String, String, RouteDefinitionVo> stringStringValueOperations = redisTemplate.opsForHash();
stringStringValueOperations.put(CacheConstants.ROUTE_KEY, route.getRouteId(), vo);
});
/**
* redis 监听配置,监听 upms_redis_route_reload_topic,重新加载Redis
*/
@Override
public void afterPropertiesSet() {
listenerContainer.addMessageListener((message, bytes) -> {
log.warn("接收到重新Redis 重新加载路由事件");
initRoute();
}, new ChannelTopic(CacheConstants.ROUTE_REDIS_RELOAD_TOPIC));
}
// 通知网关重置路由
redisTemplate.convertAndSend(CacheConstants.ROUTE_JVM_RELOAD_TOPIC, "路由信息,网关缓存更新");
log.debug("初始化网关路由结束 ");
}
/**
* redis 监听配置,监听 upms_redis_route_reload_topic,重新加载Redis
*/
@Override
public void afterPropertiesSet() {
listenerContainer.addMessageListener((message, bytes) -> {
log.warn("接收到重新Redis 重新加载路由事件");
initRoute();
}, new ChannelTopic(CacheConstants.ROUTE_REDIS_RELOAD_TOPIC));
}
}