当前位置: 首页 > news >正文

SpringCloud之Gateway组件简介

网关的理解

网关类似于海关或者大门出入都需要经过这个网关。别人不经过这个网关,永远也看不到里面的东西。可以在网关进行条件过滤,比如大门只有对应的钥匙才能入内。网关和大门一样,永远暴露在最外面

不使用网关

  • 前端需要记住每一个服务的IP和port

  • 如果有一个服务部署多台,那么前端需要自行分配

使用网关

  • 前端不需要记每一个服务的IP和port,只需要将请求发送到网关即可,网关根据资源路径做路由跳转

  • 网关中可以做安全控制 比如Token校验、限流等

  • 可以做负载均衡

Gateway的理解

是Spring官网推出的一套网关组件,用来取代Zuul

它的目的是为了让路由跳转更加方便、灵活,还提供了一些强大的过滤器功能。比如:IP黑名单、Token校验等

基于webFlux框架实现,webFlux框架底层使用了高性能的Reactor模式通信框架的Netty


Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor等技术。

Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。

① Gateway工作原理

客户端发送请求到Gatewaty,然后Gateway HandlerMapping通过对比映射,找到与其匹配的路由,将其发送到Gateway WebHandler。Handler再通过指定的过滤器将请求分发到实际的业务逻辑,并返回。

在过滤器中可以做增加代码:

  • 请求之前[pre]做校验等

  • 请求之后[post]做日志输出等

Gateway核心逻辑:根据资源路径做路由转发,并且执行过滤器链。

② Gateway三大核心概念

路由(Route)

和eureka结合做动态路由

组成部分:一个路由ID、一个唯一资源定位符URI、一组断言、一组Filter

如果路由断言为真,那么URL和配置路由匹配

断言(Predicate)

返回一个boolean表达式

过滤器(Filter)

Gateway中的过滤器分为Gateway Filter(针对一个路由)和Global Filter(全局)

在过滤器中可以编写校验规则以及响应的处理

③ Gateway和Nginx区别

Nginx做限流、负载均衡、路由都需要修改nginx.conf配置文件

Gateway和eureka结合,实现了自动路由跳转;和Ribbon集合,实现了负载均衡。Gateway也能够通过配置进行限流的实现

 

 

路由使用

① 访问流程

② Loing-service

@RestController
public class LoginController {@GetMapping("doLogin")public String doLogin(String username,String password){System.out.println(username+" -> "+password);String token = UUID.randomUUID().toString();return token;}
}

② Gateway-server

gateway依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

配置路由

server:port: 80
spring:application:name: gateway-servercloud:gateway:enabled: true # 默认开启Gatewayroutes: # 路由组- id: login-service-route # 路由ID 保证唯一uri: http://localhost:8080 # uri唯一资源定位符 url唯一资源标识符predicates: # 断言- Path=/doLogin # 和服务中的路径匹配

④ 编程式路由

不借助配置文件,使用编码的方式来实现路由转发

@Configuration
public class RouteConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("anime-id", r->r.path("/anime").uri("https://www.bilibili.com")).route("variety-id",r->r.path("/variety").uri("https://www.bilibili.com")).build();}
}

如果在uri后面的资源路径和path中的路由一样,那么gateway不会把path中的路由拼接到uri后面。

编程式和配置文件的方式可以结合使用

动态路由

如果在路由转发时直接将URL写死,从而IP和port也被写死,那么Gateway将无法达到负载均衡的效果。应该是只提供服务名,然后通过这个名字去找对应的服务,从而达到负载均衡的效果

让Gateway服务也注册到注册中心中,那么Gateway就能够拥有所有的服务信息

Gateway会根据注册中心中的服务列表,以每个服务名为路径创建动态路由进行转发

① 第一种实现方式

使用lb(Load Balance)协议,表示启用Gateway的负载均衡功能

server:port: 80
spring:application:name: gateway-servercloud:gateway:enabled: true # 默认开启Gatewayroutes: # 路由组- id: login-service-route # 路由ID 保证唯一# uri: http://localhost:8080 # uri唯一资源定位符 url唯一资源标识符uri: lb://login-service # lb://服务名predicates:- Path=/doLogin # 和服务中的路径匹配

 调用:http://localhost/doLogin

② 第二种实现方式

使用服务发现,自动创建动态路由从而实现负载均衡

server:port: 80
spring:application:name: gateway-servercloud:gateway:enabled: true # 默认开启Gatewaydiscovery:locator:enabled: true # 开启动态路由lower-case-service-id: true # 将注册列表中的服务名小写

断言

在项目启动的时候,Gateway会去加载一些路由断言工厂,例如:After、Query

断言就是给路由增加一些匹配规则,如果发送的请求符合这些规则,就能够去访问,否则404。简单说这些匹配规则也就是一些boolean表达式,要么true进入,要么false拒绝

① 分类

 

② 使用

在配置文件中,对某个路由进行操作。动态路由不能使用断言

spring:application:name: gateway-servercloud:gateway:enabled: true # 默认开启Gatewayroutes:- id: login-service-routeuri: lb://login-servicepredicates:- Path=/doLogin- Method=GET,POST # GET,POST请求能够访问- After=2022-11-02T17:23:16.423+08:00[Asia/Shanghai] # 在指定时间后才能访问 通过ZonedDateTime获取- Query=username,admin. # 必须给username传值 后面的值必须是:adminx

过滤器

Gateway中的过滤器和Servlet里面的过滤器差不多,用户修改进入HTTP请求和HTTP响应

分为GatewayFilter(针对某一个路由)和GlobalFilter(全局过滤)

① 自定义全局过滤器

在自定义过滤器中编写业务逻辑,比如Token校验、限流。

@Component
public class TestFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求对象ServerHttpRequest request = exchange.getRequest();RequestPath path = request.getPath();// 打印路由以及服务名System.out.println(path);HttpHeaders headers = request.getHeaders();// 获取主机IPString ip = headers.getHost().getHostName();System.out.println(ip);// 获取响应对象ServerHttpResponse response = exchange.getResponse();// 放过return chain.filter(exchange);}
}

 定义过滤器顺序

@Component
public class TestFilter implements Ordered {@Overridepublic int getOrder() {// 数字越小 越往前return 0;}
}

返回值处理

// 获取响应对象
ServerHttpResponse response = exchange.getResponse();
// 设置响应头
response.getHeaders().set("content-Type","application/json;charset=UTF-8");
// 封装返回数据
Map<String,Object> map = new HashMap<>();
map.put("code", 401);
map.put("msg","没有该权限");
ObjectMapper objectMapper = new ObjectMapper();
try {// 将map集合转为byte数组byte[] bytes = objectMapper.writeValueAsBytes(map);// 将byte数组包装成一个数据缓冲包DataBuffer wrap = response.bufferFactory().wrap(bytes);// 返回return response.writeWith(Mono.just(wrap));
} catch (JsonProcessingException e) {e.printStackTrace();
}

限流

在一定的时间段内,限制用户的访问频率。

① 限流模型

漏斗算法、令牌通算法、计算器算法、窗口滑动算法

入不敷出:生产令牌的速度赶不上使用的速度

  1. 系统以提前配置好的速率去生产令牌。

  2. 给令牌桶设置一个阈值,当桶满后,多余的令牌直接丢弃

  3. 客户发送请求都需要去拿令牌

  4. 如果没有拿到令牌该请求不能成功访问

  5. 如果拿到令牌将去访问服务,完成业务处理后删除令牌

  6. 当桶中的令牌数达到最低额度时,使用完的令牌返回

② Gateway中的限流

Gateway中已经内置了RequestRateLimiterGatewayFilterFactory,结合Redis做令牌桶算法。需要导入redis依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

 配置限流规则

@Configuration
public class RequestLimiterConfig {/*基于IP做限流*/@Bean@Primary // 主候选public KeyResolver ipKeyResolver(){return exchange-> Mono.just(exchange.getRequest().getHeaders().getHost().getHostName());}/*基于API接口最限流*/@Beanpublic KeyResolver apiKeyResolver(){return exchange -> Mono.just(exchange.getRequest().getPath().toString());}
}

修改配置文件

spring:application:name: gateway-servercloud:gateway:enabled: true # 默认开启Gatewayroutes:- id: login-service-routeuri: lb://login-servicepredicates:- Path=/doLoginfilters:- name: RequestRateLimiter # 过滤器名称args:key-resolver: '#{@ipKeyResolver}' # Bean对象的名字redis-rate-limiter.replenishRate: 1 # 每秒钟生产多少令牌redis-rate-limiter.burstCapacity: 3 # 令牌桶中的容量

只针对某一个路由

跨域配置

跨域:CORS同源策略。

因为网关是服务的最边缘,所有的请求都需要走网关,将跨域的配置写在网关。

编程式

@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedHeader("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

配置文件

spring:cloud:gateway:globalcors:cors-configurations:'[/**]': # 针对那些路径allowCredentials: true # 可以携带CookieallowedHeaders: '*'allowedMethods: '*'allowedOrigins: '*'

面试题相关

什么是微服务网关

Spring Cloud Gateway 是 Spring 官方基于 Spring 5.x,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,Spring Cloud Gateway 旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全性、监视/指标和弹性。

 

使用Gateway的优势

Spring Cloud Gateway 可以看做是一个 Zuul 1.x 的升级版和代替品,比 Zuul 2 更早的使用 Netty 实现异步 IO,从而实现了一个简单、比 Zuul 1.x 更高效的、与 Spring Cloud 紧密配合的 API 网关。
Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱即用功能,并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用
比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、或者 Host、或者 Query 来做路由。
比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也都可以直接用。当然自定义 Filter 也非常方便。

zuul和spring cloud gateway的对比

  • zuul:是Netflix的,是基于servlet实现的,阻塞式的api,不支持长连接。
  • gateway:是springcloud自己研制的微服务网关,是基于Spring5构建,能够实现响应式非阻塞式的Api,支持长连接

gateway的组成

  • 路由 : 网关的基本模块,有ID,目标URI,一组断言和一组过滤器组成
  • 断言:就是访问该旅游的访问规则,可以用来匹配来自http请求的任何内容,例如headers或者参数
  • 过滤器:这个就是我们平时说的过滤器,用来过滤一些请求的,gateway有自己默认的过滤器,具体请参考官网,我们也可以自定义过滤器,但是要实现两个接口,ordered和globalfilter

相关文章:

SpringCloud之Gateway组件简介

网关的理解 网关类似于海关或者大门&#xff0c;出入都需要经过这个网关。别人不经过这个网关&#xff0c;永远也看不到里面的东西。可以在网关进行条件过滤&#xff0c;比如大门只有对应的钥匙才能入内。网关和大门一样&#xff0c;永远暴露在最外面 不使用网关 前端需要记住每…...

GoNote第三章 主流框架加对比

GoNote第三章 主流框架加对比 Golang主流框架介绍 自从面市以来&#xff0c;Golang成为了程序员在编写API和开发Web服务时的首选之一。近90%的受访者表示会在自己下一组项目中持续使用Golang。与我们熟悉的C和C类似&#xff0c;Go语言也是现有Golang的“灵魂”。而Golang则是…...

Quartz框架详解分析

文章目录 1 Quartz框架1.1 入门demo1.2 Job 讲解1.2.1 Job简介1.2.2 Job 并发1.2.3 Job 异常1.2.4 Job 中断 1.3 Trigger 触发器1.3.1 SimpleTrigger1.3.2 CornTrigger 1.4 Listener监听器1.5 Jdbc store1.5.1 简介1.5.2 添加pom依赖1.5.3 建表SQL1.5.4 配置文件quartz.propert…...

Nginx专题-基于多网卡的主机配置

文章目录 Nginx 基于多网卡的主机实现一、虚拟机前置环境准备ifcfg-ens32配置文件的内容参考ifcfg-ens33配置文件的内容 二、案例演示修改nginx.conf配置文件解决中文乱码 Nginx 基于多网卡的主机实现 一、虚拟机前置环境准备 点击虚拟机右下角的 红色标框按钮&#xff0c;然后…...

4.2和4.3、MAC地址、IP地址、端口

计算机网络等相关知识可以去小林coding进行巩固&#xff08;点击前往&#xff09; 4.2和4.3、MAC地址、IP地址、端口 1.MAC地址的简介2.IP地址①IP地址简介②IP地址编址方式③A类IP地址④B类IP地址⑤C类IP地址⑥D类IP地址⑧子网掩码 3.端口①简介②端口类型 1.MAC地址的简介 …...

放弃 console.log 吧!用 Debugger 你能读懂各种源码

很多同学不知道为什么要用 debugger 来调试&#xff0c;console.log 不行么&#xff1f; 还有&#xff0c;会用 debugger 了&#xff0c;还是有很多代码看不懂&#xff0c;如何调试复杂源码呢&#xff1f; 这篇文章就来讲一下为什么要用这些调试工具&#xff1a; console.lo…...

epoll机制解析

一、epoll实现原理 1、实现原理 epoll通过3个方法来实现对句柄的监控操作&#xff0c;要深刻理解epoll&#xff0c;首先得了解epoll的三大关键要素&#xff1a;mmap、红黑树、链表。下面是epoll的框架图&#xff0c;如下&#xff1a; mmap epoll是通过内核与用户空间mmap同一块…...

基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目

今天给小伙伴们分享一个基于 SpringBoot Vue 实现的可视化拖拽编辑的大屏项目&#xff1b; 一、简介 这个是一个开源的一个BI平台&#xff0c;酷炫大屏展示&#xff0c;能随时随地掌控业务动态&#xff0c;让每个决策都有数据支撑。 多数据源支持&#xff0c;内置mysql、el…...

我们为什么要写作?

为什么要写书是一个很难回答的问题&#xff0c;因为从不同的角度&#xff0c;会有不同的答案。 最近ChatGPT很火&#xff01;诸事不决&#xff0c;先问问ChatGPT&#xff0c;看看它是怎么回答的。 ChatGPT给出的答案还是比较全&#xff0c;虽然没有“一本正经的胡说八道”&…...

设计模式:创建者模式 - 建造者模式

文章目录 1.概述2.结构3.实例4.优缺点5.使用场景6.模式扩展 1.概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某…...

String a = new String(“abc“); 创建了几个对象?String a = “abc“; 呢?

String a new String(“abc”); 创建了几个对象&#xff1f;String a “abc”; 呢&#xff1f; 答案&#xff1a;String a new String(“abc”); 创建了1个或2个对象&#xff1b;String a “abc”; 创建了0个或1个都对象 String a new String(“abc”); 创建过程 首先在…...

keepalived+nginx安装

欢迎使用ShowDoc&#xff01; 1、安装基础包&#xff1a; yum -y install libnl libnl-devel 2、上传包&#xff1a; tar -zxvf keepalived-2.0.20.tar.gz -C /data/imas/base_soft mkdir -p /data/imas/base_soft/keepalived cd /data/imas/base_soft/keepalived-2.0.20 .…...

硬盘格式化工具,强烈推荐这个!

案例&#xff1a;硬盘格式化工具推荐 【我的电脑已经用了好几年了&#xff0c;硬盘存储容量严重不够了&#xff0c;最近想把它格式化&#xff0c;但却不知道怎么操作&#xff0c;大家有什么比较好的硬盘格式化工具可以推荐吗&#xff1f;】 硬盘作为存储设备&#xff0c;我们…...

Python的异常捕获和处理

程序在运行过程当中&#xff0c;不可避免的会出现一些错误&#xff0c;比如&#xff1a;使用了没有赋值过的变量&#xff0c;使用了不存在的索引&#xff0c;一个数字除以0 …… 这些错误在程序中&#xff0c;我们称其为异常。 程序运行过程中&#xff0c;一旦出现异常将会导致…...

oracle学习之rownum和rowid

rownum先百度一波https://www.cnblogs.com/xfeiyun/p/16355165.html rownum是oracle特有的一个关键字。 对于基表&#xff0c;在insert记录时&#xff0c;oracle就按照insert的顺序&#xff0c;将rownum分配给每一行记录&#xff0c;因此在select一个基表的时候&#xff0c;r…...

为什么说过早优化是万恶之源?

Donald Knuth&#xff08;高德纳&#xff09;是一位计算机科学界的著名学者和计算机程序设计的先驱之一。他被誉为计算机科学的“圣经”《计算机程序设计艺术》的作者&#xff0c;提出了著名的“大O符号”来描述算法的时间复杂度和空间复杂度&#xff0c;开发了TeX系统用于排版…...

如何用 ModelScope 实现 “AI 换脸” 视频

前言 当下&#xff0c;视频内容火爆&#xff0c;带有争议性或反差大的换脸视频总能吸引人视线。虽然 AI 换脸在市面上已经流行了许久&#xff0c;相关制作工具或移动应用也是数不胜数。但是多数制作工具多数情况下不是会员就是收费&#xff0c;而且替换模板有限。以下在实战的角…...

怎么样成为一名Python工程师?到底要会哪些东西?你会了多少?

目录 重点&#xff1a;爬虫部分项目、源码展示python数据分析可视化大屏看板python爬虫爬取淘宝卤鸭货商品数据python游戏开发python自动化办公 重点&#xff1a; 1、做一名程序员&#xff0c;绝对要耐得住寂寞&#xff0c;并且要一直有点兴趣促进你学习。如果你完全没兴趣&am…...

项目前期1.0

今天是项目的第二天 昨天一顿迷茫,可恶 今天啥也不关先来点基本的构架 #include<queue>//队列 #define FALSE 0 #define TRUE 1 #define ERROR 0 #define OK 1 #define nocnect 999999//未链接的距离 #define maxplace 31//景区的观景点的最大个30数不要0下标的 #defi…...

MySQL语句执行耗时分析

MySQL语句执行耗时分析 MySQL Profile查看SQL执行各阶段耗时Performance Schema查看SQL执行各阶段耗时配置收集哪些用户的SQL执行信息开启SQL执行信息收集的相关特性执行目标SQL获取SQL执行的EVENT_ID获取SQL执行各阶段耗时 MySQL Profile查看SQL执行各阶段耗时 --开启SQL Pro…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...