Spring Cloud:网关Gateway

news2025/1/13 2:31:19

✨ Spring Cloud:网关Gateway

  • 微服务网关概述
    • 为什么需要微服务网关
    • 服务网关的介绍
  • Getway
    • 基本介绍
    • 微服务架构中网关所处位置
    • 三大核心概念
    • 工作流程
  • 入门案例搭建
    • 新建模块**cloud-gateway-gateway9527**
    • 导入依赖
    • application.yml
    • 主启动类
    • 实现动态路由
    • 测试
  • Predicate 断言
    • 基本介绍
    • Route Predicate Factories
    • 常用的Route Predicate
  • Filter过滤器

📃个人主页:不断前进的皮卡丘
🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
🔥个人专栏:微服务专栏

微服务网关概述

为什么需要微服务网关

不同的微服务一般来说会有不同的网络地址,客户端在访问的时候,如果需要记住这些地址的话,其实是很复杂的,而且也很难进行维护
在这里插入图片描述

如果让客户端直接与各个微服务通讯,可能会有很多问题:

  • 客户端会请求多个不同的服务,需要维护不同的请求地址,增加开发难度
  • 在某些场景下存在跨域请求的问题
  • 加大身份认证的难度,每个微服务需要独立认证

因此,我们需要一个微服务网关,介于客户端与服务器之间的中间层,所有的外部请求都会先经过微服 务网关。客户端只需要与网关交互,只知道一个网关地址即可,这样简化了开发还有以下优点:
1、易于监控
2、易于认证
3、减少了客户端与各个微服务之间的交互次数
在这里插入图片描述

服务网关的介绍

  • API网关是一个服务器,是系统对外的唯一入口。API网关封装了系统内部架构,为每个客户端提供 一个定制的API。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在 网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和 管理服务。
  • API 网关就像整个微服务系统的门面一样,是系统对外的唯一入口。有了它,客户端会先将请求发送到 API 网关,然后由 API 网关根据请求的标识信息将请求转发到微服务实例。
  • 网关具有的职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。当然,最主 要的职责还是与“外界联系”。

对于服务数量众多、复杂度较高、规模比较大的系统来说,使用 API 网关具有以下好处:

  • 客户端通过 API 网关与微服务交互时,客户端只需要知道 API 网关地址即可,而不需要维护大量的服务地址,简化了客户端的开发。
  • 客户端直接与 API 网关通信,能够减少客户端与各个服务的交互次数。
  • 客户端与后端的服务耦合度降低。
  • 节省流量,提高性能,提升用户体验。
  • API 网关还提供了安全、流控、过滤、缓存、计费以及监控等 API 管理功能。

常见的 API 网关实现方案主要有以下 5 种:

  • Spring Cloud Gateway
  • Spring Cloud Netflix Zuul
  • Kong
  • Nginx+Lua
  • Traefik

Getway

基本介绍

官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
在这里插入图片描述

Geteway是原Zuul1.x版的替代
在这里插入图片描述

  • Gateway是在spring生态系统之上构建的API网关服务,基于Spring5,SpringBoot2和Project Reactor等技术。
  • Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等
  • SpringCloud Gateway是SpringCloud的一个全新项目,基于Spring5.0+SpringBoot2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。
  • 为了提升网关的性能,SpringCloud Gatway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通讯框架Netty
  • SpringCloud Gateway的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/指标、和限流。
  • 可以用来做反向代理、 鉴权、 流量控制、熔断、日志监控。

微服务架构中网关所处位置

在这里插入图片描述

三大核心概念

在这里插入图片描述

  1. 路由(route) 路由是网关最基础的部分,路由信息由一个ID、一个目的URL、一组断言工厂和一
    组Filter组成。如果断言为真,则说明请求URL和配置的路由匹配。
  2. 断言(predicates) 参考Java8中的断言函数,Spring Cloud Gateway中的断言函数输入类型是
    Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定
    义匹配来自Http Request中的任何信息,比如请求头和参数等。
  3. 过滤器(filter) 一个标准的Spring webFilter,Spring Cloud Gateway中的Filter分为两种类型,
    分别是Gateway Filter和Global Filter。过滤器Filter可以对请求和响应进行处理。

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

工作流程

官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-how-it-works
在这里插入图片描述

  • 客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping中找到与请求匹配的路由,将其发送到Gateway Web Handler。
  • Handler再通过指定的过滤器链来将请求发送给我们实际的服务执行业务逻辑,然后返回。
  • 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
  • Filter在**"pre"类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在"post"类型**的过滤器中可以做响应内容、响应头的修改,日志的输出,流量控制等有着非常重要的作用
  • Predicate 就是路由的匹配条件,而 Filter 就是对请求和响应进行精细化控制的工具。有了这两个元素,再加上目标 URI,就可以实现一个具体的路由了。

入门案例搭建

新建模块cloud-gateway-gateway9527

导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2022</artifactId>
        <groupId>com.zyh.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-gateway-gateway9527</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--新增gateway,不需要引入web和actuator模块-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.zyh.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

application.yml

server:
  port: 9527
spring:
  application:
    name: cloud-gateway

eureka:
  instance:
    hostname: cloud-gateway-service
  client:
      register-with-eureka: true
      fetch-registry: true
      service-url:
          defaultZone: http://localhost:7001/eureka

主启动类

在这里插入图片描述

实现动态路由

如果说这个时候,我们不想暴露8001端口,希望在8001外面套一层9527,我们可以在yml中进行配置

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

eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

测试

启动7001:cloud-eureka-server7001
启动8001:cloud-provider-payment8001
启动9527网关:cloud-gateway-gateway9527
在这里插入图片描述

添加网关前: http://localhost:8001/payment/get/31
在这里插入图片描述

添加网关后: http://localhost:9527/payment/get/31
在这里插入图片描述

我们知道,肯定会有负载均衡的情况,所以端口号不应该写死,应该写成服务的名字。
在这里插入图片描述

Predicate 断言

基本介绍

Spring Cloud Gateway 通过 Predicate 断言来实现 Route 路由的匹配规则。
也就是说Predicate 是路由转发的判断条件,请求只有满足了 Predicate 的条件,才会被转发到指定的服务上进行处理。

使用 Predicate 断言需要注意以下 3 点:

  • Route 路由与 Predicate 断言的对应关系为“一对多”,一个路由可以包含多个不同断言。
  • 一个请求想要转发到指定的路由上,就必须同时匹配路由上的所有断言。
  • 当一个请求同时满足多个路由的断言条件时,请求只会被首个成功匹配的路由转发。
  • 在这里插入图片描述

Route Predicate Factories

在这里插入图片描述

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapper基础框架的一部分。
Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合
Spring Cloud Gateway创建Route对象时,使用RoutePredicateFactory创建Predicate对象,Predicate对象可以赋值给 Route。Spring Cloud Gateway包含许多内置的Route Predicate Factories。
所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and 。

常用的Route Predicate

server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001   #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/get/**   #断言,路径相匹配的进行路由

        - id: payment_routh2
          #uri: http://localhost:8001   #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/lb/**   #断言,路径相匹配的进行路由
            #- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
            #- Cookie=username,zhangshuai #并且Cookie是username=zhangshuai才能访问
            #- Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式
            #- Host=**.atguigu.com
            #- Method=GET
            #- Query=username, \d+ #要有参数名称并且是正整数才能路由


eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://localhost:7001/eureka

在这里插入图片描述

Filter过滤器

Spring Cloud : Gateway 网关过滤器 GatewayFilter

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

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

相关文章

详解信奥一本通1290:采药

1290&#xff1a;采药【题目描述】辰辰是个很有潜能、天资聪颖的孩子&#xff0c;他的梦想是称为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他带到个到处都是草药的山洞里对他说&#xff1…

Fisco Bcos区块链三(webase中间件平台一键部署)

文章目录区块链开荒技术文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html4. Webase一键部署Java环境变量配置MySQL安装Ubuntu安装mysql数据库安装后设置密码&#xff1a;Python部署PyMySQL部署&#xff08;Python3.6&#xff09;拉取…

SpringBoot-过滤器的使用(在访问页面时过滤掉未登录的用户使其不能访问相应页面)

目录 概述 前端编写 页面展示 后端编写 编写接口 过滤器的编写 过滤器功能实验 概述 解决需求&#xff1a;在用户未登录的情况下访问未登录不可访问的页面时&#xff0c;请求将被过滤到&#xff0c;将用户退回登录页面。 技术选型 前端&#xff1a;Vue ElementUI 后端…

MySQL事务的四大特性以及并发事务问题

事务的四大特性ACID 【原子性&#xff08;Atomicity&#xff09;】&#xff1a;事务是不可分割的最小单元&#xff0c;要么全部成功&#xff0c;要么全部失败。&#xff08;eg&#xff1a;转账案例&#xff0c;转账过程中任何一步操作失败了&#xff0c;那么整个事务就失败了&a…

Python装饰器使用方法详解

文章目录1 装饰器背景知识1.1 基本概念1.2 应用场景2 简单的装饰器代码3 使用装饰器记录函数执行次数4 带参数的装饰器5 装饰器处理有返回值的函数1 装饰器背景知识 1.1 基本概念 装饰器&#xff08;Decorator&#xff09;是 Python 中一种函数或类&#xff0c;用来修饰其他函…

RabbitMQ部署

RabbitMQ部署1.单机部署1.1.下载镜像1.2.安装MQ1.3访问管理端2.集群部署2.1.集群分类2.2.设置网络1.单机部署 我们在Centos7虚拟机中使用Docker来安装&#xff0c;如未安装dockr&#xff0c;请参考《Centos7安装Docker》 1.1.下载镜像 方式一&#xff1a;在线拉取 docker …

C语言linux线程库pthread的简单使用教程

POSIX线程&#xff08;pthread&#xff09;库 POSIX线程库是用于C/C的基于标准的线程API。它允许产生一个新的并发流程。它在多处理器或多核系统上最为有效&#xff0c;在这些系统中&#xff0c;可以将流程安排在另一个处理器上运行&#xff0c;从而通过并行或分布式处理提高速…

flask框架全解

文章目录简介wsgiref安装配置文件方式一&#xff08;debug方式配置&#xff09;方式二&#xff08;环境变量方式&#xff0c;很少见&#xff09;方式三&#xff08;配置文件方式&#xff09;其他配置方式flask app路由组成写法动态路由的过滤查询字符串传参json和form等数据反向…

deepin系统如何安装惠普打印机

deepin系统如何安装惠普打印机 导读 想必现在有很多小伙伴对于deepin系统如何安装惠普打印机 安装惠普打印机的方法方面的知识都比较想要了解&#xff0c;那么今天小好小编就为大家… 想必现在有很多小伙伴对于deepin系统如何安装惠普p1007打印机 安装惠普打印机的方法方面的知…

【图卷积神经网络】02-谱域图卷积介绍

注&#xff1a;本文为第2章谱域图卷积介绍视频笔记&#xff0c;仅供个人学习使用 目录1、图卷积简介1.1 图卷积网络的迅猛发展1.2 回顾&#xff0c;经典卷积神经网络已在多个领域取得成功1.3 两大类数据1.4 经典卷积神经网络的局限&#xff1a;无法处理图数据结构1.5 将卷积扩展…

Python学习基础之快速入门

目录 首先我们下载最新的python版本&#xff1a;3.0 编写一个hello world 什么是python里面的IPO python运行有几种模式 编写一个温度转换器 在windows上执行python程序 官网&#xff1a;Welcome to Python.org Python 是一门易于学习、功能强大的编程语言。它提供了高效的…

保护视力台灯是白光还是暖光?盘点专业护眼的暖光护眼台灯

保护视力的灯光颜色是最接近太阳光最好&#xff0c;而白光与暖光主要是色温来控制的&#xff0c;低色温&#xff08;3000K以下&#xff09;&#xff0c;中性色温&#xff08;4000K左右&#xff09;&#xff0c;高色温&#xff08;5000K以上&#xff09;&#xff0c;低色温的光源…

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher)

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher) 请访问原文链接&#xff1a;https://sysin.org/blog/install-macos-13-on-unsupported-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.s…

RabbitMQ入门与应用

RabbitMQ入门与应用1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比&#xff1a;2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结3.SpringAMQP3.1.Basic Queue 简单队列模型3…

python机器学习数据建模与分析——pandas中常用函数总结

本文主要对数据建模与分析中常使用到的pandas内置函数进行总结分析&#xff0c;以此来熟悉数据建模与分析的流程。 文章目录一、Pandas数据结构1.1 数据结构—Series1.1.1 Series的创建方式1.1.2 使用索引和获取数据1.2 数据结构—DataFrame1.2.1 DataFrame的创建方式1.2.2 使用…

变速积分PID算法及仿真

在普通的PID 控制算法中&#xff0c;由于积分系数k是常数&#xff0c;所以在整个控制过程中&#xff0c;积分增量不变。而系统对积分项的要求是&#xff0c;系统偏差大时积分作用应减弱甚至全无&#xff0c;而在偏差小时则应加强。积分系数取大了会产生超调&#xff0c;甚至积分…

强化学习笔记:基于价值的学习之价值迭代(python实现)

目录 1. 前言 2. 数学原理 3. 实现 3.1 Planner类 3.2 ValueIterationPlanner类 4. 运行结果及分析 1. 前言 在强化学习中&#xff0c;根据是否依赖于&#xff08;环境的&#xff09;模型&#xff0c;可以分为有模型&#xff08;model-based&#xff09;…

通信原理简明教程 | 模拟调制传输

文章目录1 模拟幅度调制1.1 模拟幅度调制的基本原理1.2 DSB-SC调制和AM调制1.3 SSB调制和VSB调制2 模拟角度调制2.1 角度调制的基本概念2.2 窄带调频和宽带调频2.3 调频信号的产生方法3 模拟调制系统的解调3.1 相干解调3.2 非相干解调4 模拟调制系统的抗噪声性能4.1 抗噪声性能…

Service Mesh

Service Mesh 参考如下文章&#xff1a;可以将此文章看作为下面文章的结合&#xff1a; https://zhuanlan.zhihu.com/p/61901608 https://philcalcado.com/2017/08/03/pattern_service_mesh.html https://zhuanlan.zhihu.com/p/153105848?from_voters_pagetrue 微服务演化进…

浅谈 开源许可证

目录浅谈 开源许可证一、什么是开源许可证1.1 什么是开源1.2 什么是开源许可证Copyleft 许可证&#xff08;Copyleft 许可证&#xff09;宽松许可证&#xff08;permissive 许可证&#xff09;二、为什么要有开源许可证2.1、No License&#xff1a;没有开源许可证意味着什么2.2…