SpringCloud Gateway 路由配置变更的时候,如果不重启网关,是无法生效的,本文介绍如果在不重启网关的情况下,动态刷新路由配置 。
一、解决路由无法删除的问题 【SpringCloud Gateway 动态路由】Spring Cloud Gateway 默认使用的基于内存为存储器的 InMemoryRouteDefinitionRepository,在GatewayAutoConfiguration中可以看到
@Bean@ConditionalOnMissingBean(RouteDefinitionRepository.class)public InMemoryRouteDefinitionRepository inMemoryRouteDefinitionRepository() { return new InMemoryRouteDefinitionRepository();} 在InMemoryRouteDefinitionRepository中我们可以看到,只有根据路由id去删除路由的操作 。而要获取需要删除的路由的id,是比较复杂的 。所以我们在路由变更的时候采用比较暴力的方式,即清空->重新加载 。所以我们需要对InMemoryRouteDefinitionRepository进行改造 。
基于此,我们重新定义了CustomInMemoryRouteDefinitionRepository 。代码如下:
import org.springframework.cloud.gateway.route.RouteDefinition;import org.springframework.cloud.gateway.route.RouteDefinitionRepository;import org.springframework.cloud.gateway.support.NotFoundException;import org.springframework.util.ObjectUtils;import reactor.core.publisher.Flux;import reactor.core.publisher.Mono;import java.util.LinkedHashMap;import java.util.Map;import static java.util.Collections.synchronizedMap;/** * @Author: Flex.Zang * @Date: 2022/3/28 15:44 * 解决无法删除路由的问题 */public class CustomInMemoryRouteDefinitionRepository implements RouteDefinitionRepository {private static final String DELETE = "delete";private final Map routes = synchronizedMap(new LinkedHashMap());@Overridepublic Mono 并将默认的RouteDefinitionRepository替换成我们定义的CustomInMemoryRouteDefinitionRepository,代码如下
@Beanpublic RouteDefinitionRepository routeDefinitionRepository() {return new CustomInMemoryRouteDefinitionRepository();} 二、定义动态路由操作类 此处内容较简单,直接上代码
import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.gateway.event.RefreshRoutesEvent;import org.springframework.cloud.gateway.route.RouteDefinition;import org.springframework.cloud.gateway.route.RouteDefinitionWriter;import org.springframework.context.ApplicationEventPublisher;import org.springframework.context.ApplicationEventPublisherAware;import org.springframework.stereotype.Component;import reactor.core.publisher.Mono;/** * @Author: Flex.Zang * @Date: 2022/3/28 13:38 */@Slf4j@Componentpublic class DynamicRouteService implements ApplicationEventPublisherAware {private final RouteDefinitionWriter routeDefinitionWriter;private ApplicationEventPublisher publisher;private static final String CONS_DELETE = "delete";@Autowiredpublic DynamicRouteService(RouteDefinitionWriter routeDefinitionWriter) {this.routeDefinitionWriter = routeDefinitionWriter;}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher = applicationEventPublisher;}/*** 新增路由** @param definition* @return*/public String add(RouteDefinition definition) {try {routeDefinitionWriter.save(Mono.just(definition)).subscribe();this.publisher.publishEvent(new RefreshRoutesEvent(this));return "success";} catch (Exception e) {log.error(e.getMessage(), e);return "update route fail";}}/*** 更新路由** @param definition* @return*/public String update(RouteDefinition definition) {try {this.routeDefinitionWriter.delete(Mono.just(definition.getId())).subscribe();} catch (Exception e) {return "update fail,not find routerouteId: " + definition.getId();}try {routeDefinitionWriter.save(Mono.just(definition)).subscribe();this.publisher.publishEvent(new RefreshRoutesEvent(this));return "success";} catch (Exception e) {log.error(e.getMessage(), e);return "update route fail";}}/*** 清空路由** @return*/public String clear() {try {this.routeDefinitionWriter.delete(Mono.just(CONS_DELETE)).subscribe();this.publisher.publishEvent(new RefreshRoutesEvent(this));return "success";} catch (Exception e) {log.error(e.getMessage(), e);return "clear route fail";}}} 三、监听路由变更 此处内容较简单,直接上代码
import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.cloud.gateway.route.RouteDefinition;import org.springframework.stereotype.Component;import org.springframework.util.CollectionUtils;import javax.annotation.Resource;import java.util.List;/** * @Author: Flex.Zang * @Date: 2022/3/28 14:48 */@Component@ConfigurationProperties(prefix = "spring.cloud.gateway")public class GatewayConfig {private List That's all, thank you!
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
