SpringCloud Gateway使用redis实现动态路由

SpringCloud Gateway使用redis实现动态路由

gateway中默认的路由是存在本地的,如果有自定义的路由策略,路由的拓展性便会收到影响,因此使用考虑使用动态路由来使gateway的路由是无状态的,经研究发现只需要实现RouteDefinitionRepository就可以自定义路由的存储策略。

@Component
public class RedisRouteRepositoryComponent implements RouteDefinitionRepository {
    private Logger log = LoggerFactory.getLogger(RedisRouteRepositoryComponent.class);

    private final String ROUTE = "route";

    @Autowired
    private RedisComponent redisComponent;
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    @Override
    public Mono<Void> save(Mono<RouteDefinition> route) {
        return route.flatMap(r -> {
            log.info("保存路由信息{}", r);
            redisComponent.addHashKey(ROUTE, r.getId(), r);
            return Mono.empty();
        });

    }

    @Override
    public Mono<Void> delete(Mono<String> routeId) {
        return routeId.flatMap(id -> {
            if (redisComponent.hasHashKey(ROUTE,id)) {
                log.info("删除路由信息{}", id);
                redisComponent.delHashKey(ROUTE, id);
                return Mono.empty();
            }
            return Mono.defer(() -> Mono.error(
                    new NotFoundException("RouteDefinition not found: " + routeId)));
        });
    }

    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        Map<String,RouteDefinition> routes;
        if(redisComponent.hasKey(ROUTE)){
            // redis中拉取路由
            log.info("拉取路由信息");
            List<RouteDefinition> routeDefinitions = new LinkedList<>();
            redisTemplate.opsForHash().values(ROUTE).stream().forEach(routeDefinition -> {
                routeDefinitions.add((RouteDefinition) routeDefinition);
            });
            return Flux.fromIterable(routeDefinitions);
        } else {
            routes = new LinkedHashMap<>();
            redisComponent.addHashMap(ROUTE,routes);
            return Flux.fromIterable(routes.values());
        }
    }
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Cloud Gateway中,你可以使用Redis实现动态获取Gateway的路由信息。下面是一个基本的实现思路: 1. **配置Redis**:首先,确保你已经正确配置了Redis,并能够通过Spring Boot进行连接和操作。你可以参考Spring Data Redis的官方文档来了解如何配置和使用Redis。 2. **创建自定义的RouteDefinitionLocator**:创建一个自定义的`RouteDefinitionLocator`实现,用于从Redis中获取路由信息。这个实现类需要实现`getRouteDefinitions()`方法,并在该方法中从Redis中获取路由配置信息。 ```java @Component public class RedisRouteDefinitionLocator implements RouteDefinitionLocator { private final RedisTemplate<String, Object> redisTemplate; public RedisRouteDefinitionLocator(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } @Override public Flux<RouteDefinition> getRouteDefinitions() { List<RouteDefinition> routeDefinitions = new ArrayList<>(); // 从Redis中获取路由配置信息,并将其转换为RouteDefinition对象 // 将解析后的RouteDefinition对象添加到routeDefinitions列表中 return Flux.fromIterable(routeDefinitions); } } ``` 3. **配置Gateway使用自定义的RouteDefinitionLocator**:在配置类中,将自定义的`RouteDefinitionLocator`注册为Bean,并将其设置为Gateway的`RouteDefinitionLocator`。 ```java @Configuration public class GatewayConfig { @Bean public RedisTemplate<String, Object> redisTemplate() { // 创建和配置RedisTemplate实例 return redisTemplate; } @Bean public RouteDefinitionLocator routeDefinitionLocator(RedisTemplate<String, Object> redisTemplate) { return new RedisRouteDefinitionLocator(redisTemplate); } @Bean public RouteDefinitionLocatorComposite routeDefinitionLocatorComposite(RouteDefinitionLocator... locators) { return new RouteDefinitionLocatorComposite(Arrays.asList(locators)); } } ``` 在上述配置中,`RedisTemplate`是一个用于与Redis进行交互的Spring Data Redis的组件。你可以根据实际情况进行配置和使用。 4. **配置Redis中的路由信息**:在Redis中存储路由信息,可以使用Hash结构来存储每个路由的详细信息,例如路由ID、URI、谓词、过滤器等。 ```shell HSET gateway_routes route1 '{ "id": "route1", "uri": "http://example.com", "predicates": [{ "name": "Path", "args": { "pattern": "/example" } }] }' HSET gateway_routes route2 '{ "id": "route2", "uri": "http://example.org", "predicates": [{ "name": "Path", "args": { "pattern": "/example2" } }] }' ``` 上述示例中,使用Hash结构存储了两个路由的详细信息,每个路由信息以JSON格式表示。 通过以上步骤,你就可以通过Redis动态获取Gateway的路由信息了。每当路由配置信息在Redis中发生变化时,Gateway会自动重新加载路由信息。 需要注意的是,上述示例仅提供了一个基本的思路和示例代码,你可能需要根据实际需求进行适当的调整和扩展。 希望以上内容对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值