Spring cloud gateway浅析

本文介绍了Spring Cloud Gateway作为微服务网关的作用,对比了为何不使用nginx。详细讲解了Gateway的Predicates、Filters和Uri,以及如何实现动态路由、权限验证、限流和熔断。此外,还探讨了如何结合Ribbon进行灰度发布和负载均衡。
摘要由CSDN通过智能技术生成

使用网关的目的

  • 前端无需关注具体请求哪个微服务,由网关来控制。
  • 网关统一拦截,可以做灰度/权限/限流/负载均衡等逻辑,无需每个微服务都重复实现这个逻辑

为什么不用nginx?

nginx支持以上所说的大部分功能,但是使用gateway能够更加灵活的进行扩展开发。

Spring cloud gateway

Spring cloud gateway最基础的功能是路由,每个路由最重要的参数是uri,predicates,filters,如下代码。

spring:
  cloud:
    gateway:
      routes:
      - id: test-service # 路由ID
        uri: http://localhost:8080 # 路由地址
        predicates: # 路由断言,需满足所有条件
        - Path=/testurl
        filters: # 过滤器
        - StripPrefix=1

predicates决定了哪些请求会进入这个路由,uri则表示要转发到的地方,filters则是转发过程中要经过的一系列过滤器,这些filters也是我们用来实现扩展功能的地方,比如鉴权等。

接下来详细介绍下这三个参数

1. Predicates

官方提供了很多默认的predicate,也可以自行实现。

如上配置的Path对应PathRoutePredicateFactory(*RoutePredicateFactory,*就是参数的名字)。我们通过源码可以看到它就是做了正则匹配,但要注意这里不是通用的正则匹配,很多正则规则都不支持。

public Predicate<ServerWebExchange> apply(PathRoutePredicateFactory.Config config) {
   
    ...
    return (exchange) -> {
   
        // 获取path
        PathContainer path = PathContainer.parsePath(exchange.getRequest().getURI().getRawPath());
        // 正则匹配(不是普通的正则,是spring的正则)
        Optional<PathPattern> optionalPathPattern = pathPatterns.stream().filter((pattern) -> {
   
            return pattern.matches(path);
        }).findFirst();
        // 匹配到
        if (optionalPathPattern.isPresent()) {
   
            PathPattern pathPattern = (PathPattern)optionalPathPattern.get();
            ...
            return true;
        } else {
   
            traceMatch("Pattern", config.getPatterns(), path, false);
            return false;
        }
    };
}

多个Predicate的关系是and。具体的实现在RouteDefinitionRouteLocator。我们的网关就是重写了这个类,使得Predicate关系可以灵活的配置成and或者or。

private AsyncPredicate<ServerWebExchange> combinePredicates(RouteDefinition routeDefinition) {
   
    // 获取所有predicates
    List<PredicateDefinition>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值