springcloud入门——gateway

目录

1.gateway简介

2.Gateway工作流程

3.Gateway搭建

3.GateWay常用的Predicate(断言)

4.GateWay的Filter(过滤器)


1.gateway简介

Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor等技术。

SpringCloud Gateway是Spring Cloud的一个全新项目,基于Spring 5.0+Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供—种简单有效的统一的API路由管理方式

SpringCloud Gateway作为Spring Cloud 生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty

SpringCloud Gateway具有如下特性

  •     基于Spring Framework 5,Project Reactor和Spring Boot 2.0进行构建;
  •     动态路由:能够匹配任何请求属性;
  •     可以对路由指定Predicate (断言)和Filter(过滤器);
  •     集成Hystrix的断路器功能;
  •     集成Spring Cloud 服务发现功能;
  •     易于编写的Predicate (断言)和Filter (过滤器);
  •     请求限流功能;
  •     支持路径重写。

微服务架构中网关的位置
  springcloud入门——gateway_第1张图片

总结来说,Spring Cloud Gateway的作用:方向代理、鉴权、流量控制、熔断、日志监控 

GateWay非阻塞异步模型:

Springcloud中所集成的Zuul版本,采用的是Tomcat容器,使用的是传统的Serviet IO处理模型。

springcloud入门——gateway_第2张图片

阻塞式处理模型:Servlet是一个简单的网络IO模型,当请求进入Servlet container时,Servlet container就会为其绑定一个线程,在并发不高的场景下这种模型是适用的。但是一旦高并发(如抽风用Jmeter压),线程数量就会上涨,而线程资源代价是昂贵的(上线文切换,内存消耗大)严重影响请求的处理时间。在一些简单业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能应对极大并发的请求,这种业务场景下servlet模型没有优势。

非阻塞异步框架:WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。区别于Spring MVC,它不需要依赖Servlet APl,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范。

2.Gateway工作流程

三大核心概念:

  •     Route(路由) - 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由;
  •     Predicate(断言) - 参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由;
  •     Filter(过滤) - 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

springcloud入门——gateway_第3张图片

具体工作流程:

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

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

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

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

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

3.Gateway搭建

1.构建新模块cloud-gateway,修改pom文件引入依赖:

springcloud入门——gateway_第5张图片

注意:此处不可引入web及actuator依赖,否则会报错!

2.编写yml文件:

springcloud入门——gateway_第6张图片

3.建立主启动类:

springcloud入门——gateway_第7张图片

4.yml文件配置网关地址:

springcloud入门——gateway_第8张图片

此处配置localhost:8001/payment/get/**路由进行测试

5.测试,访问9527端口,访问成功:

springcloud入门——gateway_第9张图片

以后使用统一网关即可使用,不需暴露8001端口

Gateway配置路由编码方式:

案例: 通过9527网关访问到外网的百度新闻网址:http://news.baidu.com/guonei

新建config类:

springcloud入门——gateway_第10张图片

测试:浏览器输入http://localhost:9527/guonei,返回http://news.baidu.com/guonei相同的页面。

Gateway动态路由方式:

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

修改yml文件配置,开启动态路由,并配置微服务名:

springcloud入门——gateway_第11张图片

测试,启动eureka集群,8001,8002微服务,再启动9527路由。

输入网址:http://localhost:9527/payment/lb,不停刷新页面,8001/8002两个端口切换。

3.GateWay常用的Predicate(断言)

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。

Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个RoutePredicate工厂可以进行组合。

Spring Cloud Gateway创建Route 对象时,使用RoutePredicateFactory 创建 Predicate对象,Predicate 对象可以赋值给Route。Spring Cloud Gateway包含许多内置的Route Predicate Factories。
所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and。

常用的Route Predicate Factory:

  •     The After Route Predicate Factory
  •     The Before Route Predicate Factory
  •     The Between Route Predicate Factory
  •     The Cookie Route Predicate Factory
  •     The Header Route Predicate Factory
  •     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

一些断言规则的应用:

The After Route Predicate Factory:

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

springcloud入门——gateway_第12张图片

再在yml文件配置时间蹿:

springcloud入门——gateway_第13张图片

测试,在该时间前访问,则失败。

The Between Route Predicate Factory

springcloud入门——gateway_第14张图片

同理,获得时间窜后配置。

The Cookie Route Predicate Factory

springcloud入门——gateway_第15张图片

配置是否允许带cookie访问,以及带什么样的cookie才能访问。

springcloud入门——gateway_第16张图片

The Header Route Predicate Factory

springcloud入门——gateway_第17张图片

同理,配置是否允许带header以及带什么header的访问。

小结

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

4.GateWay的Filter(过滤器)

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

种类(具体看官方文档),分为单一的和全局的:

  • GatewayFilter - 有31种
  • GlobalFilter - 有10种

常用的GatewayFilter:AddRequestParameter GatewayFilter

自定义全局GlobalFilter:

  • 两个主要接口:GlobalFilter、Ordered

作用:全局日志记录、统一网关鉴权

案例:

编写filter类:

springcloud入门——gateway_第18张图片

该类继承了GlobalFilter类及Ordered类。getorder()方法用来设置加载过滤器的顺序;

Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)中设置过滤器规则:此处为过滤用户名为空的用户。

测试:

浏览器输入:

  • http://localhost:9527/payment/lb  - 访问异常
  • http://localhost:9527/payment/lb?uname=abc  - 访问正常

你可能感兴趣的:(springcloud入门——gateway)