美文网首页
Gateway 动态路由持久化到 redis

Gateway 动态路由持久化到 redis

作者: 吉他手_c156 | 来源:发表于2020-07-28 17:21 被阅读0次

加入以下坐标

        <!--  Gateway 网关坐标 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!--  限流器,引用响应式 redis 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>

        <!--  springboot actuator 项目监控插件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--  fastJSON -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.72</version>
        </dependency>

application.yml 暴露所有 web 方式请求端点

# 暴露所有 web 方式请求端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

将原来基于内存的路由持久化到 redis

/**
 * 自定义路由持久化
 */
@Component
public class RedisRouteDefinitionRepository implements RouteDefinitionRepository {

    private final static String GATETORY_ROUTER_KEY = "gateway_dynamic_route";

    @Autowired
    private RedisTemplate redisTemplate;

    // 获取路由信息
    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        List<RouteDefinition> routeDefinitions = new ArrayList<RouteDefinition>();
        // 从 redis 中获取路由信息
        redisTemplate.opsForHash().values(GATETORY_ROUTER_KEY).stream().forEach(route -> {
            routeDefinitions.add(JSON.parseObject(route.toString(),RouteDefinition.class));
        });
        return Flux.fromIterable(routeDefinitions);
    }

    // 保存路由信息
    @Override
    public Mono<Void> save(Mono<RouteDefinition> route) {
        return route.flatMap(routeDefinition -> {
            // 将路由转为 json 字符串存储到 redis
            redisTemplate.opsForHash().put(GATETORY_ROUTER_KEY,routeDefinition.getId(),JSON.toJSONString(routeDefinition));
            return Mono.empty();
        });
    }

    // 删除路由信息
    @Override
    public Mono<Void> delete(Mono<String> routeId) {
        return routeId.flatMap(id -> {
            // 如果包含路由 id
            if(redisTemplate.opsForHash().hasKey(GATETORY_ROUTER_KEY,id)){
                redisTemplate.opsForHash().delete(GATETORY_ROUTER_KEY,id);
                return Mono.empty();
            }
            // 没有找到要删除的路由 id 抛出异常
            return Mono.defer(()->Mono.error(new Exception("routeDefinition not found:"+id)));
        });
    }
}

添加路由

image.png
通过 actuator 暴露端端点可以查看添加成功
image.png

删除路由

image.png
通过 actuator 暴露端端点可以查看删除成功

相关文章

网友评论

      本文标题:Gateway 动态路由持久化到 redis

      本文链接:https://www.haomeiwen.com/subject/qsxqrktx.html