基于Redis实现Spring Cloud Gateway的动态管理

640?wx_fmt=gif

640?wx_fmt=jpeg

转载本文需注明出处:微信公众号EAWorld,违者必究。

引言:

Spring Cloud Gateway是当前使用非常广泛的一种API网关。它本身能力并不能完全满足企业对网关的期望,人们希望它可以提供更多的服务治理能力。但Spring Cloud Gateway并不提供数据的动态管理,甚至修改个路由都需要重启。我们如何解决它这个短板,同时实现治理配置数据的高效动态管理呢?本文将带来我们网关与Redis组合的实践。  

目录:

1.Spring Cloud Gateway 简介  

2.网关数据管理

3.实现细节  

1.Spring Cloud Gateway 简介

API 网关

API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:

  • 客户端会多次请求不同的微服务,增加了客户端的复杂性。

  • 存在跨域请求,在一定场景下处理相对复杂。

  • 认证复杂,每个服务都需要独立认证。

  • 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。

  • 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。

以上这些问题可以借助 API 网关解决。API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。也就是说,API 的实现方面更多的考虑。

640?wx_fmt=png

使用 API 网关后的优点如下:

 

  • 易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。 

  • 易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。

  • 减少了客户端与各个微服务之间的交互次数。

Spring Cloud Gateway

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。

Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

640?wx_fmt=png

SCG架构

如图所示,SCG的架构看起来很简单。

首先,它内部包含了一个高性能的Netty Server,用来接收各类网络请求。请求进来之后,会根据配置的各个路由进行匹配并处理请求。每个路由都可以定义多个断言(Predicate),用于路由匹配。

SCG默认提供了10多个内建的断言,可以基于请求的各个方面(请求头,路径,路径,时间,Cookie,http方法等)进行路由匹配。如果还不够,用户还可以自已扩展。

请求匹配到了合适的路由之后,就会按照路由中配置的各过滤器(filter),按顺序对请求进行处理。Filter也基本上可以对请求的所

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
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会自动重新加载路由信息。 需要注意的是,上述示例仅提供了一个基本的思路和示例代码,你可能需要根据实际需求进行适当的调整和扩展。 希望以上内容对你有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值