门面模式Api网关(SpringCloudGateway)

1. 前言

        当前通过Eureka、Nacos解决了服务注册和服务发现问题,使用Spring Cloud LoadBalance解决了负载均衡的需求,同时借助OpenFeign实现了远程调用。然而,现有的微服务接口都直接对外暴露,容易被外部访问。为保障对外服务的安全性,通常在服务端实现的微服务接口会带有一定的权限校验机制。由于应用拆分成多个微服务,每个微服务都需要实现权限校验逻辑,导致当逻辑需要修改时,需要在多个应用中进行修改,增加了开发人员的负担。

⽐如企业管理
外部⼈员去公司办理业务, 公司需要先核实对⽅的⾝份再去进⾏办理.
最开始只有⼀个员⼯, 这个员⼯核实之后直接办理即可. (单体架构)
随着公司的发展, 划分了多个部⻔, 每个部⻔负责的事情不同, 每个部⻔都需要先核实对⽅的⾝份再进⾏办理. (微服务架构)
这个流程存在⼀些问题:
  • 1. 办事效率低
  • 2. 增加了员⼯的⼯作流程
我们对此进⾏改进, 设⽴前台, 统⼀由前台来进⾏⾝份的校验. 前台⾝份校验通过后, 其他部⻔就设置信任, 直接办理。

接下来我将会介绍一门新的技术: API网关  SpringCloudGateway

        在微服务架构中,API 网关扮演着至关重要的角色,它是客户端和后端服务之间的门面,负责统一处理所有的请求和响应。Spring Cloud Gateway作为Spring Cloud生态系统中的一个全新项目,提供了强大而灵活的方式来构建 API 网关服务。本文将深入介绍Spring Cloud Gateway的功能、特点以及如何应用于微服务架构中。

2. 功能和特点

Spring Cloud Gateway提供了丰富的功能和特性,其中包括:

  • 动态路由: 可以根据需求动态地将请求路由到相应的后端服务,实现请求的分发和转发。
  • 权限控制: 可以通过实现对请求的安全控制,包括认证、鉴权、请求加密等功能,保障系统的安全性。
  • 负载均衡: 集成了负载均衡的功能,可以将请求分发到多个后端服务实例中,提高系统的可用性和性能。
  • 断路器: 支持断路器模式,可以在后端服务不可用时进行降级处理,避免整个系统的崩溃。
  • 统一的认证和授权: 可以集成统一的认证和授权机制,保护系统的安全性。
  • 监控和日志: 支持监控和日志记录,帮助开发者排查问题和优化系统性能。
  • 过滤器处理: 可以通过自定义的过滤器对请求进行预处理、后处理、权限控制、日志记录等操作,实现对请求的统一管理和处理。

  • 限流:可以通过过滤器和流量算法实现对流量的控制,防止流量过大导致系统崩溃。请求流量过⾼时, 按照⽹关中配置微服务能够接受的流量进⾏放⾏, 避免服务压力过大

    类似前台的⼯作
    1. 权限控制: ⾝份验证。
    2. 动态路由: 根据外来客⼾的需求, 把客⼾带到指定的部⻔去处理。
    3. 负载均衡: ⼀个部⻔有很多⼈时, 前台会帮客⼾选择具体某个⼈处理。
    4. 限流: 公司到访客⼾较多时, 进⾏流量限制, ⽐如告知明天再来。

3. 什么是API网关?

        API网关(简称网关)也是⼀个服务, 通常是后端服务的唯一入口. 它的定义类似设计模式中的Facade模式 (⻔⾯模式, 也称外观模式). 它就类似整个微服务架构的⻔⾯, 所有的外部客⼾端访问, 都需要经过它来进行调度和过滤.

 

4. 简单的使用步骤 

        3.1 创建一个新的模块

        3.2 引入依赖

        <!--引入spring_cloud_gateway的依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos的依赖用于动态路由--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

引入nocos的依赖和负载均衡的依赖就是因为我们的动态路由控制负载均衡均根据二者实现的。

        3.3 修改配置文件

server:port: 10030
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848
#    配置路由的规则gateway:
#      这里配置了一个路由规则,将请求转发到名为"order-service"的服务上。
#  当请求的路径以"/order/"开头时,会被路由到"order-service"服务上。routes:- id: order-service #路由规则id,随便起不重复即可
#  lb 表示负载均衡(Load Balancing)的意思。它告诉Spring Cloud Gateway使用负载均衡的方式将请求分发到多个实例中。uri: lb://order-service # 指定路由到哪个机器里# 条件predicates:- Path=/order/**,/feign/**  # ,后面配置多个路径
配置字段说明:
  •  id : ⾃定义路由ID, 保持唯⼀
  •  uri: ⽬标服务地址, ⽀持普通URI 及 lb://应⽤注册服务名称 . lb表⽰负载均衡, 使⽤ lb://
  • 式表⽰从注册中⼼获取服务地址.
  •  predicates: 路由条件, 根据匹配结果决定是否执⾏该请求路由, 上述代码中, 我们把符合Path规则的 ⼀切请求, 都代理到uri参数指定的地址.

 4. 路由断言工厂

spring:
  cloud:
    gateway:
      routes:
        - id: after-route
          uri: https://example.org
          predicates:
            - After=2024-06-05T12:00:00+08:00[Asia/Shanghai]
例如上述 -After就是路由断言工厂,也就是路由的条件符合条件才可以访问。

名称说明示例
After
这个⼯⼚需要⼀个⽇期时间(Java
的 ZonedDateTime对象), 匹配指
定⽇期之后的请求
predicates:
- After=2017-01-20T17:42:47.789-
07:00[America/Denver]
Before
匹配指定⽇期之前的请求
predicates:
- Before=2017-01-20T17:42:47.789-
07:00[America/Denver]
Between匹配两个指定时间之间的请求,
datetime2 的参数必须在 datetime1 之后
predicates:
- Between=2017-01-20T17:42:47.789-
07:00[America/Denver], 2017-01-
21T17:42:47.789-07:00 [ America/Denver ]
Cookie
请求中包含指定Cookie, 且该 Cookie值符合指定的正则表达式
predicates:
- Cookie=chocolate, ch.p
Header
请求中包含指定Header, 且该 Header值符合指定的正则表达式
predicates:
- Header=X-Request-Id, \d+
Host
请求必须是访问某个host(根据请 求中的Host 字段进⾏匹配)
predicates:
- Host=**.somehost.org,**.anotherhost.or g
Method
匹配指定的请求⽅式
predicates:
- Method=GET,POST
Path
匹配指定规则的路径
predicates:
- Path=/red/{segment},/blue/{segment}

5. ⽹关过滤器工厂

Predicate决定了请求由哪⼀个路由处理, 如果在请求处理前后需要加⼀些逻辑, 这就是Filter(过滤
器)的作⽤范围了.
Filter分为两种类型: Pre类型和Post类型.
Pre类型过滤器: 路由处理之前执⾏(请求转发到后端服务之前执⾏), 在Pre 类型过滤器中可以做鉴
权, 限流等.
Post类型过滤器: 请求执⾏完成后, 将结果返回给客户端之前执
⽐如去景区玩
  1. 进景区之前需要先安检, 验票(鉴权), 如果今⽇进景区的⼈超过了规定的⼈数, 就会进⾏限流
  2. 接下来进景区游玩
  3. 游玩之后, 对景区服务进⾏评价
1 就类似Pre类型过滤器, 3就类似Post类型过滤器, 过滤器可有可无
Spring Cloud Gateway 中内置了很多Filter, ⽤于拦截和链式处理web请求. ⽐如权限校验, 访问超时
等设定.
Spring Cloud Gateway从作⽤范围上, 把Filter可分为GatewayFilter 和GlobalFilter.
  1. GatewayFilter: 应⽤到单个路由或者⼀个分组的路由上.
  2. GlobalFilter: 应⽤到所有的路由上, 也就是对所有的请求⽣效
GatewayFilter Predicate 类似, 都是在配置文件 application.yml 中配置,每个过滤
器的逻辑都是固定的. 比如  AddRequestParameterGatewayFilterFactory 只需要在配置⽂件
中写 AddRequestParameter , 就可以为所有的请求添加⼀个参数, 我们先通过⼀个例子来演示GatewayFilter如何使用。

GlobalFilter是一种应用到所有路由上的过滤器,它会对所有的请求生效,而不是仅应用到单个路由或者一个分组的路由上。这意味着,不管是哪个路由,GlobalFilter都会对请求进行处理。

在Spring Cloud Gateway中,GlobalFilter可以用来实现一些全局的功能,比如安全认证、日志记录、请求转发等。与GatewayFilter相比,GlobalFilter的逻辑不是固定的,而是可以自定义的,因此它具有更大的灵活性和功能性。

举个例子,你可以创建一个自定义的GlobalFilter来记录每个请求的访问日志,并将日志信息保存到数据库中。这样无论是哪个路由的请求,都会被这个GlobalFilter捕获并进行相应的处理。

在配置文件application.yml中,GlobalFilter的配置方式与GatewayFilter类似,只需要在其中配置相应的过滤器名称即可。通过这种方式,GlobalFilter会应用到所有的路由上,对所有的请求生效。

 
演示示例:

        该filter只添加在了 product-service 路由下, 因此只对 product-service 路由⽣效, 也就是
/product/** 的请求⽣效.

6.常见的过滤信息参数设置

名称说明示例
AddRequestHeader
为当前请求添加Header
- AddRequestHeader=X-Request-red, blue
参数: Header的名称及值
AddRequestParameter
为当前请求添加请求参数
- AddRequestParameter=red, blue
参数: 参数的名称及值
AddResponseHeader
为响应结果添加Header
- AddResponseHeader=X-Response-Red, Blue
参数: Header的名称及值
RemoveRequestHeader
从当前请求删除某个Header

- RemoveRequestHeader=X-Request-Foo

参数: Header的名称

RemoveResponseHeader
从响应结果删除某个Header

- RemoveResponseHeader=X-Response-Foo

参数: Header的名称
RequestRateLimiter
为当前⽹关的所有请求 执⾏限流过滤, 如果被限流,默认提供了 RedisRateLimiter的限 流实现, 采⽤令牌桶算法实现限流功能. 此处不做
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
redis-rate-limiter.requestedTokens: 1
redis-rate-limiter.replenishRate : 令牌填充速度, 即 每秒钟允许多少个请求(不丢弃任何请求) redis-rate-limiter.burstCapacity : 令牌桶容量, 即每秒⽤⼾最⼤能够执⾏的请求数量(不丢弃任何请求). 将此值设置 为零将阻⽌所有请求
redis-rate-limiter.requestedTokens : 每次请求占⽤⼏个令牌, 默认为 1
Retry
针对不同的响应进⾏重 试. 当后端服务不可⽤ 时, ⽹关会根据配置参数来发起重试请求.
filters:
- name: Retry
args:
retries: 3
statuses: BAD_REQUEST
retries: 重试次数, 默认为3
status:HTTP请求返回的状态码, 针对指定状态码进⾏重试. 对应 org.springframework.http.HttpStatus
RequestSize
设置允许接收最⼤请求包的⼤⼩. 如果请求包⼤⼩超过设置的值, 则返回
请求包⼤⼩, 单位为字
节, 默认值为5M.
filters:
- name: RequestSize
args:
maxSize: 5000000
默认过滤器
添加⼀个filter并将其应⽤于所有路由, 这个属性需要⼀个filter的列表,
7.  限流算法的介绍
实例:一分钟最高一千次请求
1. 固定窗口
每分钟的窗口大小为1000,下一分钟清空窗口。
存在的问题:比如你前59秒都没人访问,59-60出现1000个人。然后重置窗口,60-61又出现1000个人访问,就会出现限流失策。
2. 滑动窗口
每一秒滑动一次,滑动的时候删除最前方一秒的数据,然后窗口一直在进窗口的时候进行判断是否大于1000,大于一千拒绝访问或者mq排队。
存在问题:一秒就相当于一秒的固定窗口,我可以在你移动之前出现流量顶峰,比如0.09s-0.1s有一千次。0.1s-0.11s又有一千次。
3. 漏桶算法
有一个固定容量的桶,用来存放待处理的请求或数据包。当请求到达时,如果桶还有剩余空间,则将请求放入桶中,如果桶已满,则拒绝该请求或丢弃数据包。桶以固定的速率向外漏水(即处理请求或发送数据包),这样就限制了流量的速率。
存在问题:漏桶算法虽然可以限制流量的速率,但它不会关心请求的处理时间,并且不能处理突发流量的情况。比如桶里无论有多少数据,他都是按照固定速率去漏。
4. 令牌桶算法
有一个固定容量的桶,里面存放着令牌(tokens)。桶以固定的速率产生令牌,并且最多存放固定数量的令牌。当请求到达时,如果桶中有足够的令牌,则允许请求通过,并且从桶中移除相应数量的令牌;如果桶中没有足够的令牌,则拒绝该请求。
这种算法允许一定程度的突发流量,只要桶中有足够的令牌,即使速率超过了平均速率也是可以的。

总结:

随着微服务架构的广泛应用,API 网关成为了系统架构中的关键组件,用于统一处理所有的请求和响应,实现了诸如动态路由、权限控制、负载均衡、断路器等功能。Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个全新项目,提供了强大而灵活的方式来构建 API 网关服务。

Spring Cloud Gateway 的功能和特点包括:

  1. 动态路由:根据需求动态地将请求路由到相应的后端服务,实现请求的分发和转发。
  2. 权限控制:通过实现对请求的安全控制,包括认证、鉴权、请求加密等功能,保障系统的安全性。
  3. 负载均衡:集成了负载均衡的功能,可以将请求分发到多个后端服务实例中,提高系统的可用性和性能。
  4. 断路器:支持断路器模式,可以在后端服务不可用时进行降级处理,避免整个系统的崩溃。
  5. 统一的认证和授权:可以集成统一的认证和授权机制,保护系统的安全性。
  6. 监控和日志:支持监控和日志记录,帮助开发者排查问题和优化系统性能。

在使用 Spring Cloud Gateway 进行开发时,主要包括以下步骤:

  1. 创建一个新的模块,并引入相应的依赖,其中包括 Spring Cloud Gateway 和用于动态路由的注册中心(如 Nacos),以及负载均衡的依赖。
  2. 修改配置文件,配置网关的端口、注册中心地址以及路由规则等信息。
  3. 配置路由的规则,通过配置文件指定请求的路径和目标服务地址,实现请求的转发。
  4. 可以根据需要使用路由断言工厂,实现更加精细化的路由控制。
  5. 配置网关过滤器工厂,实现对请求的预处理和后处理,包括添加请求头、请求参数、限流等功能。

对于限流算法,常见的有固定窗口、滑动窗口、漏桶算法和令牌桶算法。其中,令牌桶算法是一种常用的限流算法,通过固定容量的令牌桶和固定速率产生令牌来限制请求的处理速率,允许一定程度的突发流量。

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

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

相关文章

分布式系统常用的三注解:@DS,@DistributeLock,@GlobalTransactional【开发实践】

文章目录 一、多数据源的动态切换&#xff1a;DS1.1 多数据源的背景1.1.1 主从复制1.1.2 读写分离1.1.3 分库分表 1.2 DS的使用流程1.2.1 添加依赖1.2.2 配置数据源1.2.3 使用 DS 切换数据源 1.3 使用DS切换数据源失效1.3.1 情形二&#xff1a;同类中的方法调用DS方法1.3.2 情形…

关于Golang中自定义包的简单使用-Go Mod

1. go env 查看 GO111MODULE 是否为 on&#xff0c;不是修改成on go env -w GO111MODULEon 2 .自定义包的目录格式 3. test.go 内容 package calc func Add(x, y int) int { // 首字母大写表示公有方法return x y }func Sub(x, y int) int {return x - y } 4.生成calc目…

CORSscannerburp的插件jsonp-hunterdnsub

1.CORSscanner 下载地址&#xff1a;CORScanner: Fast CORS misconfiguration vulnerabilities scanner 有时候会出一些警告没引入变量之类的&#xff0c;用pip安装一下就可以了 打开之后是这样的 2.jsonp-hunter 安装jython&#xff1a;Jython的安装和配置环境_jython安装…

前后端分离与实现 ajax 异步请求 和动态网页局部生成

前端 <!DOCTYPE html><!-- 来源 --> <!-- https://cloud.tencent.com/developer/article/1705089 --> <!-- https://geek-docs.com/ajax/ajax-questions/19_ajax_javascript_send_json_object_with_ajax.html --> <!-- 配合java后端可以监听 --&…

最新OpenAI免费API-openai api key获取方式

最近又开始准备LLM 应用开发&#xff0c;要用到api key&#xff0c;才发现过我之前免费发放的额度没了&#xff01;我都没咋用过&#xff0c;痛心&#x1f62d;&#x1f62d;&#x1f62d;&#xff01; 现在 OpenAI 有要求必须充值 5 刀才能使用&#xff0c;问就是没钱&#x…

Leetcode-438-找到字符串中所有的字母异位词

题目说明 给定一个字符串 s 和一个非空字符串 p&#xff0c;找到 s 中所有是 p 的字母异位词的子串&#xff0c;返回这些子串的起始索引。 字符串只包含小写英文字母&#xff0c;并且字符串 s 和 p 的长度都不超过 20100。 说明&#xff1a; 字母异位词指字母相同&#xff…

前端面试指南(一面)

知识点梳理 变量类型 ECMAScript 中定义了 6 种原始类型&#xff1a; 6种: Boolean String Number Null Undefinded Symbol 注意&#xff1a;原始类型不包含 Object。 typeof typeof xxx得到的值有以下几种类型&#xff1a;undefined boolean number string object function、…

除visio以外的几款好用流程图绘制工具

流程图绘制软件在嵌入式软件开发中扮演着重要的角色&#xff0c;它们能够帮助用户清晰、直观地展示工作流程。以下是几款流行的流程图绘制软件及其特点的详细报告&#xff1a; 思维导图MindMaster MindMaster作为一款专业的思维导图软件&#xff0c;不仅具备强大的思维导图制作…

硕士课程 可穿戴设备之作业一

作业一 第一个代码使用的方法是出自于[1]。 框架结构 如下图&#xff0c;不过根据对代码的解读&#xff0c;发现作者在代码中省去了对SSR部件的实现&#xff0c;下文再说。 Troika框架由三个关键部件组成&#xff1a;信号分解&#xff0c;SSR和光谱峰值跟踪。&#xff08;粗…

游戏缺失xinput1_3.dll怎么修复,总结几种有效的修复方法

在现代科技日新月异的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;由于各种原因&#xff0c;电脑可能会出现一些错误或问题&#xff0c;其中之一就是找不到xinput13.dll文件&#xff0c;这个问题会导致软件或者游戏无法正常启动运行&#xf…

面试 Redis 八股文十问十答第二期

面试 Redis 八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;redis 一般都用在什么场景…

搜维尔科技:使用Touch 触觉力反馈设备,用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中

使用Touch 触觉力反馈设备&#xff0c;用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中 搜维尔科技&#xff1a;使用Touch 触觉力反馈设备&#xff0c;用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中

文件编码概念

文件的读取 open()函数&#xff1a; 打开一个已存在的文件&#xff0c;或者创建一个新文件 open(name,mode,encoding) name:是要打开的目标文件名的字符串&#xff08;可以包含文件所在的具体路径&#xff09; mode:设置打开文件的模式&#xff08;访问模式&#xff09;&am…

C语言—字符函数和字符串函数

1.字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件 ctype.h。 例&#xff1a;将一句话中的小写字母改成大写字母。 2.字符转换函数 头文件&#xff1a;ctype.h C语言提供了2…

【数据集划分】假如你有超百万条oracle数据库数据(成真版)

【数据集划分】假如你有接近百万条oracle数据库数据&#xff08;成真版&#xff09; 写在最前面小结 数据集划分原因注意事项 1. 留出法&#xff08;Hold-out Method&#xff09;原理算法复杂度代码示例Scikit-learn的train_test_split分布式计算框架&#xff08;如Apache Spar…

JVMの垃圾回收

在上一篇中&#xff0c;介绍了JVM组件中的运行时数据区域&#xff0c;这一篇主要介绍垃圾回收器 JVM架构图&#xff1a; 1、垃圾回收概述 在第一篇中介绍JVM特点时&#xff0c;有提到过内存管理&#xff0c;即Java语言相对于C&#xff0c;C进行的优化&#xff0c;可以在适当的…

DRIVEN|15分的CNN+LightGBM怎么做特征分类,适用于转录组

说在前面 今天分享一篇做深度学习模型的文章&#xff0c;这是一篇软硬结合的研究&#xff0c;排除转换实体产品&#xff0c;我们做生信基础研究的可以学习模仿这个算法&#xff0c;适用且不局限于临床资料&#xff0c;转录组数据&#xff0c;GWAS数据。 今天给大家分享的一篇文…

用香橙派AIpro部署大模型、安装宝塔搭建私有随身WEB开发环境

什么是香橙派 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板&#xff0c;其搭载了昇腾 AI 处理器&#xff0c;可提供 8TOPS INT8 的计算能力&#xff0c;内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算&#xff0c;可广泛…

【路径规划】基于蚁群算法ACO促进水果检测数据集的获取附matlab代码

% 初始化蚁群算法参数 num_ants 20; % 蚂蚁数量 num_iterations 100; % 迭代次数 alpha 1; % 信息素重要程度参数 beta 2; % 启发式信息重要程度参数 rho 0.5; % 信息素挥发率 Q 1; % 信息素增加量 pheromone_initial 0.1; % 初始信息素浓度 num_nodes 100; % 图中节点…

JL-8B/2211电流继电器 带板前接线底座 约瑟JOSEF

JL-8集成电路电流继电器 系列型号 JL-8A/11集成电路电流继电器;JL-8B/11集成电路电流继电器; JL-8A/12集成电路电流继电器;JL-8B/12集成电路电流继电器; JL-8A/13集成电路电流继电器;JL-8B/13集成电路电流继电器; JL-8A/21集成电路电流继电器;JL-8B/21集成电路电流继电器; JL-…