纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Gateway简介及使用 Gateway网关工作原理及使用方法

AlgoRain   2021-12-03 我要评论
想了解Gateway网关工作原理及使用方法的相关内容吗AlgoRain在本文为您仔细讲解Gateway简介及使用的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Gateway网关,Gateway工作原理,Gateway使用下面大家一起来学习吧。

1. 什么是 API 网关(API Gateway)

分布式服务架构、微服务架构与 API 网关

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

API 网关的定义

网关的角色是作为一个 API 架构用来保护、增强和控制对于 API 服务的访问。

API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统用来管理授权、访问控制和流量限制等这样 REST API 接口服务就被 API 网关保护起来对所有的调用者透明。因此隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务而不用去处理这些策略性的基础设施。

API 网关的职能

API 网关的分类与功能

2. Gateway是什么

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

3. 为什么用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 也非常方便。

最重要的几个概念

4. Gateway怎么用

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

通过时间匹配

Predicate 支持设置一个时间在请求进行转发的时候可以通过判断在这个时间之前或者之后进行转发。比如我们现在设置只有在 2019 年 1 月 1 日才会转发到我的网站在这之前不进行转发我就可以这样配置:

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

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

After Route Predicate 是指在这个时间之后的请求都转发到目标地址。上面的示例是指请求时间在 2018 年 1 月 20 日 6 点 6 分 6 秒之后的所有请求都转发到地址http://ityouknow.com+08:00是指时间和 UTC 时间相差八个小时时间地区为Asia/Shanghai

添加完路由规则之后访问地址http://localhost:8080会自动转发到http://ityouknow.com

Before Route Predicate 刚好相反在某个时间之前的请求的请求都进行转发。我们把上面路由规则中的 After 改为 Before如下:

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

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

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

spring:
  cloud:
    gateway:
      routes:
       - id: after_route
        uri: http://ityouknow.com
        predicates:
         - Between=2018-01-20T06:06:06+08:00[Asia/Shanghai], 2019-01-20T06:06:06+08:00[Asia/Shanghai]

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

通过 Cookie 匹配

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

spring:
  cloud:
    gateway:
      routes:
       - id: cookie_route
         uri: http://ityouknow.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://ityouknow.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://ityouknow.com
        predicates:
        - Host=**.ityouknow.com

使用 curl 测试命令行输入:

curl http://localhost:8080  -H "Host: www.ityouknow.com" 
curl http://localhost:8080  -H "Host: md.ityouknow.com" 

经测试以上两种 host 均可匹配到 host_route 路由去掉 host 参数则会报 404 错误。

通过请求方式匹配

可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由。

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: http://ityouknow.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://ityouknow.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://ityouknow.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://ityouknow.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://ityouknow.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://ityouknow.com
        predicates:
        - Host=**.foo.org
        - Path=/headers
        - Method=GET
        - Header=X-Request-Id, \d+
        - Query=foo, ba.
        - Query=baz
        - Cookie=chocolate, ch.p
        - After=2018-01-20T06:06:06+08:00[Asia/Shanghai]

各种 Predicates 同时存在于同一个路由时请求必须同时满足所有的条件才被这个路由匹配。

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

到此这篇关于Gateway网关工作原理及使用方法的文章就介绍到这了。希望对大家的学习有所帮助也希望大家多多支持。


相关文章

猜您喜欢

  • python弹幕直播间 用Python实现一个模仿UP主弹幕控制的直播间功能

    想了解用Python实现一个模仿UP主弹幕控制的直播间功能的相关内容吗蛮三刀酱在本文为您仔细讲解python弹幕直播间的相关知识和一些Code实例欢迎阅读和指正我们先划重点:python弹幕直播间,python直播间,pythonUP主弹幕下面大家一起来学习吧。..
  • pygame实现方块动画 pygame实现方块动画实例讲解

    想了解pygame实现方块动画实例讲解的相关内容吗我的天才女友在本文为您仔细讲解pygame实现方块动画的相关知识和一些Code实例欢迎阅读和指正我们先划重点:pygame方块动画下面大家一起来学习吧。..

网友评论

Copyright 2020 www.ducttapegames.com 【环球游戏网】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式