带你 了解GateWay

gateway

三大核心概念

  • Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。

  • Predicate(断言):参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。

  • Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

作用

  • 反向代理

  • 鉴权

  • 限流

  • 熔断

  • 日志监控

工作流程

核心逻辑:路由转发+执行过滤器链

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。

Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

配置

yml配置

 server:
   port: 9527
 ​
 spring:
   application:
     name: cloud-gateway
   cloud:
     gateway:
       routes:
       - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
         uri: http://localhost:8001          #匹配后提供服务的路由地址
         predicates:
         - Path=/payment/get/**         # 断言,路径相匹配的进行路由
 ​
       - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
         uri: http://localhost:8001          #匹配后提供服务的路由地址
         predicates:
         - Path=/payment/lb/**         # 断言,路径相匹配的进行路由

java配置

 
@Configuration
 public class GateWayConfig {
     @Bean
     public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
         RouteLocatorBuilder.Builder routes = builder.routes();
 ​
         routes.route("path_route", r ->
                 r.path("/payment/get/**").uri("http://localhost:8001")).build();
 ​
         return routes.build();
     }
 }
 ​

Predicate(断言)

作用

如果请求与断言相匹配则进行路由,如果不匹配直接404

After Route Predicate

就是通过设置一个时间,然后After代表的是后的意思,也就是设置的时间 之后 是可以访问这个路由的,在这个时间之前是访问不了的,注意:这个设置的是时区时间。

 ​
 spring:
   cloud:
     gateway:
       discovery:
         locator:
           enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
       routes:
         - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
           # uri: http://localhost:8001          #匹配后提供服务的路由地址
           uri: lb://cloud-payment-service #匹配后提供服务的路由地址
           predicates:
             - Path=/payment/get/**         # 断言,路径相匹配的进行路由
             - After=2022-08-20T00:10:15.434859+08:00[Asia/Shanghai]

设置了两个predicates(断言),path也算是一个,After又是一个。

Before Route Predicater

Before就是设置的时间之前可以访问,过了时间之后不可以访问

 - Before=2020-02-05T15:10:03.685+08:00[Asia/Shanghai]

Between Route Predicate

两个时间的区间是可以访问的,过了时间之后不可以访问

 - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
Cookie Route Predicate

Cookie路由谓词工厂有两个参数,cookie和namea regexp(这是一个 Java 正则表达式)。此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。不带cookie访问直接404

 - Cookie=username,zzyy

Header Route Predicater

Header路由谓词工厂有两个参数,the和headera regexp(这是一个 Java 正则表达式)。此谓词与具有给定名称且值与正则表达式匹配的标头匹配。

 - Header=X-Request-Id, \d+

Host Route Predicate

路由谓词工厂采用Host一个参数:主机名列表patterns。该模式是一种 Ant 风格的模式,.以分隔符为分隔符。

 - Host=**.baidu.com
 正确:curl http://localhost:9527/payment/lb -H “Host: www.baidu.com”
 正确:curl http://localhost:9527/payment/lb -H “Host: java.baidu.com”
 错误:curl http://localhost:9527/payment/lb -H “Host: java.baidu.net”

Method Route Predicate

设置了之后只有GET请求会路由

 - Method=GET

Path Route Predicate

 - Path=/payment/lb*/***

Query Route Predicate

支持传入两个参数,一个是属性名,一个为属性值,属性值可以是正则表达式。

 - Query=username, \d+  # 要有参数名username并且值还要是整数才能路由

RemoteAddr Route Predicate

路由谓词工厂采用的RemoteAddr列表(最小大小为 1)sources,它们是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址和16子网掩码)。

 - RemoteAddr=192.168.1.1/24

Weight Route Predicate

Weight路由谓词工厂有两个参数:和group(weight一个 int)。权重是按组计算的。以下示例配置权重路由谓词:

XForwarded Remote Addr Route Predicate

这可以与反向代理一起使用,例如负载平衡器或 Web 应用程序防火墙,其中仅当请求来自这些反向代理使用的受信任的 IP 地址列表时才允许请求

 - XForwardedRemoteAddr=192.168.1.1/24

可以把它当做IF判断,当满足的时候才能路由到uri,否则直接报异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值