文章目录

  • 前言
  • 1.gateway API 网关
  • 2.gateway网关的关键词汇
  • 1)Route 路由
  • 2)Predicate 断言
  • 3)Filter 过滤器
  • 4.项目搭建
  • 5.gateway网关详细使用说明
  • 5.1初次体验使用
  • 5.2路由(uri)使用
  • 固定路由:
  • 动态路由:
  • 5.3断言(predicates)使用
  • 1)After:配置在某个时间之后转发路由
  • 2)Before:配置在某个时间之前转发路由
  • 3)Between:配置在时间范围内转发路由
  • 4)Cookie:cookie值判断转发路由
  • 5)Header:Header值判断转发路由
  • 6)Host: 配置Host值转发路由
  • 7)Method:配置请求方式转发路由
  • 8)Path:配置请求路径转发路由
  • 9)Query:配置请求参数转发路由
  • 10)RemoteAddr:配置远程地址转发路由
  • 11)Weight:权重转发路由
  • 12)断言的组合使用
  • 5.4过滤器(Filters)使用
  • GatewayFilter网关过滤器
  • 1)RewritePath:重写请求路径
  • 2)PrefixPath:追加路径前缀
  • 3)StripPrefix:切割路径
  • 全局网关过滤器




前言

学习总结都是在gateway官网的api文件学习:
https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#configuration-properties 什么是网关?网关有什么用?有什么好处?可以做什么?处理什么问题?这些我不说了,我这里主要说是怎么使用。


1.gateway API 网关

简单理解:API网关是一个服务器,是系统的唯一入口

2.gateway网关的关键词汇

1)Route 路由

网关的基本构建块。它由ID,目标URI,断言集合(predicates)和过滤器集合(filters)定义。如果聚合断言为true,则匹配路由。

2)Predicate 断言

输入类型是Spring FrameworkServerWebExchange。这使您可以匹配HTTP请求中的所有内容,例如标头或参数。

3)Filter 过滤器

这些是使用特定工厂构造的Spring FrameworkGatewayFilter实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。

4.项目搭建

看文章:微服务-创建springcloud项目框架

5.gateway网关详细使用说明

5.1初次体验使用

1)在gateway服务配置写上这个,然后直接启动服务

spring:
  cloud:
    gateway:
      routes:
        - id: test
          uri: https://example.org/
          predicates:
            - Path=/test

2)打开浏览器输入:http://127.0.0.1:8180/test 就会转发到:https://example.org/test

5.2路由(uri)使用

uri就是网关要代理地址

固定路由:

固定路由就是直接配置转发地址,就是那些请求转发到这个服务器地址,只能是单一

动态路由:

动态路由是针对注册中心使用的,网关服务注册到注册中心,然后使用微服务的名字来转发,当服务有多个的时候,就可以达到负载均衡的作用
例如:

uri: lb://server1

5.3断言(predicates)使用

1)After:配置在某个时间之后转发路由

所述After路由,只有一个参数datetime(类型是Java 的ZonedDateTime对象)。predicates匹配在指定日期时间之后发生的请求。
中国的时区是:Asia/Shanghai 下面的示例配置路由:
意思是在2020年10月20号之后就会转发,时间没到就不会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: https://example.org
          predicates:
            - After=2020-10-20T00:00:00.000+08:00[Asia/Shanghai]

2)Before:配置在某个时间之前转发路由

所述Before路由,只有一个参数datetime(类型是Java 的ZonedDateTime对象)。predicates匹配在指定日期时间之前发生的请求。
中国的时区是:Asia/Shanghai 下面的示例配置路由:
意思是在2020年10月20号之前就会转发,时间过了就不会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: before_route
          uri: https://example.org
          predicates:
            - Before=2020-10-20T00:00:00.000+08:00[Asia/Shanghai]

3)Between:配置在时间范围内转发路由

所述Between路由,有两个参数,datetime1并且datetime2 (类型是Java的ZonedDateTime对象)。predicates匹配是指时间datetime1和时间datetime2之间。
下面的示例配置路由:
意思是在2020年10月20号和2020年10月21号之间才会转发,时间不在范围之内就不会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: between_route
          uri: https://example.org
          predicates:
            - Between=2020-10-20T00:00:00.000+08:00[Asia/Shanghai],2020-10-21T00:00:00.000+08:00[Asia/Shanghai]

4)Cookie:cookie值判断转发路由

所述Cookie路由,有两个参数,该cookie的nameregexp(regexp就是value,支持Java正则表达式),predicates匹配是指cookie的值是不是匹配。
下面的示例配置路由:
意思是cookie值的token等于123才会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: cookie_route
          uri: https://example.org
          predicates:
          	- Cookie=token, 123

注:想要多个cookie值匹配,就多配几个:- Cookie=token, 123,如下

spring:
  cloud:
    gateway:
      routes:
        - id: cookie_route
          uri: https://example.org
          predicates:
          	- Cookie=token, 0
          	- Cookie=token1, 1
          	- Cookie=token2, 2

5)Header:Header值判断转发路由

所述Header路由,有两个参数,该Header的nameregexp(regexp就是value,支持Java正则表达式),predicates匹配是指Header的值是不是匹配。
下面的示例配置路由:
意思是Header头X-Request-Id等于数字(一个或者多个)才会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: header_route
          uri: https://example.org
          predicates:
          	- Header=X-Request-Id, \d+

注:想要多个Header值匹配,就多配几个:- Header=X-Request-Id, \d+

6)Host: 配置Host值转发路由

所述Host路由,有一个参数,主机名的列表patterns(多个列名用逗号隔开),predicates匹配是指与Host匹配模式的标头匹配。
下面的示例配置路由:

spring:
  cloud:
    gateway:
      routes:
        - id: host_route
          uri: https://example.org
          predicates:
            - Host=**.somehost.org,**.anotherhost.org

7)Method:配置请求方式转发路由

所述Method路由,有一个参数,断言需要methods的参数(POST,GET),它是一个或多个参数:predicates匹配是指HTTP方法来匹配。
下面的示例配置路由:
意思是请求方式是POST或者是GET才会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: method_route
          uri: https://example.org
          predicates:
            - Method=GET,POST

8)Path:配置请求路径转发路由

所述Path路由,有一个参数(多个path用逗号分隔)
下面的示例配置路由:
意思是请求路径是/a/xx和/b/xx,(例如/a/test,/b/test/123)才会转发到https://example.org ,并把路径追加到后面(https://example.org/a/test 或者 https://example.org/b/test/123)

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: https://example.org
          predicates:
            - Path=/a/**,/b/**

9)Query:配置请求参数转发路由

所述Query路由,有两个参数,该Query的nameregexp(regexp就是value,支持Java正则表达式),predicates匹配是指请求的参数的值是不是匹配。
下面的示例配置路由:
意思是请求参数值的green等于数字才会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: Query_route
          uri: https://example.org
          predicates:
            - Query=green,\d+

注:多个参数就写多个- Query=green,\d+
如果不想出参数值有限制,可以不写:- Query=green

10)RemoteAddr:配置远程地址转发路由

所述RemoteAddr路由,有一个参数
如192.168.0.1/16(其中192.168.0.1是一个IP地址和16一个子网掩码)
下面的示例配置路由:

spring:
  cloud:
    gateway:
      routes:
        - id: RemoteAddr_route
          uri: https://example.org
          predicates:
            - RemoteAddr=127.0.0.1

11)Weight:权重转发路由

下面的示例配置路由:
这条路线会将大约80%的流量转发到weighthigh.org,将大约20%的流量转发到weightlow.org。

spring:
  cloud:
    gateway:
      routes:
        - id: weight_high
          uri: https://weighthigh.org
          predicates:
            - Weight=group1, 8
        - id: weight_low
          uri: https://weightlow.org
          predicates:
            - Weight=group1, 2

12)断言的组合使用

请求需要满足,请求方式是POST,路径是/a/xx,带参数green,参数是数字,cookie值是token-1,才会路由到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: all_route
          uri: https://example.org
          predicates:
            - Method=POST
            - Path=/a/**
            - Query=green,\d+
            - Cookie=token, 1

5.4过滤器(Filters)使用

spring cloud gateway的过滤器作用范围划分为GatewayFilterGlobalFilter,二者区别:

  • GatewayFilter:网关过滤器
    通过spring.cloud.routes.filters配置在具体路由下,只作用在当前路由
    通过spring.cloud.default-filters配置在全局,只作用在所有路由上
  • GlobalFilter:全局过滤器
    不需要在配置文件中配置,作用在所用的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它为请求业务以及路由的URI转换成真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。

过滤器太多了,我这边选出几个常用的

GatewayFilter网关过滤器

1)RewritePath:重写请求路径

对于的请求路径/red/blue,这会将路径设置为/blue发出下游请求之前的路径

spring:
  cloud:
    gateway:
      routes:
        - id: rewritepath_route
          uri: https://example.org
          predicates:
            - Path=/red/**
          filters:
            - RewritePath=/red(?<segment>/?.*), $\{segment}

2)PrefixPath:追加路径前缀

这将/mypath作为所有匹配请求的路径的前缀。因此,/hello将向发送请求/mypath/hello

spring:
  cloud:
    gateway:
      routes:
        - id: prefixpath_route
          uri: https://example.org
          filters:
            - PrefixPath=/mypath

3)StripPrefix:切割路径

通过网关/name/blue/red发出请求时,发出的请求nameservice看起来像nameservice/red

spring:
  cloud:
    gateway:
      routes:
        - id: nameRoot
          uri: https://nameservice
          predicates:
            - Path=/name/**
          filters:
            - StripPrefix=2

全局网关过滤器

第一步:实现接口GlobalFilter, Ordered 第二步:@Component添加到组件里,就是注入到bean
也可以在启动类上加:

@Bean
public GlobalFilter customFilter() {
    return new CustomGlobalFilter();
}

样例实现:

@Component
public class CustomGlobalFilter  implements GlobalFilter, Ordered {

    /**
     * 过滤器业务逻辑
     *
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
       System.out.println("custom global filter");
        return chain.filter(exchange);
    }

    /**
     * 过滤器执行顺序,数值越小,优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}