深度解读 Spring Cloud Gateway 架构原理

2023-06-06 0 884

深度解读 Spring Cloud Gateway 架构原理

随着微服务项目的日渐普及化,服务项目交换机在整座微服务项目控制系统中承担着日渐关键的配角。而开放源码界中最畅销的服务项目交换机计划要数 Spring Cloud Gateway,它不但具有了现代交换机的常规性机能,而且还结合了 Spring Cloud 的竞争优势,为微服务项目提供了快捷的路由器、过滤器、转贴等机能。

本栏将深入细致探求 Spring Cloud Gateway 的基本原理,从五个方面如是说它的构架、路由器实用性、冷却控制系统链和开闭举措。通过责任编辑的自学,坚信听众能更为深入细致地认知 Spring Cloud Gateway 的工作基本原理。

构架

Spring Cloud Gateway 的构架牵涉到四个核心理念组件:交换机(Route)、冷却控制系统(Filter)和处置发动机(DispatcherHandler)。上面我们对它展开概要如是说:

交换机(Route)

在 Spring Cloud Gateway 中,交换机是整座控制系统的核心理念组件,它负责管理将应用程序允诺态射到适当的处置发动机上。交换机根据应用程序允诺中的 URL、允诺头、允诺模块等重要信息展开相匹配,以确认将该允诺路由器到别的最终目标处置器。

冷却控制系统(Filter)

冷却控制系统是 Spring Cloud Gateway 中的另两个关键基本概念,它负责管理对应用程序允诺展开许多处置,包括允诺校正、食品包装、笔记历史记录之类。冷却控制系统被分成三类:预处置冷却控制系统和路由器冷却控制系统。预处置冷却控制系统在允诺转贴到后端服务项目以后对允诺展开许多必要性的处置,比如 token 证书、亲笔签名奇偶校验、允诺模块奇偶校验等;而路由器冷却控制系统则须要特别针对每两个服务项目展开订制化的过滤器,比如白名单、Transact、开闭等。

处置发动机(DispatcherHandler)

处置发动机是 Spring Cloud Gateway 处置允诺的核心理念组件,它转交交换机响起的允诺,并将它交予后端微服务项目展开处置。须要特别注意的是,处置发动机在将允诺转贴到后端服务项目以后依然会经过一连串的冷却控制系统链,这些冷却控制系统藻酸逐一处置应用程序允诺,进而实现笔记历史记录、允诺转贴、codice处置等机能。

路由器实用性

了解了 Spring Cloud Gateway 的构架之后,我们须要进一步了解如何实用性它的路由器重要信息。Spring Cloud Gateway 提供了多种路由器实用性方式,包括基于 yml 实用性文件和基于 Java 代码实现的方式,上面分别如是说。

基于 yml 实用性文件的路由器实用性

基于 yml 实用性文件的路由器实用性是 Spring Cloud Gateway 的默认实用性方式,它将路由器重要信息定义在 application.yml 或 application.properties 实用性文件中。比如,上面的实用性将/user/**的允诺路由器到用户服务项目(user-service):

spring: cloud: gateway: routes:- id: user-service uri: lb://user-service predicates:- Path=/user/**

其中,id 表示路由器的唯一标识,uri 表示要路由器到的服务项目的位置(可以是两个具体的 URL,也可以是两个负载均衡器),predicates 则表示路由器的相匹配规则。

基于 Java 代码实现的路由器实用性

除了基于 yml 实用性文件的方式,Spring Cloud Gateway 还提供了基于 Java 代码实现的路由器实用性方式,在这种方式下,我们可以通过编写 Java 代码来展开路由器实用性。比如,上面的代码将/test/**的允诺路由器到 test-service 服务项目:

@Configurationpublic class GatewayConfig {@Bean public RouteLocator gatewayRoutes(RouteLocatorBuilder builder){ return builder.routes().route(r -> r.path(“/test/**”).uri(“http://test-service”).id(“test-service”)).build();}}

冷却控制系统链

Spring Cloud Gateway 的冷却控制系统链是其实现路由器与过滤器机能的关键组件,它由多个冷却控制系统组成,并且同样支持基于 yml 文件和 Java 代码的实用性方式。上面我们将如是说冷却控制系统链的基本基本概念及其使用方式。

基本基本概念

在 Spring Cloud Gateway 中,冷却控制系统链是由多个冷却控制系统组成的,这些冷却控制系统分成三类:全局冷却控制系统和路由器冷却控制系统。全局冷却控制系统是特别针对整座交换机生效的,它在允诺转贴到具体的微服务项目以后展开拦截,可以用于添加公共允诺头重要信息、统一笔记历史记录等;而路由器冷却控制系统则都与路由器相关,它指定了路由器具体的处置行为,比如对特定允诺展开开闭、证书、缓存等。

冷却控制系统链中的冷却控制系统是有顺序的,每个冷却控制系统都有两个指定的 order,越小的 order 则越优先执行。当允诺到来时,Spring Cloud Gateway 就会按照 order 的大小依次展开冷却控制系统链的执行,这样可以保证每个冷却控制系统都能在正确的时机处置允诺。

实用性方式

Spring Cloud Gateway 提供了多种实用性方式来实现对冷却控制系统链的实用性,上面如是说两种常见的实用性方式。

基于 yml 实用性文件的冷却控制系统链实用性

首先,在实用性文件中增加全局冷却控制系统和路由器冷却控制系统的实用性:

spring: cloud: gateway: globalfilters:- name: AuthorizationFilter – name: ApiAuthFilter args: apikey:123456 routes:- id: test-service uri: http://test-service:8080 predicates:- Path=/test/** filters:- RewritePath=/test/$\{segment}/

其中,globalfilters 表示全局冷却控制系统,它的 order 默认都是0,可以在冷却控制系统类上使用@Order 注解设置优先级;routes 则是路由器实用性重要信息,filters 表示路由器冷却控制系统。

基于 Java 代码实现的冷却控制系统链实用性

其次,我们可以通过编写 Java 代码的方式来实现对冷却控制系统链的实用性,代码如下:

@Configurationpublic class GatewayFiltersConfig { private final AuthorizationFilter authorizationFilter; private final ApiAuthFilter apiAuthFilter;@Autowired public GatewayFiltersConfig(AuthorizationFilter authorizationFilter, ApiAuthFilter apiAuthFilter){ this.authorizationFilter = authorizationFilter; this.apiAuthFilter = apiAuthFilter;} @Bean public RouteLocator gatewayRoutes(RouteLocatorBuilder builder){ return builder.routes().route(r -> r.path(“/test/**”).uri(“http://localhost:8080”).filters(f -> f.filter(authorizationFilter).filter(apiAuthFilter)).id(“test-service”)).build();} @Bean public AuthorizationFilter authorizationFilter(){ return new AuthorizationFilter();} @Bean public ApiAuthFilter apiAuthFilter(){ return new ApiAuthFilter(“123456”);}}

开闭举措

最后,我们来如是说一下 Spring Cloud Gateway 的两个关键机能:开闭。Spring Cloud Gateway 提供了多种开闭举措来控制每个微服务项目的流量,上面分别如是说。

基于 Redis 的开闭举措

基于 Redis 的开闭举措是 Spring Cloud Gateway 提供的一种高效且可靠的开闭方式。具体来说,我们可以在 Redis 中设置两个计数器,每有两个允诺到达就会对计数器展开累加,如果计数器超过了阈值,则拒绝该允诺。上面是两个基于 Redis 的开闭器的实现:

public class RedisRateLimiter implements HandlerFilterFunction{ private final ReactiveRedisTemplate redisTemplate; public RedisRateLimiter(ReactiveRedisTemplate redisTemplate){ this.redisTemplate = redisTemplate;} @Override public Mono filter(ServerHttpRequest request, HandlerFunction next){ String uri = request.getURI().getPath(); String key =”requestratelimiter:”+ uri; return redisTemplate.opsForValue().get(key).map(count -> Integer.parseInt(count)<10).flatMap(shouldLimit ->{ if (shouldLimit){ String countKey =”requestcount:”+ uri; return redisTemplate.opsForValue().increment(countKey).flatMap(cnt ->{ redisTemplate.expire(countKey, Duration.ofSeconds(60)).subscribe(); return next.handle(request);});} else { return next.handle(request);} });}}

基于 Guava 的开闭举措

除了 Redis,Spring Cloud Gateway 还支持基于 Guava 的开闭措施。Guava 的开闭器是非常灵活且高效的,我们可以通过调整它的模块,实现不同的开闭举措:

public class RateLimiterFilter implements GlobalFilter, Ordered { private final com.google.common.util.concurrent.RateLimiter rateLimiter = com.google.common.util.concurrent.RateLimiter.create(10);@Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain){ if (rateLimiter.tryAcquire()){ return chain.filter(exchange);} else { exchange.getResponse().setStatusCode(HttpStatus.TOOMANYREQUESTS); return exchange.getResponse().setComplete();} }@Override public int getOrder(){ return -1000;}}

总结

责任编辑着重如是说了 Spring Cloud Gateway 的构架、路由器实用性、冷却控制系统链和开闭举措等方面,以期为听众深入细致认知 Spring Cloud Gateway 的工作基本原理提供一定帮助。请特别注意,责任编辑如是说的仅仅是 Spring Cloud Gateway 的最基础的基本概念,如果听众需要更为深入细致地了解 Spring Cloud Gateway,还须要进一步研究它的源代码实现。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务