门面模式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网关?
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. 网关过滤器工厂
- 进景区之前需要先安检, 验票(鉴权), 如果今日进景区的人超过了规定的人数, 就会进⾏限流
- 接下来进景区游玩
- 游玩之后, 对景区服务进行评价
- GatewayFilter: 应用到单个路由或者⼀个分组的路由上.
- GlobalFilter: 应用到所有的路由上, 也就是对所有的请求⽣效
GatewayFilter 同 Predicate 类似, 都是在配置文件 application.yml 中配置,每个过滤器的逻辑都是固定的. 比如 AddRequestParameterGatewayFilterFactory 只需要在配置文件中写 AddRequestParameter , 就可以为所有的请求添加一个参数, 我们先通过一个例子来演示GatewayFilter如何使用。
GlobalFilter是一种应用到所有路由上的过滤器,它会对所有的请求生效,而不是仅应用到单个路由或者一个分组的路由上。这意味着,不管是哪个路由,GlobalFilter都会对请求进行处理。
在Spring Cloud Gateway中,GlobalFilter可以用来实现一些全局的功能,比如安全认证、日志记录、请求转发等。与GatewayFilter相比,GlobalFilter的逻辑不是固定的,而是可以自定义的,因此它具有更大的灵活性和功能性。
举个例子,你可以创建一个自定义的GlobalFilter来记录每个请求的访问日志,并将日志信息保存到数据库中。这样无论是哪个路由的请求,都会被这个GlobalFilter捕获并进行相应的处理。
在配置文件application.yml中,GlobalFilter的配置方式与GatewayFilter类似,只需要在其中配置相应的过滤器名称即可。通过这种方式,GlobalFilter会应用到所有的路由上,对所有的请求生效。
演示示例:
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的列表, |
总结:
随着微服务架构的广泛应用,API 网关成为了系统架构中的关键组件,用于统一处理所有的请求和响应,实现了诸如动态路由、权限控制、负载均衡、断路器等功能。Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个全新项目,提供了强大而灵活的方式来构建 API 网关服务。
Spring Cloud Gateway 的功能和特点包括:
- 动态路由:根据需求动态地将请求路由到相应的后端服务,实现请求的分发和转发。
- 权限控制:通过实现对请求的安全控制,包括认证、鉴权、请求加密等功能,保障系统的安全性。
- 负载均衡:集成了负载均衡的功能,可以将请求分发到多个后端服务实例中,提高系统的可用性和性能。
- 断路器:支持断路器模式,可以在后端服务不可用时进行降级处理,避免整个系统的崩溃。
- 统一的认证和授权:可以集成统一的认证和授权机制,保护系统的安全性。
- 监控和日志:支持监控和日志记录,帮助开发者排查问题和优化系统性能。
在使用 Spring Cloud Gateway 进行开发时,主要包括以下步骤:
- 创建一个新的模块,并引入相应的依赖,其中包括 Spring Cloud Gateway 和用于动态路由的注册中心(如 Nacos),以及负载均衡的依赖。
- 修改配置文件,配置网关的端口、注册中心地址以及路由规则等信息。
- 配置路由的规则,通过配置文件指定请求的路径和目标服务地址,实现请求的转发。
- 可以根据需要使用路由断言工厂,实现更加精细化的路由控制。
- 配置网关过滤器工厂,实现对请求的预处理和后处理,包括添加请求头、请求参数、限流等功能。
对于限流算法,常见的有固定窗口、滑动窗口、漏桶算法和令牌桶算法。其中,令牌桶算法是一种常用的限流算法,通过固定容量的令牌桶和固定速率产生令牌来限制请求的处理速率,允许一定程度的突发流量。
相关文章:
门面模式Api网关(SpringCloudGateway)
1. 前言 当前通过Eureka、Nacos解决了服务注册和服务发现问题,使用Spring Cloud LoadBalance解决了负载均衡的需求,同时借助OpenFeign实现了远程调用。然而,现有的微服务接口都直接对外暴露,容易被外部访问。为保障对外服务的安全…...
玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型
** 玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型 ** 目录 玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型 前言一、问题描述二、创建模型2.1 识别机构中的刚体2.2 确定刚…...
手撸一个java网关框架
手写一个简易的Java网关框架涉及到很多方面,但我会提供一个基本的框架概念和代码示例,帮助你理解网关的基本构建。以下是一个简单的Java网关框架的实现: 定义路由:需要一个路由表来映射请求的URL到对应的处理器。 请求处理&#x…...
亮数据代理IP助力高效数据采集
文章目录 📑前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 本篇采用的代理IP 四、零代码获取数据4.1 前置背景4.2 亮数据浏览器自动抓取数据4.3 使用步骤: 五、数据集5.1 免费样本5.2 定制数据集 🌤️个人小结 …...
VS2022,DLL1调用lib,lib调用DLL2
DLL1调用lib,lib调用DLL2 问题1:为什么在dll1中需要引入dll2的.lib文件 当你有一个工程(dll1)调用静态库(lib),而静态库(lib)又调用另一个DLL(dll2…...
Unity Mirror VR联机开发 房间篇
一、需求 在联机时通常有加入房间这个步骤,在mirror示例中也有相应的案例,但是那个比较复杂,我们做教育科普类不需要如此复杂,傻瓜式操作基本就可以了,所以我简化了步骤,省略了点击准备按钮这一步骤&#…...
二叉树—leetcode
前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇:数据结构-二叉树-CSDN博客 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见📝 &…...
shell编程(二)——字符串与数组
本文为shell 编程的第二篇,介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’,也可以用双引号 “”,也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号(使用转义符…...
【数据结构】二叉树专题
前言 本篇博客我们来看一些二叉树的经典题型,也是对上篇博客的补充 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 目录 1.单值二叉树 …...
开源模型应用落地-LangChain高阶-LCEL-表达式语言(四)
一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么? LCEL是一种非常灵活和强大的语言,可以帮助您更…...
Python第二语言(九、Python第一阶段实操)
目录 1. json数据格式 2. Python与json之间的数据转换 3. pyecharts模块官网 4. pyecharts快速入门(折线图) 5. pyecharts全局配置选项 5.1 set_global_ops使用 5.1.1. title_opts 5.1.2 legend_opts 5.1.3 toolbox_opts 5.1.4 visualmap_opts…...
Java异常机制
1.异常概述和异常处理机制 异常(exception)概述 异常就是程序在运行时出现的意外的,不正常的情况。 若异常产生后没有正确的处理,会导致程序的中断,程序不继续执行,以致造成损失。 2.2 异常处理机制 所以我们在开发中要一套机制来处理各种可能…...
Aws EC2,kubeadm方式安装kubernetes(k8s)
版本 docker版本:20.10.25 k8s版本(kubeadm,kubelet和kubectl):1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …...
python 比较 mysql 表结构差异
最近在做项目的时候,需要比对两个数据库的表结构差异,由于表数量比较多,人工比对的话需要大量时间,且不可复用,于是想到用 python 写一个脚本来达到诉求,下次有相同诉求的时候只需改 sql 文件名即可。 com…...
【RAG入门教程01】Langchian框架 v0.2介绍
LangChain 是一个开源框架,旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…...
python 做成Excel并设置打印区域
记录首次用python处理Excel表格的过程。 参考文章:https://www.jianshu.com/p/5e00dc2c9f4c 程序要做的事情: 1. copy 模板文件到 output 文件夹并重命名为客户指定的文件名 2. 从 DB 查询数据并将数据写入 Excel 3. 写数据的同时, 设置每…...
SpringAI(二)
大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…...
小白都可以通过U盘重装系统,再也不用花50块钱去安装系统啦
下载Ventoy 软件 1、今天带着大家通过Ventoy 安装Windows 11 系统。 2、首先我们通过官网如下地址:https://www.ventoy.net/cn/,找到我们对应系统的Ventoy 软件安装包。 3、通过官网可以找到软件包的地址地址,如下图所示。 4、如下就是我下…...
android 双屏异显-学习笔记
双屏异显 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看。这里就涉及到 Android 的双屏异显的问题,实现Android 的双屏异显,Google 也提供了相应的 API方法 Presentation。…...
Android Lottie 体积优化实践:从 6.4 MB 降到 530 KB
一、说明 产品提出需求:用户有 8 个等级,每个等级对应一个奖牌动画。 按照常用的实现方式: 设计提供 8 个 lottie 动画(8 个 json 文件)。研发将 json 文件打包进入 APK 中。根据不同等级播放指定的动画。 每一个 …...
Django前端页面-模板继承
通过模板的继承,可以将所有共同的前端页面移到母版,那么其他页面就可以用到母版了。 这是母版 <!DOCTYPE html> <html><head>{% block css %}{% endblock %}</head><body><h1>母版</h1><div><!-- …...
使用HTML、CSS和JavaScript编写一个注册界面(一)
倘若文章或代码中有任何错误或疑惑,欢迎提出交流哦~ HTML和CSS 首先,我们需要编写一个简洁的注册界面。 简单编写下,如下: 呈现效果为: <!DOCTYPE html> <html lang"en"><head><me…...
什么是档案数字化管理
档案数字化管理指的是将传统的纸质档案转换为数字形式,并通过电子设备、软件和网络技术进行管理和存储的过程。 档案数字化管理包括以下几个步骤: 1. 扫描和数字化:将纸质档案通过扫描仪转换为数字图像或文档。可以使用OCR(光学字…...
vuInhub靶场实战系列--prime:1
免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…...
L48---1637. 两点之间不包含任何点的最宽垂直区域(排序)---Java版
1.题目描述 2.思路 (1)返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 我的理解是相邻两个点,按照等差数列那样,后一个数减去相邻的前一个数,才能保证两数之间不含其他数字。 (2)所以&…...
在线渲染3d怎么用?3d快速渲染步骤设置
在线渲染3D模型是一种高效的技术,它允许艺术家和设计师通过互联网访问远程服务器的强大计算能力,从而加速渲染过程。无论是复杂的场景还是高质量的视觉效果,在线渲染服务都能帮助您节省宝贵的时间。 在线渲染3D一般选择的是:云渲染…...
《软件定义安全》之二:SDN/NFV环境中的安全问题
第2章 SDN/NFV环境中的安全问题 1.架构安全 SDN强调了控制平面的集中化,从架构上颠覆了原有的网络管理,所以SDN的架构安全就是首先要解决的问题。例如,SDN实现中网络控制器相关的安全问题。 1.1 SDN架构的安全综述 从网络安全的角度&…...
Qt图表类介绍
本文主要介绍QCharts相关的模块及类。 Qt中图表模块有以下几种类型:折线图,样条曲线图,面积图,散点图,条形图,饼图,方块胡须图,蜡烛图,极坐标图。 QCharts的图表框架类似…...
时隔很久运行苍穹外卖项目,出现很多错误
中途运行了很多其他项目,maven的配置文件还被我修改了一次。导致再次运行苍穹外卖项目出现很多错误。 发现没有办法,把本地的仓库删了个干干净净。然后点击clean发现报错: Cannot access alimaven (http://mavejavascript:void(0);n.aliyun.…...
补篇协程:协程(Coroutine)里通过挂起suspend函数实现异步IO操作
异步IO的概念 异步IO是一种非阻塞的数据读写方法,异步IO与同步IO相对。 当一个异步过程调用发出后,调用者不能立刻得到结果。 实际的IO处理部件在完成操作后,会通过状态、通知或回调机制来通知调用者。 在一个CPU密集型的应用中,…...
linux wordpress 下载/湖南长沙最新疫情
1.JS基本语法: 1.js引入方式 js是脚本语言,可以在浏览器中执行。js文件是以.js为结尾的,引入html文件中时使用script标签,这时script需要添加一个属性src,src中写js文件的路径;但是js还可以直接写在html当中…...
网站建设的合同书/网络营销策略制定
一、前言为了方便小公司没有运维开发人员,利用Jenkin解决了繁琐的打包部署问题。这次我就写了一个Gogs的集成教程,我觉的Gogs私服比较简单,其他的GitLab、svn、GitHub基本上也是一样的,搭建好了,开发人员只需要提交到版…...
广州网站制作托管/seo中文全称是什么
300W逆变电源资料 pcb,原理图 300W逆变电源资料 pcb,原理图 id658271275104&...
青海省住房和建设厅网站首页/市场调研与分析
https://mp.weixin.qq.com https://mp.weixin.qq.com/s?__bizMzI3NzE0NjcwMg...
企业网站开发一般多少钱/网站优化排名软件哪些最好
【49】监听器基本概念JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext,HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。Servlet监听器的分类在…...
大航母网站建设与服务/百度联盟广告点击一次收益
一、 集群概述 1、 什么是集群? 一组各自相互独立且又相互依赖的,通过高速网络互联的计算机组成的一个计算机组, 以单一的系统模式加以管理, 为用户提供服务, 对用户来说, 用户只会认为对方是一个服务. 这个里面, 一组计算机的一台计算机就是集群的一个节点 2、 集…...