介绍

Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替代Zuul,那就是SpringCloud Gateway

  • Gateway是在Spring生态系统之上构建的API网关服务

  • Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等

  • Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty

  • Gateway的目标提供统一的路由方式且基于 Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

作用

  • 方向代理

  • 鉴权

  • 流量控制

  • 熔断

  • 日志监控

  • ...

非阻塞异步模型

Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心,是基于WebFlux框架实现的,WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上。非阻塞式+函数式编程(Spring 5必须让你使用Java 8)。

Spring WebFlux是Spring 5.0 引入的新的响应式框架,区别于Spring MVC,它不需要依赖Servlet APl,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范。

特性

  1. 基于Spring Framework 5,Project Reactor和Spring Boot 2.0进行构建;

  1. 动态路由:能够匹配任何请求属性;

  1. 可以对路由指定Predicate (断言)和Filter(过滤器);

  1. 集成Hystrix的断路器功能;

  1. 集成Spring Cloud 服务发现功能;

  1. 易于编写的Predicate (断言)和Filter(过滤器);

  1. 请求限流功能;

  1. 支持路径重写。

工作流程

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

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

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

web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。predicate就是我们的匹配条件;而fliter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了

官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-how-it-works

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

  1. Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。

  1. 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post")执行业务逻辑。

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

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

入门使用

依赖

<!--gateway-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

YML

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

添加网关后,直接访问网关所在地址会路由到具体服务

配置路由的两种方式

  • YML配置文件配置路由

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

根据指定的路径,进行转发

  • 通过配置类来配置路由

@Configuration
public class GateWayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();routes.route("path_route_frx01",r -> r.path("/guonei").uri("http://xxx/xxx")).build();return routes.build();}
}

代码中注入RouteLocator的Bean

GateWay配置动态路由

默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能(不写死一个地址)。

server:port: 9127spring:application:name: cloud-gateway
#############################网关配置###########################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/**             # 断言,路径相匹配的进行路由- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-service      #匹配后提供服务的路由地址predicates:- Path=/payment/lb/**              # 断言,路径相匹配的进行路由
####################################################################

需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri。

常用的Predicate

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个RoutePredicate工厂可以进行组合。

常用的Route Predicate Factory

  • The After Route Predicate Factory

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:# 这个时间后才能起效- After=2023-01-20T17:42:47.789-07:00[America/Denver]

可以通过下述方法获得上述格式的时间戳字符串

import java.time.ZonedDateTime;public class T2
{public static void main(String[] args){ZonedDateTime zbj = ZonedDateTime.now(); // 默认时区System.out.println(zbj);//2022-08-20T21:02:40.570+08:00[Asia/Shanghai]}
}
  • The Before Route Predicate Factory

  • The Between Route Predicate Factory

spring:cloud:gateway:routes:- id: between_routeuri: https://example.org# 两个时间点之间predicates:- Between=2023-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
  • The Cookie Route Predicate Factory

spring:cloud:gateway:routes:- id: cookie_routeuri: http://localhost:8001predicates:- Cookie=chocolate, ch.p
# 该命令相当于发get请求,且没带cookie
curl http://localhost:9127/payment/lb# 带cookie的
curl http://localhost:9127/payment/lb --cookie "chocolate=chip"
  • The Header Route Predicate Factory

spring:cloud:gateway:routes:- id: header_routeuri: http://localhost:8001predicates:- Header=X-Request-Id, \d+
# 带指定请求头的参数的CURL命令
curl http://localhost:9527/payment/lb -H "X-Request-Id:123"
  • The Host Route Predicate Factory

  • The Method Route Predicate Factory

  • The Path Route Predicate Factory

  • The Query Route Predicate Factory

  • The RemoteAddr Route Predicate Factory

  • The weight Route Predicate Factory

说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。

GateWay的Filter

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生。

生命周期

  • pre

  • post

种类

  • GatewayFilter - 有31种

  • 常用的GatewayFilter:AddRequestParameter GatewayFilter

  • GlobalFilter - 有10种

主要接口

  • GlobalFilter

  • Ordered

作用

  • 全局日志记录

  • 统一网关鉴权

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("***********come in MyLogGateWayFilter:  "+new Date());String name = exchange.getRequest().getQueryParams().getFirst("uname");if(name==null){log.info("*******用户名为null,非法用户,o(╥﹏╥)o");exchange.getResponse().setRawStatusCode(HttpStatus.HTTP_NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

GateWay 服务网关相关推荐

  1. 【Spring Cloud Alibaba】Gateway 服务网关

    [Spring Cloud Alibaba]Gateway 服务网关 1 架构图 2 Predicate 断言 3 路由 3.1 静态路由 3.2 动态路由 3.3 Nacos 配置 4 过滤器 4. ...

  2. 微服务01SpringCloud Eureka Ribbon Nacos Feign Gateway服务网关

    微服务技术栈导学 SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 1.0.学 ...

  3. Spring cloud Gateway 服务网关 实战

    Spring cloud Gateway 服务网关 一.简介 优点: 特性: 总结: 二.核心概念 三.路由规则 1.Path 2.Query 3.Method 4.Datetime 5.Romote ...

  4. Spring Cloud入门-Gateway服务网关(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Gateway 简介 相关概念 创建 api-gateway模块 在pom.xml中添加相关依赖 两种不同的配置路由方式 使用yml配置 使用Ja ...

  5. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

  6. Spring Cloud —— Gateway 服务网关

    导航 一.什么是服务网关 二.业界常见网关组件 三.Spring Cloud Gateway 四.Gateway 快速入门 4.1 创建 gateway 服务 4.2 添加 gateway 依赖和 n ...

  7. SpringCloud Gateway 服务网关,限流

    SpringCloud Gateway 提供了基于Redis 和lua脚本实现的令牌桶算法进行限流,即 RequestRateLimiterGatewayFilterFactory类,通过设置过滤器实 ...

  8. SpringCloud Gateway 服务网关,断言

    SpringCloud Gateway 是SpringCloud 生态系中的网关,不仅提供统一路由功能,通过 Filter 过滤链实现网关的基本功能,比如用户验证,鉴权,限流等功能.它使用非阻塞模式, ...

  9. Gateway服务网关使用教程

    目录 1.为什么需要网关 2.gateway快速入门 1)创建gateway服务,引入依赖 2)编写启动类 3)编写基础配置和路由规则 4)重启测试 5)网关路由的流程图 3.断言工厂 4.过滤器工厂 ...

  10. 微服务架构-服务网关(Gateway)-服务网关在微服务中的应用

    服务网关在微服务中的应用 我们将目光转向Spring Cloud应用的外围,讨论微服务架构下的各个模块如何对外提供服务. 1.对外服务的难题 微服务架构下的应用系统体系很庞大,光是需要独立部零的基础组 ...

最新文章

  1. 互联网协议 — IP 网络的 QoS 服务模型
  2. 网站SEO更新时选择适当的时间点有什么好处?
  3. 【动态规划】炮兵阵地
  4. 混沌系统 matlab仿真分析
  5. iOS10 UI教程层次结构的事件
  6. bat贪吃蛇游戏代码_100行python代码,轻松完成贪吃蛇小游戏
  7. 3.mysql的中文问题,database级操作,表级操作,数据CRUD,分组操作,时间和日期,字符串相关函数,表的约束
  8. OSGi服务测试助手:ServiceRegistrationRule
  9. 辅助判卷程序项目的扩展--自动出题
  10. python处理pdf文件_python处理操作pdf全攻略
  11. 2021“数维杯”国际大学生数学建模竞赛B题思路
  12. python生成可执行exe控制Microsip自动填写号码并拨打
  13. linux scsi程序,Linux scsi设备读写流程
  14. 经济统计学专业学C语言,经济统计学专业有哪些课程
  15. 【网络】Select服务器的实现
  16. 二元二次方程例题_二元二次方程组-解法-例题.
  17. ES6 模板字符串用法
  18. Windows编程 DirectInput 鼠标和键盘的输入
  19. ubuntu20.04 部署原生态openstack Victoria版的详细步骤
  20. 使用Python画玫瑰花

热门文章

  1. Android 10 正式版或将 9月3日 发布!
  2. 语音备忘录里的录音怎么导出来
  3. core 读取视图html,ASP.NET Core MVC 之视图(Views)
  4. HTTP性能极限优化
  5. 2021-10-19 nlp_1 nltk的基本应用
  6. IBM Watson健康与美国糖尿病协会结成合作伙伴
  7. win8下去除QQ聊天窗口的广告
  8. 常见android手机分辨率(xxhdpi,xhdpi)
  9. 现在, Delphi 的多线程已经非常易用了!
  10. Flink SQL 自定义 Connector