spring cloud gateway技术分享

2022年05月15日 阅读数:4
这篇文章主要向大家介绍spring cloud gateway技术分享,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。




1、网关概述

一、API网关背景:

在微服务架构里,服务的粒度被进一步细分,各个业务服务能够被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元能够用不一样的开发测试团队维护,可使用不一样的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议做为各个单元间的通信方式。
在这里插入图片描述web

二、API网关的定义

API即Application programming Interface
网关的角色是做为一个 API 架构,用来保护、加强和控制对于 API 服务的访问。
API 网关是一个处于应用程序或服务(提供 REST API 接口服务)以前的系统,用来管理受权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对全部的调用者透明。所以,隐藏在 API 网关后面的业务系统就能够专一于建立和管理服务,而不用去处理这些策略性的基础设施。正则表达式

三、API网关功能

在这里插入图片描述



2、spring cloud gateway

一、gateway简介

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway做为Spring Cloud生态系中的网关,目标是替代ZUUL,其不只提供统一的路由方式,而且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。spring

二、gateway网关背景

Spring Cloud Gateway 能够看作是一个 Zuul 1.x 的升级版和代替品,比 Zuul 2 更早的使用 Netty 实现异步 IO,从而实现了一个简单、比 Zuul 1.x 更高效的、与 Spring Cloud 紧密配合的 API 网关。
Spring Cloud Gateway 里明确的区分了 Router 和 Filter,而且一个很大的特色是内置了很是多的开箱即用功能,而且均可以经过 SpringBoot 配置或者手工编码链式调用来使用。
好比内置了 10 种 Router,使得咱们能够直接配置一下就能够为所欲为的根据 Header、或者 Path、或者 Host、或者 Query 来作路由。
好比区分了通常的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也均可以直接用。固然自定义 Filter 也很是方便。编程

三、gateway基本概念

****
在这里插入图片描述
在这里插入图片描述

四、gateway用法

说白了 Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理,接下来咱们接下 Spring Cloud GateWay 内置几种 Predicate 的使用。安全

经过时间匹配
Predicate 支持设置一个时间,在请求进行转发的时候,能够经过判断在这个时间以前或者以后进行转发。好比咱们如今设置只有在 2019 年 1 月 1 日才会转发到个人网站,在这以前不进行转发,我就能够这样配置:cookie

spring:
  cloud:
    gateway:
      routes:
       - id: time_route
        uri: http://itsmdev.com
        predicates:
         - After=2021-11-01T06:06:06+08:00[Asia/Shanghai]

Spring 是经过 ZonedDateTime 来对时间进行的对比,ZonedDateTime 是 Java 8 中日期时间功能里,用于表示带时区的日期与时间信息的类,ZonedDateTime 支持经过时区来设置时间,中国的时区是:Asia/Shanghai。架构

After Route Predicate 是指在这个时间以后的请求都转发到目标地址。上面的示例是指,请求时间在 2021 年 1 1月 01 日 6 点 6 分 6 秒以后的全部请求都转发到地址http://itsmdev.com。+08:00是指时间和 UTC 时间相差八个小时,时间地区为Asia/Shanghai。curl

添加完路由规则以后,访问地址http://localhost:8080会自动转发到http://itsmdev.com。异步

Before Route Predicate 恰好相反,在某个时间以前的请求的请求都进行转发。咱们把上面路由规则中的 After 改成 Before,以下:编程语言

spring:
  cloud:
    gateway:
      routes:
       - id: after_route
        uri: http:http://itsmdev.com
        predicates:
         - Before=2021-11-01T06:06:06+08:00[Asia/Shanghai]

就表示在这个时间以前能够进行路由,在这时间以后中止路由,修改完以后重启项目再次访问地址http://localhost:8080,页面会报 404 没有找到地址。

除过在时间以前或者以后外,Gateway 还支持限制路由请求在某一个时间段范围内,可使用 Between Route Predicate 来实现。

spring:
  cloud:
    gateway:
      routes:
       - id: after_route
        uri: http://itsmdev.com
        predicates:
         - Between=2021-11-01T06:06:06+08:00[Asia/Shanghai], 2022-11-01T06:06:06+08:00[Asia/Shanghai]

这样设置就意味着在这个时间段内能够匹配到此路由,超过这个时间段范围则不会进行匹配。经过时间匹配路由的功能很酷,能够用在限时抢购的一些场景中。

经过 Cookie 匹配
Cookie Route Predicate 能够接收两个参数,一个是 Cookie name , 一个是正则表达式,路由规则会经过获取对应的 Cookie name 值和正则表达式去匹配,若是匹配上就会执行路由,若是没有匹配上则不执行。

spring:
  cloud:
    gateway:
      routes:
       - id: cookie_route
         uri: http://itsmdev.com
         predicates:
         - Cookie=ityouknow, kee.e

使用 curl 测试,命令行输入:

curl http://localhost:8080 --cookie “ityouknow=kee.e”

则会返回页面代码,若是去掉–cookie “ityouknow=kee.e”,后台汇报 404 错误。

Header Route Predicate 和 Cookie Route Predicate 同样,也是接收 2 个参数,一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: http://itsmdev.com
        predicates:
        - Header=X-Request-Id, \d+

使用 curl 测试,命令行输入:

curl http://localhost:8080 -H “X-Request-Id:666666”

则返回页面代码证实匹配成功。将参数-H "X-Request-Id:666666"改成-H "X-Request-Id:neo"再次执行时返回 404 证实没有匹配。

经过 Host 匹配
Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号做为分隔符。它经过参数中的主机地址做为匹配规则。

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://itsmdev.com
        predicates:
        - Host=**itsmdev.com

使用 curl 测试,命令行输入:

curl http://localhost:8080 -H “Host: www.itsmdev.com”
curl http://localhost:8080 -H “Host: mditsmdev.com”

经测试以上两种 host 都可匹配到 host_route 路由,去掉 host 参数则会报 404 错误。
经过请求方式匹配
能够经过是 POST、GET、PUT、DELETE 等不一样的请求方式来进行路由。

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: http://itsmdev.com
        predicates:
        - Method=GET

使用 curl 测试,命令行输入:

#curl 默认是以 GET 的方式去请求
curl http://localhost:8080

测试返回页面代码,证实匹配到路由,咱们再以 POST 的方式请求测试。

#curl 默认是以 GET 的方式去请求
curl -X POST http://localhost:8080

返回 404 没有找到,证实没有匹配上路由

经过请求路径匹配
Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://itsmdev.com
        predicates:
        - Path=/foo/{
   
   segment}

若是请求路径符合要求,则此路由将匹配,例如:/foo/1 或者 /foo/bar。

使用 curl 测试,命令行输入:

curl http://localhost:8080/foo/1
curl http://localhost:8080/foo/xx
curl http://localhost:8080/boo/xx

通过测试第一和第二条命令能够正常获取到页面返回值,最后一个命令报 404,证实路由是经过指定路由来匹配。

经过请求参数匹配
Query Route Predicate 支持传入两个参数,一个是属性名一个为属性值,属性值能够是正则表达式。

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: http://itsmdev.com
        predicates:
        - Query=smile

这样配置,只要请求中包含 smile 属性的参数便可匹配路由。

使用 curl 测试,命令行输入:

curl localhost:8080?smile=x&id=2

通过测试发现只要请求汇总带有 smile 参数即会匹配路由,不带 smile 参数则不会匹配。

还能够将 Query 的值以键值对的方式进行配置,这样在请求过来时会对属性值和正则进行匹配,匹配上才会走路由。

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: http://itsmdev.com
        predicates:
        - Query=keep, pu.

这样只要当请求中包含 keep 属性而且参数值是以 pu 开头的长度为三位的字符串才会进行匹配和路由。

使用 curl 测试,命令行输入:

curl localhost:8080?keep=pub

测试能够返回页面代码,将 keep 的属性值改成 pubx 再次访问就会报 404, 证实路由须要匹配正则表达式才会进行路由。

经过请求 ip 地址进行匹配
Predicate 也支持经过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号 (IPv4 或 IPv6) 字符串的列表(最小大小为 1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: http://itsmdev.com
        predicates:
        - RemoteAddr=192.168.1.1/24

能够将此地址设置为本机的 ip 地址进行测试。

结果请求的远程地址是 192.168.1.10,则此路由将匹配。

组合使用
上面为了演示各个 Predicate 的使用,咱们是单个单个进行配置测试,其实能够将各类 Predicate 组合起来一块儿使用。

例如:

spring:
  cloud:
    gateway:
      routes:
       - id: host_foo_path_headers_to_httpbin
        uri: http://itsmdev.com
        predicates:
        - Host=**.foo.org
        - Path=/headers
        - Method=GET
        - Header=X-Request-Id, \d+
        - Query=foo, ba.
        - Query=baz
        - Cookie=chocolate, ch.p
        - After=2021-1-01T06:06:06+08:00[Asia/Shanghai]

各类 Predicates 同时存在于同一个路由时,请求必须同时知足全部的条件才被这个路由匹配。

一个请求知足多个路由的谓词条件时,请求只会被首个成功匹配的路由转发。

上一篇: consul技术分享
下一篇: sentinel技术分享