欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring-Cloud-GateWay

程序员文章站 2022-03-08 12:23:45
概述 什么是Spring Cloud GateWay 1. Spring Cloud Gateway 基于 Spring Boot 2, 是 Spring Cloud 的 全新 项目, 该项 目 提供 了 一个 构建 在 Spring 生态 之上 的 API 网关 2. Spring Cloud G ......

概述

什么是spring-cloud-gateway

  1. spring cloud gateway 基于 spring boot 2, 是 spring cloud 的 全新 项目, 该项 目 提供 了 一个 构建 在 spring 生态 之上 的 api 网关
  2. spring cloud gateway 旨在 提供 一种 简单 而 有效 的 途径 来 转发 请求, 并为 它们 提供 横 切 关注 点, 例如: 安全性、 监控/ 指标 和 弹性

优点

  1. 性能比较高, 是第一代网关zuul的1.6倍
  2. 功能强大, 内置了很多功能,转发/监控/限流
  3. 容易扩展

缺点

  1. 实现依赖netty和webflux,不是传统的servet模型
  2. 不能将其部署在tomcat,jetty等servelt容器当中,只能打成jar包执行
  3. 需要springboot2.0及以上版本才支持

词汇

route路由

路由网关的基本构建块。 它由id,目标uri,谓词集合和过滤器集合定义。 如果聚合谓词为真,则匹配路由

predicate谓词

对请求的内容进行匹配,条件筛选

filter过滤器

可以对请求进行过滤,在发送下游请求之前或之后修改请求和响应

快速入门

1. 创建gateway服务

Spring-Cloud-GateWay

2. 导入依赖

Spring-Cloud-GateWay

<dependencies>
        <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-gateway</artifactid>
        </dependency>
        <dependency>
            <groupid>io.projectreactor.netty</groupid>
            <artifactid>reactor-netty</artifactid>
            <version>0.9.4.release</version>
        </dependency>

    </dependencies>

3. 创建启动类

Spring-Cloud-GateWay

4. 添加配置

Spring-Cloud-GateWay

server:
  port: 9000

spring:
  application:
    name: api-gateway #此实例注册到eureka服务端的name
  cloud:
    gateway:
      routes: #当请求满足要求时,转发到指定的服务当中
        - id: goods_route  #唯一标识,默认是uuid
          uri: http://localhost:8000/ #请求要转发的地址
          order: 1 #路由优先级 越小, 优先级越高
          predicates: #谓词,断言(条件判断 转发请求要满足什么条件)
            - path=/api/**  #当路径中有指定内容时, 才会转发到指定uri
          filters: #过滤器,拦截请求做一些额外处理
            - stripprefix=1  #去掉添加的path内容

运行访问http://localhost:9000/api/服务地址
Spring-Cloud-GateWay

gateway整合nacos

  1. 在配置文件中添加nacos的依赖, 把gatway注册到nacos当中
    Spring-Cloud-GateWay
 <dependency>
            <groupid>com.alibaba.cloud</groupid>
            <artifactid>spring-cloud-starter-alibaba-nacos-discovery</artifactid>
        </dependency>
  1. 在配置文件当中添加nacos的地址
    Spring-Cloud-GateWay
  2. 在启动类上添加注解
    Spring-Cloud-GateWay
@enablediscoveryclient
  1. 配置gateway从nacos中获取服务信息
    Spring-Cloud-GateWay
  discovery:
        locator:
          enabled: true #从nacos当中获取服务信息
  1. 信息uri为服务地址
    Spring-Cloud-GateWay
    Spring-Cloud-GateWay
    http://localhost:9000/api/getgoods

谓词

什么是谓词(断言)

  1. 用于对请求进行判断 ,只有断言都返回值,才会真正的执行路由
  2. 满足条件,才能进行过滤,转发

内置断言工厂

基于datetime

  1. afterroutepredicatefactory:

判断请求日期是否晚于指定的日期
参数:传递一个日期

示例
Spring-Cloud-GateWay
2. beforeroutepredicatefactory

判断请求日期是否早于指定日期
参数:传递一个日期

  1. betweenroutepredicatefactory

判断请求日期是否在指定日期之间
参数:传递两个日期

基于远程地址

remoteaddrroutepredicatefactory

判断请求主机地址是否在指定地址段时 参数:ip地址段
Spring-Cloud-GateWay

基于cookie的断言

cookieroutepredicatefactory

判断请求cookie是否具有给定名称且值与正则表达式匹配
参数:cookie名称 , 正则表达式

示例

- cookie=mycookname,[^gao]

基于header

headerroutepredicatefactory

判断请求header是否具有给定名称且值与正则表达式匹配
参数:标题名称 , 正则表达式

示例:

	- header=request-id,\d+

基于host

hostroutepredicatefactory

判断请求的host是否满足匹配条件
参数:主机名模式

示例

- host=**.testhost.org

基于methods

methodroutepredicatefactory

判断请求类型是否为指定的类型
参数:请求类型

示例

-method=get

基于query请求参数

queryrouterpredicatefactory

判断请求参数是否具有给定名称且值与正则表达式匹配 参数:请求参数名,正则表达式

示例

  • query=name,test.

基于权重的断言工厂
weightroutepredicatefactory

对于同一组内容的路由,按权重进行转发
参数 : 组名,权重

示例
Spring-Cloud-GateWay

  1. 两个对于 / weight/** 路径转发的路由定义,这两个路由是同一个权重分组,且 weight_ route1 权重为 1,
  2. weight_ route2 权重为9 对于10个访问/ weight/** 路径的请求来说,将会有9个路由到 weight_ route2,1个路由到 weight_ route1

过滤器

什么是过滤器

  1. gatewayfilter 网关过滤器用于拦截并链式处理web请求,可以实现横切的与应用无关的需求,比如:安全、访问超时的设置等
  2. 在请求传递过程当中,对请求和响应进行一些额外的处理

生命周期

  1. pre

在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等

  1. post

在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等

分类

  1. 局部过滤器
    只作用在某 一个路由上
  2. 全局过滤器
    作用在全部路由上

内置局部过滤器

  1. addrequestheader: 为原始请求添加header ,header名称及值
  2. addrequestparameter:为原始请求添加请求参数,参数名及值
  3. addresponseheader:为原始响应添加header,header名称及值
  4. deduperesponseheader:剔除响应头中重复的值,需要去重的header名称及重复策略
  5. hystrix:为路由引入hystrix的断路器保护,hystrixcommand名称
  6. fallbackheader:为fallbackuri的请求头中添加具体的异常信息, header的名称
  7. prefixpath:为原始请求添加前缀,前缀路径
  8. preservehostheader:为请求添加一个preservhostheader=true的属性,路由过滤器会检查该属性以决定是否要发送原始的host 没有参数
  9. requestratelimiter:用于对请求限流
  10. redirectto:将原始请求重定向到指定的url,http状态码及重定向的url
  11. removehopbyhopheadersfilter:为原始请求删除ietf组织规定的一系列header,默认就会启用
  12. rewritepath:重写原始请求路径,原始路径正则表达式及重写后路径的正则表达式
  13. rewriteresponseheader:重写原始请求中的某个header,header名称,值的正则表达式,重写后的值
  14. savesession:在请求转发之前,强制执行websession::save操作
  15. secureheaders:为原始响应添加一系列安全作用的响应头
  16. setstatus:修改响应的状态码,http状态码,可以是数字也可以是字符串
  17. stripprefix:用于截断原始请求的路径,使用数字表示要截断的路径的数量
  18. retry:针对不同的响应进行重试
  19. requestsize:设置允许接收最大请求包的大小,请求包大小,单位为字节
  20. modifyrequestbody:在转发请求之前修改原始请求体内容,修改后的请求体内容
  21. modifyresponsebody:修改原始响应体的内容,修改后的响应体内容

举例:
Spring-Cloud-GateWay

全局内置过滤器

Spring-Cloud-GateWay

工作流程

Spring-Cloud-GateWay
介绍:

  1. dispatcherhandler

所有请求的调度器,负载请求分发

  1. routepredicatehandlermapping

路由谓语匹配器,用于路由的查找,以及找到路由后返回对应的webhandler,
ispatcherhandler会依次遍历handlermapping集合进行处理

  1. filteringwebhandler

使用filter链表处理请求的webhandler, routepredicatehandlermapping找到路由后返回对应的filteringwebhandler对请求进行处理,filteringw
ebhandler负责组装filter链表并调用链表处理请求。