Gateway 统一网关
一、初识 Gateway
1. 为什么需要网关
我们所有的服务可以让任何请求访问,但有些业务不是对外公开的,这就需要用网关来统一替我们筛选请求,它就像是房间的一道门,想进入房间就必须经过门。而请求想要访问微服务,就必须通过网关再到微服务。
2. 网关的作用
- 身份认证和权限校验
网关是微服务的入口,会验证用户是否有请求资格,如果没有则进行拦截
- 服务路由、负载均衡
网关不处理业务,根据拟定好的规则,将请求转发到对应的微服务中,这个过程就是路由。当对应的微服务有部署了多个,同样需要根据拟定的规则做负载均衡。
- 请求限流
请求量过高时,网关根据微服务能够接受的请求量来放行请求,避免服务压力过大。就像是红绿灯避免交通堵塞的原理类似。
在 SprignCloud 中网关的实现包括两种:
- gateway
- zuul:zuul 是基于 Servlet 实现的,属于阻塞式编程。而SpringCloudGateway 是基于 Spring5 中提供的 WebFlux, 属于响应式编程的实现,具备更好的性能。
二、入门案例
1. 创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖,如果没有统一管理版本号,需要加上<version></version>
<!--nacos服务注册发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--网关gateway依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
2. 编写启动类
@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
3. 路由配置及nacos地址
3.1 创建application.yml文件
server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置(routes: 多个; route: 一个)- id: user-service # 路由id,自定义,只要唯一即可uri: lb://userservice # 第一种写法:路由的目标地址; lb(loadBalance)是指负载均衡,后面跟服务名称predicates: # 路由断言,也就是判断请求是否符合路由规则的条件(断言一般是布尔类型)- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
# 可以同时配置多个服务路由- id: baidu-demouri: https://www.baidu.com # 第二种写法:路由的目标地址 http就是固定地址predicates:- Path=/baidu/** # 注意使用本服务测试需要开启下面截取path,不然拼接的路径无效
# filters:
# path断言路由的请求格式默认为uri+path,如果不需要携带path可以截取掉
# - StripPrefix=1 # 截取掉- Path中的第一级路径/baidu# 初学期间为了方便调试与快速定位错误,可以将gateway打印日志级别调低
logging:level:org:springframework:cloud:gateway: trace
路由的配置包括:
1.路由id:路由的唯一标示
2.路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
3.路由断言(predicates):判断路由的规则,一般是布尔类型
4.路由过滤器(filters):对请求或响应做处理
重启网关服务, 访问 localhost:10010/user/1,如下图所示
被拦截状态
至此案例到此结束,为了更好的了解网关在这期间默默的付出了哪些,下面将网关原理聊一聊。
用户发送请求后,首先会通过网关,而网关是不做任何业务的,会去注册中心 Nacos 中拉取服务列表,然后根据负载均衡选择一个服务发送用户的请求。如下图
三、断言工厂
我们配置文件中写的断言规则是字符串,这些字符串会被断言工厂(Route Predicate Factory)读取处理,转变为路由判断的条件。断言工厂为我们把字符串转变为了判断条件。例如 Path=/user/** 是按照路径匹配,这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的。像这样的断言工厂在SpringCloudGateway还有十几个。
名称 | 说明 | 示例 |
---|---|---|
After | 是某个时间点后的请求 | - After=2037-01-20T17:42:47.789-07:00[America/Denver] |
Before | 是某个时间点之前的请求 | - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
Between | 是某两个时间点之前的请求 | - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
Cookie | 请求必须包含某些cookie | - Cookie=chocolate, ch.p |
Header | 请求必须包含某些header | - Header=X-Request-Id, \d+ |
Host | 请求必须是访问某个host(域名) | - Host=.somehost.org,.anotherhost.org |
Method | 请求方式必须是指定方式 | - Method=GET,POST |
Path | 请求路径必须符合指定规则 | - Path=/red/{segment},/blue/** |
Query | 请求参数必须包含指定参数 | - Query=name, Jack或者- Query=name |
RemoteAddr | 请求者的ip必须是指定范围 | - RemoteAddr=192.168.1.1/24 |
Weight | 权重处理 |
四、过滤器工厂
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理
Spring提供了31种不同的路由过滤器工厂。例如:
名称 | 说明 |
---|---|
AddRequestHeader | 给当前请求添加一个请求头 |
RemoveRequestHeader | 移除请求中的一个请求头 |
AddResponseHeader | 给响应结果中添加一个响应头 |
RemoveResponseHeader | 从响应结果中移除有一个响应头 |
RequestRateLimiter | 限制请求的流量 |
…… |
下面举个例子给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!
实现方式:
1. 局部过滤器(GatewayFilter)
filters : 配置在路由下的过滤器只对当前路由的请求生效, filters 在 routes 的目录下
1. 在gateway中修改application.yml文件, 给userservice的路由添加过滤器
spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/** filters: # 路由过滤器- AddRequestHeader=Truth, me is freaking awesome! # 添加请求头
为了方便观察是否添加成功,这里改造方法如下
2. 默认过滤器(DefaultFilter)
default-filters : 对所有路由都生效的过滤器, default-filters 和 routes 同级目录
spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/**default-filters: # 默认过滤器- AddRequestHeader=Truth, me is freaking awesome!
3. 全局过滤器(GlobalFilter)
全局过滤器 (GlobalFilter) 的作用也是处理一切进入网关的请求和微服务响应,与上面的作用一样。
区别在于
- GatewayFilter通过配置定义,处理逻辑是固定的。
- 而上面的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口。
public interface GlobalFilter {/*** 处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理** @param exchange 请求上下文,里面可以获取Request、Response等信息* @param chain 用来把请求委托给下一个过滤器 * @return {@code Mono<Void>} 返回标示当前过滤器业务结束*/Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
3.1 自定义全局过滤器
需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
参数中是否有authorization?authorization参数值是否为admin?如果同时满足则放行,否则拦截
实现步骤
1. 在 gateway 中定义一个过滤器
@Order(-1) // 权重注解,值越小优先级越高
@Component
public class AuthorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();// 2.获取authorization参数String auth = params.getFirst("authorization");// 3.校验if ("admin".equals(auth)) {// 放行return chain.filter(exchange);}// 4.拦截// 4.1.禁止访问,设置状态码exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);// 4.2.结束处理return exchange.getResponse().setComplete();}
}
2. 测试,访问 http://localhost:10010/user/1?authorization=admin 可以看到成功获取到响应结果
若不符合要求则无法获取结果
4. 过滤器的执行顺序
请求进入网关会碰到三类过滤器,当前路由的过滤器、DefaultFilter、GlobalFilter
请求路由后,会将当前路由过滤器和 DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器。
过滤器执行顺序
- 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
- GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定。
- 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
- 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
4.1 定义执行顺序的两种方式
5. 限流过滤器
限流:对应用服务器的请求做限制,避免因过多请求而导致服务器过载甚至宕机。限流算法如下:
- 计数器算法,又包括固定窗口计数器算法、滑动窗口计数器算法
- 漏桶算法(Leaky Bucket)
- 令牌桶算法(Token Bucket)
1. 计数器算法 --- 固定窗口计数器算法
- 将时间划分为多个窗口;
- 在每个窗口内每有一次请求就将计数器加一,当时间到达下一个窗口时,计数器重置。
- 如果计数器超过了限制数量,则本窗口内所有的请求都被丢弃。
但是这种会有个问题,假如我们在1s内允许通过的请求数量是100,如果在窗口失效的最后几毫秒发送了99个请求,接着又在下一个时间窗口开始时发送99个请求,那么这个用户这1s内就不止发送100个请求了,这就是临界值问题。
2. 计数器算法 --- 滑动窗口计数器算法
滑动窗口计算算法就是为了解决固定窗口计算算法存在临界值的问题而出现的。假设我们1秒内允许通过100个请求,但我们把1秒分成多个窗格(窗格数越多,流量过度越平滑)。
3. 漏桶算法
- 将每个请求视作"水滴"放入"漏桶"进行存储;
- "漏桶"以固定速率向外"漏"出请求来执行,如果"漏桶"空了则停止"漏水”;
- 如果"漏桶"满了则多余的"水滴"会被直接丢弃。
4. 令牌桶算法
以固定的速率生成令牌,存入令牌桶中,如果令牌桶满了以后,多余令牌丢弃
六、跨域问题
- 跨域:域名、端口、协议三者任意一个不同就是跨域
域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com
端口不同:localhost:8080和localhost:8081
协议不同:https:xxx.com 和 http:xxx.com
- 跨域问题:浏览器禁止请求发送者与服务端跨域ajax请求,说白了就是请求被浏览器拦截的问题。
- 解决方案:CORS (跨域资源共享)
网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现:
spring:cloud:gateway:globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins: # 允许哪些网站的跨域请求 - "http://localhost:8090"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期, 有效期内浏览器不询问是否拦截
相关文章:
Gateway 统一网关
一、初识 Gateway 1. 为什么需要网关 我们所有的服务可以让任何请求访问,但有些业务不是对外公开的,这就需要用网关来统一替我们筛选请求,它就像是房间的一道门,想进入房间就必须经过门。而请求想要访问微服务,就必须…...
7 种常见的前端攻击
大家都知道,保证网站的安全是十分重要的,一旦网站被攻陷,就有可能造成用户的经济损失,隐私泄露,网站功能被破坏,或者是传播恶意病毒等重大危害。所以下面我们就来讲讲7 种常见的前端攻击。 1. 跨站脚本 (X…...
element plus实现点击上传于链接上传并且回显到upload组件中
摘要: 今天遇到一个问题:vue3使用elemnt plus的上传图片时,数据是从别人的系统导出来的商品,图片是http的形式的,并且商品很多的,一个一个下载下来再上传很麻烦的,所以本系统插件商品时图片使用…...
ELK日志分析系统部署
ELK日志分析系统 ELK指的是ElasticsearchLogstashKibana这种架构的缩写。 ELK是一种日志分析平台,在很早之前我们经常使用Shell三剑客(一般泛指grep、sed、awk)来进行日志分析,这种方式虽然也可以应对多种场景,但是当…...
驾校小程序:一站式学车解决方案的设计与实践
一、引言 随着移动互联网技术的飞速发展,人们的生活方式和消费习惯正在发生深刻变化。驾校作为传统的服务行业,也面临着数字化转型的迫切需求。驾校小程序作为一种轻量级的应用,能够为用户提供便捷、丰富的学车服务,成…...
【自然语言处理】BERT模型
BERT:Bidirectional Encoder Representations from Transformers BERT 是 Google 于 2018 年提出的 自然语言处理(NLP)模型,它基于 Transformer 架构的 Encoder 部分。BERT 的出现极大提升了 NLP 任务的性能,如问答系…...
Android 添加如下飞行模式(飞行模式开和关、飞行模式开关菜单显示隐藏)接口
请添加如下飞行模式(飞行模式开关、飞行模式开关显示隐藏)接口: 飞行模式飞行模式开关com.action.airplankey: enable value:boolean true open the airplan false close the airplan关闭Intent intent = new Intent(); intent.setAction("com.action.airplan");…...
【Vue3】基于 Vue3 + ECharts 实现北京市区域地图可视化
文章目录 基于 Vue3 ECharts 实现北京市区域地图可视化1、引言2、项目初始化2.1、环境搭建2.2 、安装依赖2.3、项目结构 3、地图数据准备3.1、地图 JSON 文件获取(具体的json数据) 4、 组件开发4.1、Map 组件的设计思路4.2、基础结构实现4.3、核心数据结…...
【IC】什么是min period check
在 Synopsys Primetime 工具中可以检查.lib 文件中时钟输入的最小周期。想象这样一个场景,有一个设计 A,它有一个名为 clk 的时钟,并且该设计的 clk 周期被设定为一个值,比如 2 纳秒,即 500MHz。假设我们在进行静态时序…...
MyBatis入门之一对多关联关系(示例)
【图书介绍】《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版)》-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版)》(杨章伟,刘祥淼)【摘要 书评 试读】- 京东图书 …...
【Git 】Windows 系统下 Git 文件名大小写不敏感
背景 在 Windows 系统上,Git 对文件名大小写的不敏感性问题确实存在。由于 Windows 文件系统(如 NTFS )在默认情况下不区分文件名大小写所导致的。 原因分析 文件系统差异 Windows文件系统(如 NTFS)默认不区分文件名…...
【算法系列-二叉树】层序遍历
【算法系列-二叉树】层序遍历 文章目录 【算法系列-二叉树】层序遍历1. 算法分析🛸2. 相似题型🎯2.1 二叉树的层序遍历II(LeetCode 107)2.2 二叉树的右视图(LeetCode 199)2.3 二叉树的层平均值(LeetCode 637)2.4 N叉树的层序遍历(LeetCode 429)2.5 在每个…...
我的世界方块改进版
引子 之前文章的磁性方块,通过3D打印实现,也批量打印了一些,下图就是一个小树 使用过程中,发现磁力感觉不紧,所以想改进一版。 正文 之前的结构如下:: 如果出现相邻的空隙间的磁铁相互作用&am…...
博客搭建之路:hexo增加搜索功能
文章目录 hexo增加搜索功能本地搜索弊端algolia搜索 hexo增加搜索功能 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 作为一个博客,没有搜索功能,如何在大批文章中找到自己想要的,那在hexo中如何增加搜索功能呢? search:path: sea…...
2024年最新互联网大厂精选 Java 面试真题集锦(JVM、多线程、MQ、MyBatis、MySQL、Redis、微服务、分布式、ES、设计模式)
前言 春招,秋招,社招,我们 Java 程序员的面试之路,是挺难的,过了 HR,还得被技术面,在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸…...
MybatisPlus入门(一)MybatisPlus简介
一、MyBatis简介 MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率 - 官网:https://mybatis.plus/ https://mp.baomidou.com/ MyBatisPlus特性: - 无侵入:只做增强…...
QoS学习笔记
QoS业务分类 基于 DiffServ 服务模型的 QoS 业务可以分为以下几大类: 流分类和标记(Traffic classification and marking):要实现差分服务,需要首先将数据包分为不同的类别或者设置为不同的优先级。将数据包分为不同…...
图(邻接矩阵)知识大杂烩!!(邻接矩阵结构,深搜,广搜,prim算法,kruskal算法,Dijkstra算法,拓扑排序)(学会一文让你彻底搞懂!!)
小伙伴们大家好,今天给大家带来图(邻接矩阵)的各种知识,让你看完此文章彻底学会邻接矩阵的相关问题。 1.邻接矩阵表示方法 1.1知识讲解 我们用一个二维数组arr来表示图。若图为有向图,其中arr【i】【j】w表示i号点和…...
Prometheus自定义PostgreSQL监控指标
本文我们将介绍如何在Prometheus中创建自定义PostgreSQL指标。默认情况下由postgres_export运行的查询可能不能满足用户需求,但我们可以创建自定义查询,并要求postgres_exporter公开自定义查询的结果。postgres_exporter最近被移到了Prometheus Communit…...
400行程序写一个实时操作系统(十六):操作系统中的调度策略
前言 在前面我们完成了Sparrow的临界区的代码,使用临界区,能够解决常见的并发问题,现在该完善我们的调度算法了。 调度算法在操作系统领域常常是热门的话题。不同的用途将会使用不同的调度策略。在本节,笔者将为大家介绍一些操作…...
从安灯系统看汽车零部件工厂的智能制造转型
在当今快速发展的制造业领域,汽车零部件工厂正面临着日益激烈的市场竞争和不断提高的客户需求。为了在竞争中脱颖而出,实现可持续发展,许多汽车零部件工厂纷纷踏上智能制造转型之路。而安灯系统作为一种重要的生产管理工具,在这场…...
SwiftUI(三)- 渐变、实心形状和视图背景
引言 在现代的应用的UI设计中,渐变和形状背景为界面带来了丰富的层次与视觉效果,而SwiftUI提供了一系列简单且强大的API,可以轻松实现这些效果。在这篇文章中,我们将介绍SwiftUI中的渐变、实心形状和视图背景的基础用法ÿ…...
RK3568-ota升级
ota升级 OTA(Over-the-Air)即空间下载技术。 OTA 升级是 Android 系统提供的标准软件升级方式。它功能强大,可以无损失升级系统,主要通过网络,例如 WIFI、3G/4G 自动下载 OTA 升级包、自动升级,也支持通过…...
GR-ConvNet代码详解
GR-ConvNet代码详解 文章目录 GR-ConvNet代码详解前言一、utils1.dataset_processing1.image.py1.Iamge类2.DepthImage类3.WidthImage类 2.grasp.py1. _gr_text_to_no()方法2.GraspRectangles类3.GraspRectangle类3.Grasp类4.detect_grasps方法 3.generate_cornell_depth.py4.e…...
Excel自带傅里叶分析数据处理——归一化处理
在Excel工具中,默认情况下数据处理---傅里叶分析通常不进行归一化处理,需要用户手动进行归一化处理。 (1)傅里叶变换的原理 傅里叶变换将时域信号转换为频域信号,输出的是复数形式的频率分量,包含了幅值和…...
Centos7.6版本安装mysql详细步骤
操作步骤: 1.下载Linux版本Mysql并上传至linux系统中 2.解压mysql并查询系统中是否有相关软件存在以及配置mysql,启动mysql tar -zxvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz rpm -qa|grep mysql ##查…...
寄宿学校:为自闭症儿童提供全面的教育和关爱
在这个多彩的世界里,每一个生命都值得被温柔以待,每一颗心灵都值得被悉心呵护。然而,自闭症儿童这一特殊群体,他们的世界却常常被误解和忽视。幸运的是,有一种教育模式——寄宿学校,正为这些孩子打开了一扇…...
LLaMA Factory环境配置
LLaMA-Factory官方文档 安装正确的torch和cuda版本 参考: PyTorch 报错解决 1.ImportError: /usr/lib/x86_64-linux-gnu/libstdc.so.6: version GLIBCXX_3.4.29 not found 参考这个解决:丝滑解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc.s…...
STM32实现毫秒级时间同步
提起“时间同步”这个概念,大家可能很陌生。一时间搞不清楚是什么意思。 我理解“时间同步”可以解决多个传感器采集数据不同时的问题,让多个传感器同时采集数据。 打个比方。两个人走路,都是100毫秒走一步(频率相同是前提&…...
瑞吉外卖之com.fasterxml.jackson.dataformat.cbor.CBORFactor相关报错
1.报错:Error creating bean with name routerFunctionMapping defined in class path resource [com/itheima/reggie/config/WebMvcConfig.class]: Failed to instantiate [org.springframework.web.servlet.function.support.RouterFunctionMapping]: Factory met…...
厦门高端模板建站/东莞整站优化排名
通过分析reduceByKey和groupByKey的源码,发现两个算子都使用了combineByKey这个算子,那么现在来分析一下combineByKey算子。 /*** Simplified version of combineByKey that hash-partitions the output RDD.*/def combineByKey[C](createCombiner: V &g…...
广州网站优化公司/关键词排名查询工具
“初入职场什么都不懂,天天追着职场前辈问东问西,还觉得理所应当。直到后来……我也成了公司老人,每一次的崩溃,都让我对曾经带我的师傅又多了一分理解。” 让很多“师傅”气到头秃、急到跳脚的不是“萌新”不萌,而是“…...
闵行区做网站/哔哩哔哩推广网站
一.Core标签库 • 核心标签库主要包括通用标签、条件标签、迭代标签和与URL相关的标签。 • 在使用Core标签库的JSP文件的开始部分,添加代码: <%taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c"…...
毕设做购物网站容易吗/seo一键优化
泛型:为了让集合能够记住集合内元素各个类型,且能够达到只要编译时不出现问题,运行时就不会出现类型异常的解决方案。 泛型又从称为参数化类型,是一种编译时类型安全检测机制,类型参数的魅力在于使得程序具有可读性和…...
哪个网站做3d模型/b2b免费推广网站
为什么80%的码农都做不了架构师?>>> 计算机网络知识 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的《计算机网络》第五版,这本书难易适中。 目前已经是第五版,本书作者80年代就开发出MINIX,是一个用于…...
创建网站好的平台/广告营销案例分析
两种批处理方式: 采用Statement.addBatch(sql)方式实现批处理:•优点:可以向数据库发送多条不同的SQL语句。•缺点:•SQL语句没有预编译。•当向数据库发送多条语句相同,但仅参数不同…...