SpringCloud-网关 Gateway

news2025/1/31 2:59:10

网关Gateway

  • 一、网关初识
  • 二、网关的使用
    • 1.创建项目并引入依赖
    • 2.编写网关配置
    • 3.启动服务并测试
  • 三.查看网关路由规则列表
  • 四.路由服务的负载均衡
  • 五.断言和过滤
    • 1.断言Predicate
      • 1.1.The Path Route Predicate Factory(路径断言工厂)
      • 1.2.The After Route Predicate Factory(after路由断言工厂)
      • 1.3.The Before Route Predicate Factory(before路由断言工厂)
      • 1.4.The Between Route Predicate Factory(between路由断言工厂)
      • 1.5.The Cookie Route Predicate Factory(cookie路由断言工厂)
      • 1.6.The Header Route Predicate Factory(header路由断言工厂)
      • 1.7.The Method Route Predicate Factory(method路由断言工厂)
    • 2.过滤Filter
      • 2.1.The AddRequestHeader GatewayFilter Factory
      • 2.2.The AddRequestParameter GatewayFilter Factory
      • 2.3.The AddResponseHeader GatewayFilter Factory
      • 2.4.The PrefixPath GatewayFilter Factory
      • 2.5.The StripPrefix GatewayFilter Factory
    • 3.自定义全局Filter基础使用


一、网关初识

  官方地址:SpringCloud Gateway
  网关统一了服务的入口,可以方便实现对众多服务接口进行管控,对访问服务的身份认证,防报文重放与防数据篡改,功能调用的业务鉴权,响应数据的脱敏,流量与并发控制,甚至基于API调用的计量或者计费等等。更通俗理解,网关可以看成是路由转发以及过滤器的共同作用,路由转发接受一切外界的请求,然后转发到后端的微服务中;而过滤器在服务网关中可以完成一系列的横切功能,比如权限校验,限流以及监控等。
在这里插入图片描述
  在SpringCloud的官网中则指出其提供了一个在SpringMVC之上构建API网关的库。SpringCloudGateway旨在提供一种简单而有效的方法来路由到API,并为API提供横切关注点,比如:安全性、监控/度量和弹性。
  SpringCloud Gateway在特性方面,官网中也给出了说明:

-基于Spring Framework 5、Project Reactor和Spring Boot 2.0构建
-能够在任何请求属性上匹配路由,即动态路由
-断言和过滤器对于路由是特定的
-路径重写
-请求速率限制

二、网关的使用

1.创建项目并引入依赖

<!--引入gateway网关依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2.编写网关配置

  本文当中继续使用之前的商品和用户服务模块,这里给出相关配置信息:

server:
  port: 9000
spring:
  application:
    name: PRODUCT
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka #指定服务注册中心的地址
-------------------------------------------------------------------------------------
server:
  port: 8999
spring:
  application:
    name: USER
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka #指定服务注册中心的地址

  网关的配置如下:

server:
  port: 8989
spring:
  application:
    name: GATEWAY

  cloud:
    gateway:
      routes:
        - id: user_route #指定路由的唯一标识
          uri: http://localhost:8999 #指定路由服务的地址
          predicates:
            - Path=/user/**  #指定路由规则
            
        - id: product_route 
          uri: http://localhost:9000
          predicates:
            - Path=/product/**  

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka #指定服务注册中心的地址

3.启动服务并测试

  在商品服务的业务层中有如下代码:

@RestController
@Slf4j
@RequestMapping("/product")
public class ProductController {

    @Value("${server.port}")
    private String port;

    @GetMapping("/find")
    public String find(){
        log.info("商品服务调用成功,端口为{}", port);
        return "服务调用成功,服务提供端口: " + port;
    }
}

在用户服务的业务层中的代码如下,在用户服务中使用OpenFeign组件调用商品服务。

@RestController
@Slf4j
@RequestMapping("/user")
public class UserController {

    @Autowired
    private ProductClient productClient;

    @GetMapping("/find")
    public String user(){
        log.info("用户服务调用成功....");
        String msg = productClient.find();
        return msg;
    }

}

  写入Gateway的启动类,然后启动相应服务,

@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {
    public static void main(String[] args){
        SpringApplication.run(GatewayApplication.class, args);
    }
}

服务启动之后,在浏览器中进入http://localhost:8989/user/find可以访问用户服务,进入http://localhost:8989/product/find可以访问商品服务。
  解析:一般而言,我们访问商品服务或者是用户服务,使用的访问地址是http://localhost:9000/product/find以及http://localhost:8999/user/find;但是在配置网关之后,访问商品服务时使用http://localhost:8989/product/find,但是在网关中并没有该路径,而它真正的执行过程可以理解为在网关配置文件中的断言的路由规则找到路径为/product/**,并且匹配成功,从而将http://localhost:8989替换为该路由中的uri,即http://localhost:9000,最后组装为http://localhost:8989/product/find,即可访问到正确的路径地址。而用户服务中的实现也是同种道理。当然有时候我们在一个controller业务层中可能有多个接口调用,因此在实现过程中断言中的路径规则我们写成/product/*,并加上@RequestMapping(“/product”)注解,即可匹配到product下的所有接口路径。

三.查看网关路由规则列表

  Gateway提供路由访问规则列表的web界面,但是默认是关闭的,如果想要查看服务路由规则可以在配置文件中开启:

management:
  endpoints:
    web:
      exposure:
        include: "*"   #开启所有web端点暴露

同时在该项目中加入如下依赖,提供监控功能:

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

启动服务之后在浏览器中进入http://localhost:8989/actuator/gateway/routes,即可在web界面中看到配置的服务路由规则:
在这里插入图片描述

四.路由服务的负载均衡

  现有路由配置方式,都是基于服务地址写死的路由转发。所以我们可以对原有的路由配置进行更改,使其能够根据服务名称进行路由转发同时实现负载均衡。

server:
  port: 8989
spring:
  application:
    name: GATEWAY

  cloud:
    gateway:
      discovery:
        locator:
          enabled: true   #开启根据服务名动态获取路由
      routes:
        - id: user_route #指定路由的唯一标识
#          uri: http://localhost:8999 #指定路由服务的地址
          uri: lb://USER  #lb指代loadBalance负载均衡,USER指代服务名
          predicates:
            - Path=/user/**  #指定路由规则

        - id: product_route
#          uri: http://localhost:9000
          uri: lb://PRODUCT  #lb指代loadBalance负载均衡,PRODUCT指代服务名
          predicates:
            - Path=/product/**

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka #指定服务注册中心的地址

management:
  endpoints:
    web:
      exposure:
        include: "*"   #开启所有web端点暴露

可以发现的是,uri不再对主机和端口进行写死,而是采用了lb(LoadBalance)加服务名提供路由地址。当路径匹配之后,会从注册中心对匹配该服务名的服务进行负载均衡处理。

五.断言和过滤

  在官网中,有这么一幅图,很好的诠释了网关的工作原理:
在这里插入图片描述
在这个图中,Gateway Handler Mapping和Gateway Web Handler就是我们所称的断言,而后续的一系列的filter就是过滤器。由图我们可以知道,当客户端向Spring Cloud Gateway发送请求的时候,如果网关处理程序映射器确定请求与路由匹配,则将其发送到网关Web处理程序。然后经过一系列的过滤器处理,最后到达服务端。

1.断言Predicate

  断言其实可以认为是网关的前置处理,当请求到达网关时,会先经过前置处理,满足断言则放行,不满足则立即返回,比如上述例子中的路径匹配就是前置处理。
  当然,在官网中给出了路由断言工厂(Route Predicate Factories),这里我们选几个断言进行介绍:

1.1.The Path Route Predicate Factory(路径断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

这个其实我们都不陌生了,就是之前一直使用的路径匹配。

1.2.The After Route Predicate Factory(after路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

这个断言的含义就是代表该路由规则必须要在指定时间之后才能生效,这里的时间使用的是java中的ZonedDateTime。

1.3.The Before Route Predicate Factory(before路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

同理,这个断言的含义就是该路由规则要在指定时间之前才能生效,时间同样是使用java中的ZonedDateTime。

1.4.The Between Route Predicate Factory(between路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

这个断言的含义代表路由规则必须要指定时间之间才能生效。

1.5.The Cookie Route Predicate Factory(cookie路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

顾名思义,这个断言的含义就是指携带指定cookie请求才能访问。

1.6.The Header Route Predicate Factory(header路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

这个断言的含义就是指请求必须要含有指定的请求头才能生效。

1.7.The Method Route Predicate Factory(method路由断言工厂)

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

这个断言是指基于请求方式的访问。

2.过滤Filter

  过滤相当于网关的后置处理,当请求满足断言的所有条件之后,会向后端服务转发,在向后端服务转发之前会经过一些过滤操作。
  路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。路由筛选器的作用域是特定路由。springcloudgateway包括许多内置的GatewayFilter工厂。而它的功能就是当我们有很多个服务时,比如下图中的user-service、order-service、product-service等服务,客户端请求各个服务的Api时,每个服务都需要做相同的事情,比如鉴权、限流、日志输出等,那我们可以统一在网关处进行处理操作。
在这里插入图片描述
在这里插入图片描述
  在官网中给出GatewayFilter Factories,同样,我们选出一些内置的过滤器进行介绍:

2.1.The AddRequestHeader GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        #添加请求头X-Request-red,值为blue
        - AddRequestHeader=X-Request-red, blue

这个过滤器的主要作用就是用来给路由对象的所有转发请求加入指定请求头信息。

2.2.The AddRequestParameter GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_parameter_route
        uri: https://example.org
        filters:
        - AddRequestParameter=red, blue

这个过滤器的主要作用就是用来给路由对象的所有转发请求加入指定请求参数。

2.3.The AddResponseHeader GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: add_response_header_route
        uri: https://example.org
        filters:
        - AddResponseHeader=X-Response-Red, Blue

这个过滤器的作用就是用来给路由对象的所有转发请求的响应加入指定头部信息。

2.4.The PrefixPath GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: prefixpath_route
        uri: https://example.org
        filters:
        - PrefixPath=/mypath

这个过滤器的含义是用来给路由对象的所有转发请求的url加入指定前缀信息,比如访问网关匹配地址/list,前缀路径是/mypath,最后转发到后端的服务地址就是url+前缀路径+地址栏路径,url/mypath/list。

2.5.The StripPrefix GatewayFilter Factory

spring:
  cloud:
    gateway:
      routes:
      - id: nameRoot
        uri: https://nameservice
        predicates:
        - Path=/name/**
        filters:
        - StripPrefix=2

这个过滤器的含义是用来给路由对象的所有转发请求的url去掉指定2个前缀,比如访问地址是/product/list,StripPrefix=1,则最终的访问地址是/list。

3.自定义全局Filter基础使用

  自定义全局Filter就是当内置的过滤器不能满足现实需求,则可以自定义过滤器来处理,当然所有请求都要经过全局Filter才能转发到后端。

@Configuration
public class CustomGlobalFilter implements GlobalFilter, Ordered {
    @Override
    //exchange封装了request和reponse
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //httprequest对象
        ServerHttpRequest request = exchange.getRequest();
        //httpresponse对象
        ServerHttpResponse response = exchange.getResponse();
        System.out.println("经过全局filter处理....");
        //放行filter
        Mono<Void> filter = chain.filter(exchange);
        System.out.println("响应回来filter处理");
        return filter;
    }

    排序,用来指定filter执行顺序,默认顺序按照自然数字进行排序,-1在所有filter之前执行
    @Override
    public int getOrder() {
        return 0;
    }
}

当然这里只是给出了自定义过滤器的基本使用,具体的代码实现还是要根据业务来进行编写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【27】linux进阶——rpm软件包的管理

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

基于SSM+MySQL的支教管理系统

目录 1、系统介绍 2、系统功能展示 3、运行环境 4、运行效果 5、运行配置 6、下载地址 1、系统介绍 本系统是基于SSM(SpringSpringMVCMyBatis)框架开发的支教管理系统&#xff0c;系统共有超级管理员&#xff0c;系统管理员&#xff0c;支教学校&#xff0c;志愿者这四大…

我的新书上架了!

talk is cheap&#xff0c;show you my book&#xff01; 新书《从0开始学ARM》终于在各大平台上架了&#xff01;&#xff01; 一、关于本书 1. 本书主要内容 ARM体系架构是目前市面上的主流处理器体系架构&#xff0c;在手机芯片和嵌入式芯片领域&#xff0c;ARM体系架构…

前端架构师-week5-命令行交互原理

目录 加餐&#xff1a;命令行交互原理 学习路径 readline 源码分析 如何开发命令行交互列表 实现原理 架构图 本章学习路径和学习目标 readline 的使用方法和实现原理 高能&#xff1a;深入讲解 readline 键盘输入监听实现原理 秀操作&#xff1a;手写 readline 核心实…

MySQL---控制流函数、窗口函数(序号函数、开窗聚合函数、分布函数、前后函数、头尾函数、其他函数)

1. 控制流函数 格式 解释 案例 IF(expr,v1,v2) 如果表达式 expr 成立&#xff0c;返回结果 v1&#xff1b;否则&#xff0c;返回结果 v2。 SELECT IF(1 > 0,正确,错误) ->正确 IFNULL(v1,v2&#xff09; 如果 v1 的值不为 NULL&#xff0c;则返回 v1&#xff…

JVM垃圾收集器(一)

目录 1、如何考虑 GC 2、如何确定一个对象“死去” 3、分代收集理论 4、垃圾回收算法 5、HotSpot的算法实现细节 1、如何考虑 GC 垃圾收集&#xff08;Garbage Collection&#xff0c;GC&#xff09;的历史比Java更久远&#xff0c;1960年诞生于MIT。 GC 需要考虑的三件事…

UNIAPP实战项目笔记72 提交订单到选择支付方式的前后端交互

UNIAPP实战项目笔记72 提交订单到选择支付方式的前后端交互 思路 购物车确认订单,跳转到订单确认界面确认支付后清除购物车对应id的数据 实例截图 清空购物车数据后 代码 前端代码 order.js export default{state:{// 订单号orderNumber:},getters:{},mutations:{initOr…

数字化转型浪潮下,如何选择适合企业的低代码平台

近日&#xff0c;艾瑞咨询发布了《数字新生态&#xff1a;中国低代码厂商发展白皮书》&#xff08;以下简称“报告”&#xff09;&#xff0c;在该报告中&#xff0c;艾瑞咨询对中国当前的低代码市场进行了非常细致的解构&#xff0c;并针对当前企业数字化转型&#xff0c;对低…

电阻传感器工作原理

金属随着温度变化&#xff0c;其电阻值也发生变化。 对于不同金属来说&#xff0c;温度每变化一度&#xff0c;电阻值变化是不同的&#xff0c;而电阻值又可以直接作为输出信号。 电阻共有两种变化类型 正温度系数 温度升高 阻值增加 温度降低 阻值减少 负温度系数 温…

【一起啃书】《机器学习》第七章 贝叶斯分类器

文章目录 第七章 贝叶斯分类器7.1 贝叶斯决策论7.2 极大似然估计7.3 朴素贝叶斯分类器7.4 半朴素贝叶斯分类器7.5 贝叶斯网7.6 EM算法 第七章 贝叶斯分类器 7.1 贝叶斯决策论 对分类任务来说&#xff0c;在所有相关概率都已知的理想情形下&#xff0c;贝叶斯决策论考虑如何基于…

k8s学习-CKS真题-利用AppArmor进行应用行为限制

目录 题目环境搭建解题模拟题参考 题目 Task 在 cluster 的工作节点 node02 上&#xff0c;实施位于 /etc/apparmor.d/nginx_apparmor 的现有 APPArmor 配置文件。 编辑位于 /cks/KSSH00401/nginx-deploy.yaml 的现有清单文件以应用 AppArmor 配置文件。 最后&#xff0c;应用清…

UE4及Airsim安装时遇到的问题及解决办法

UE4及Airsim安装时遇到的问题及解决办法 目录 UE4及Airsim安装时遇到的问题及解决办法前言UE4下载慢解决方法 Airsim编译过程中提示&#xff1a;无法打开包括文件: “Eigen/Dense”: No such file or directory [D:\software\Visual_studio2022\2022Community\AirSim\Air解决办…

C语言——运算符和表达式

所谓表达式就是指由运算符、运算量和标点符号组成的有效序列&#xff0c;其目的是说明一个计算过程。表达式可以独立成语句&#xff1a;表达式; 运算符按功能分为&#xff1a;算术运算、赋值运算、关系运算、逻辑运算、位运算以及其他运算符 1. 算术运算符&#xff1a; - * / %…

项目部署 | Linux安装Git和Maven

知识目录 一、写在前面✨二、安装Git&#x1f495;2.1 yum安装git2.2 新建Git仓库2.3 拉取仓库代码 三、安装Maven&#x1f495;3.1 上传Maven压缩包并解压3.2 配置环境变量3.3 设置本地仓库3.4 设置中央仓库 四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是…

二叉树的递归遍历与迭代遍历(图示)

文章目录 前言1. 二叉树的递归遍历&#xff08;一入递归深似海&#xff0c;从此offer是路人&#xff09;1.1 [前序遍历](https://leetcode.cn/problems/binary-tree-preorder-traversal/)1.2 [中序遍历](https://leetcode.cn/problems/binary-tree-inorder-traversal/)1.3 [后序…

实验一 Python基础编程

实验一 Python基础编程 只为给原因学习编程的同学提供一个思路&#xff0c;让编程更简单&#xff01;&#xff01;&#xff01; 本博主擅长整理粉丝的私信&#xff01;只要你有需求就可以告诉博主&#xff01;博主可以帮你解决并发表&#xff01; 一、实验学时 2学时 二、实…

docker发布到dockerhub报错denied: requested access to the resource is denied

docker发布到dockerhub报错denied: requested access to the resource is denied 解决方案 修改发布的镜像的REPOSITORY为自己的账户名镜像&#xff0c;比如我的用户名是luobotoutou123。docker tag tomcat02:1.0 luobotoutou123/tomcat02:1 然后发布镜像 到dockerhub远程仓库…

学习杂记 2023.5.13 单词背诵

目录 鼠标上的DPI是什么&#xff1f; 鼠标上的DPI是什么&#xff1f; DPI是英文Dots Per Inch的缩写&#xff0c;意思是每英寸点数。在计算机中&#xff0c;DPI通常用于描述指针设备&#xff08;例如鼠标&#xff09;的精度。在鼠标上&#xff0c;DPI指的是鼠标移动时指针在屏…

[图神经网络]ViG(Vision GNN)网络代码实现

论文解读&#xff1a; [图神经网络]视觉图神经网络ViG(Vision GNN)--论文阅读https://blog.csdn.net/weixin_37878740/article/details/130124772?spm1001.2014.3001.5501代码地址&#xff1a; ViGhttps://github.com/huawei-noah/Efficient-AI-Backbones/tree/master/vig_p…

Hive之DDL

目录 对数据库操作&#xff1a; 创建数据库&#xff1a; 查看数据库信息&#xff1a; 1.查看基本信息&#xff1a; 2.查看详尽信息&#xff1a; 删除数据库&#xff1a; 1.简单语法&#xff1a; 2.复杂语法&#xff1a; 对表操作&#xff1a; 创建表&#xff1a; 1.普…