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

Spring Cloud Alibaba 网关 Gateway 集成(7)

项目的源码地址
Spring Cloud Alibaba 工程搭建(1)
Spring Cloud Alibaba 工程搭建连接数据库(2)
Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用(3)
Spring Cloud Alibaba Ribbon 负载调用说明(4)
Spring Cloud Alibaba 核心理论 CAP与BASE理论简单理解(5)
Spring Cloud Alibaba Sentinel 集成与限流实战(6)
目录

什么是网关

我们从下面几个点来说明吧:

  1. API Gateway,是系统的唯⼀对外的⼊⼝,介于客户端和服务器端之间的中间层,处理⾮业务功能,提供路由请求、鉴权、监控、缓存、限流等功能。
  2. 统一接入,可以做智能路由,负载均衡,容灾处理,日志埋点等等
  3. 流量监控,限流处理与服务降级
  4. 安全防护,统一的鉴权处理,监控,机器网络隔离
    Api Gateway
    主流的网关有哪些呢?
  • zuul: 是Netflix开源的微服务网关,和 Eureka,Ribbon,Hystrix 等组件配合使用,依赖组件比较多,性能教差(这个是我百度之后搬过来的,我还没有用过这个 zuul)。
  • nginx+lua:是⼀个⾼性能的HTTP和反向代理服务器,lua 是脚本语⾔,让Nginx执⾏Lua脚本,并且⾼并发、⾮阻塞的处理各种请求
  • SpringCloud Gateway: Spring公司专⻔开发的⽹关,替代 zuul。

AlibabaCloud 全家桶还没对应的⽹关,我们就⽤ SpringCloud官⽅推荐的 Gateway。

Spring Cloud Gateway

spring 官方的说明文档,点击这里看看,官网上面有一句话,是说 Spring Cloud Gateway 是基于 Spring Boot 2.x,Spring WebFlux 和 Project Reactor 构建。

这里引用官方上面的两段文字,是需要我们引起注意的地方

Spring Cloud Gateway 是建立在 Spring Boot 2.x、 Spring WebFlux 和 Project Reactor之上。因此,你所熟悉的许多同步库(例如Spring Data和Spring Security)和模式在你使用Spring Cloud Gateway时可能不适用。如果你不熟悉这些项目,我们建议你在使用Spring Cloud Gateway之前,先阅读它们的文档,熟悉一些新概念。

Spring Cloud Gateway 需要 Spring Boot 和 Spring Webflux 提供的 Netty 运行时。它不能在传统的Servlet容器中工作,也不能以WAR的形式构建。

三个核心的术语

  • Route(路由): 网关的基本构件。它由一个ID、一个目的地URI、一个谓词(Predicate)集合和一个过滤器(Filter)集合定义。如果集合谓词为真,则路由被匹配。

  • Predicate(谓词): 这是一个 Java 8 Function Predicate。输入类型是 Spring Framework ServerWebExchange。这让你可以在HTTP请求中的任何内容上进行匹配,比如header或查询参数。

  • Filter(过滤器): 这些是 GatewayFilter 的实例,已经用特定工厂构建。在这里,你可以在发送下游请求之前或之后修改请求和响应。

这里我们先有一个眼熟,后面我们再具体操作。

工程搭建

新增 api-gateway 模块

这里我们按照之前搭建工程的方式创建一个 demo-api-gateway 的模块出来,具体的搭建方式看这里,搭建的方式是一样的,其实就是新建一个 module,这里就不赘述了。最后搭建完了之后,是这样子的结构:
增加 api-gateway

增加模块内容

pom 文件依赖引入

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

启动类

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

配置文件
这个 routes 节点是一个数组,是可以写多个的

server:port: 8888spring:application:name: api-gatewaycloud:gateway:routes: #数组形式- id: demo-order  #路由唯一标识uri: http://127.0.0.1:9000  #想要转发到的地址order: 1 #优先级,数字越小优先级越高predicates: #断言 配置哪个路径才转发- Path=/demo-order/**filters: #过滤器,请求在传递过程中通过过滤器修改- StripPrefix=1  #去掉第一层前缀

这里先初步说明下配置的意思:

  • 我们请求的地址如果是: http://localhost:8888/demo-order/api/v1/video_order/list ,这个是我们网关的地址,
  • 访问网关之后,会转发到 这个地址上面去 http://localhost:9000/demo-order/api/v1/video_order/list 访问我们订单服务。
    请求的过程

测试下

访问下:http://localhost:8888/demo-order/api/v1/video_order/list
请求
然后我们再访问下:http://localhost:9000/api/v1/video_order/list
请求
OK了,我们初步的测试就算通过了,那么我们就接着向下看把,

连接Nacos

在 pom 文件中增加 nacos 依赖

 <!--添加 nacos 客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

增加启动类开启支持

@EnableDiscoveryClient

修改配置文件

注意看下下面增加的部分

  • nacos.discovery.server-addr
  • gateway.routes.id.uri:这里使用了 lb://demo-order 负载的调用方式
  • gateway.locator.enabled: 开启网关拉取 nacos 服务
server:port: 8888spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes: #数组形式- id: order-service  #路由唯一标识#uri: http://127.0.0.1:8000  #想要转发到的地址uri: lb://demo-order  #从nocas进行转发order: 1 #优先级,数字越小优先级越高predicates: #断言 配置哪个路径才转发- Path=/order-server/**filters: #过滤器,请求在传递过程中通过过滤器修改- StripPrefix=1  #去掉第一层前缀discovery:locator:enabled: true  #开启网关拉取nacos的服务logging:level:org.springframework.cloud.gateway: DEBUG

我们去订单服务里面增加一个接口,方便于测试

@RequestMapping("gateway")
private Map gateway(HttpServletRequest httpRequest) {String serverInfo = httpRequest.getServerName() + ":"+ httpRequest.getServerPort();return Map.of("title", "测试返回数据", "name", "返回名称", "serverInfo", serverInfo);
}

增加接口
测试下

首先我们启动两个订单服务
启动服务列表
然后我们看下 nacos 的面板,可以看到相关的服务都在上面了
在这里插入图片描述
开始请求:http://localhost:8888/order-server/api/v1/video_order/gateway
请求
再次请求下:http://localhost:8888/order-server/api/v1/video_order/gateway
请求

断言、过滤器实战

网关的配置项回顾

路由:是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发

route组成部分

id:路由的ID
uri:匹配路由的转发地址
predicates:配置该路由的断言,通过 PredicateDefinition 类进行接收配置。
order:路由的优先级,数字越小,优先级越高。

交互流程

  • 客户端向Spring Cloud Gateway发出请求
  • 如果网关处理程序映射确定请求与路由匹配
  • 则将其发送到网关Web处理程序
  • 通过特定过滤器链运行,前置处理-后置处理
    请求流程

断言

什么是Gateway路由断言 ?

  • Predicate 来源于Java8,接受输入参数,返回一个布尔值结果
  • Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则
  • 转发的判断条件,SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等
  • 支持多个Predicate请求的转发是必须满足所有的Predicate后才可以进行路由转发

内置路由断言都是 RoutePredicateFactory 接口实现类,我们一起看下:
具体的实现类
我们可以去访问下这里,具体的说明这里也有Route Predicate(路由谓词)工厂,我们这里就选几个出来看看

Before

比如,我们现在有一个需求接口需要在指定时间进行下线,过后不可以在被访问。那么我们可以使用 Before Gateway 内置的路由接口定时下线实战。

Before 路由谓词工厂只需要一个参数,即 datetime(这是一个java ZonedDateTime)。这个谓词匹配发生在指定 datetime 之前的请求。

predicates:- Before=2024-05-11T01:01:01.000+08:00

那么修改下把:
修改

测试访问下,现在是可以访问的:
测试访问
然后我们再修改下:

Before=2024-05-09T01:01:01.000+08:00

访问不了

Query

query 参数表示再请求的时候一定要带上的字段,如果没有这个字段就是非法请求
query参数

访问请求
http://localhost:8888/order-server/api/v1/video_order/gateway
请求报错
http://localhost:8888/order-server/api/v1/video_order/gateway?source=alipay
带上参数

Filter 过滤器

这里我们再看下这个图,可以看到我们的 Filter,是一层层的过滤然后访问到 proxied service ,然后再一层层的经过 filter 返回
请求流程

过滤器生命周期

PRE: 这种过滤器在请求被路由之前调用,一般用于鉴权、限流等
POST:这种过滤器在路由到微服务以后执行,一般用于修改响应结果,比如增加header信息、打点结果日志

网关过滤器分类

  • 局部过滤器GatewayFilter:应用在某个路由上,每个过滤器工厂都对应一个实现类,并且这些类的名称必须以GatewayFilterFactory 结尾

  • 全局过滤器:作用全部路由上

局部过滤器

内置很多局部过滤器,顶级接口 GatewayFilterFactory
GatewayFilterFactory
全局过滤器

内置很多全局过滤器,顶级接⼝ GlobalFilter
全局过滤器

自定义网关过滤器

第一步:先增加一个自定义的过滤器
新增代码

import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class UserGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//写业务逻辑String token = exchange.getRequest().getHeaders().getFirst("token");//TODO 根据业务开发对应的鉴权规则, JWTif(StringUtils.isBlank(token)){exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}//继续往下执行return chain.filter(exchange);}//数字越小,优先级越高@Overridepublic int getOrder() {return 0;}
}

第二步: 接着重启服务

访问测试下:http://localhost:8888/order-server/api/v1/video_order/gateway?source=alipay
报错访问通过 postMan 访问,可以请求到数据
PostMan访问
好了,我们总算是搞定了这个 Gateway 了,其实这个更多的就是配置,没有啥其他代码部分的东西。先理解配置部分东西,方便与工作中使用。

相关文章:

Spring Cloud Alibaba 网关 Gateway 集成(7)

项目的源码地址 Spring Cloud Alibaba 工程搭建&#xff08;1&#xff09; Spring Cloud Alibaba 工程搭建连接数据库&#xff08;2&#xff09; Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用&#xff08;3&#xff09; Spring Cloud Alibaba Ribbo…...

低代码技术赋能未来乡村建设:创新与实践

引言 随着我国新型城镇化进程的推进&#xff0c;乡村建设正面临着前所未有的挑战。如何在有限的人力、物力、财力资源下&#xff0c;高效推动乡村建设&#xff0c;实现城乡一体化发展&#xff0c;成为当下亟待解决的问题。低代码技术作为一种创新性的解决方案&#xff0c;为未来…...

基于Springboot的房屋租赁管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的房屋租赁管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…...

跨平台移动应用开发指南:打造跨越iOS和Android的移动应用

跨平台移动应用开发已经成为许多开发者的首选&#xff0c;因为它可以节省时间、成本和精力&#xff0c;同时使得应用能够覆盖更广泛的用户群体。本指南将介绍跨平台移动应用开发的基本概念、流行的跨平台框架以及一些最佳实践&#xff0c;帮助您快速入门并打造出高质量的跨平台…...

QT+多线程编程

QT的多线程编程有两种 1、自定义类继承QThread 第一种是自定义一个类继承于QThread&#xff0c;重写run()方法来实现。然后当需要使用线程的时候你就新建一个自定义对象&#xff0c;然后调用start方法开始运行。 下面的例子是widget里面创建一个线程&#xff0c;然后调用sta…...

设计模式——迭代器模式(Iterator)

迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为设计模式&#xff0c;它使得我们能够顺序地访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象的内部表示。迭代器模式为遍历不同的聚合结构提供了一个统一的接口&#xff0c;使得客户端代码可以独立…...

在k8s中安装Grafana并对接Prometheus,实现k8s集群监控数据的展示

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Grafana&#xff1a;让数据说话的魔术师》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Grafana简介 2、Grafana的重要性与影响力 …...

【JavaScript】内置对象 - 数组对象 ③ ( 数组反转 - reverse 方法 | 数组排序 - sort 方法 | 自定义数组排序规则 )

文章目录 一、数组排序1、翻转数组元素 - reverse()2、数组元素排序 - sort() 默认从小到大排序3、数组元素排序 - sort() 自定义排序规则4、数组元素排序 - sort() 自定义降序排序简化写法 Array 数组对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript…...

ctfshow web入门 php反序列化 web267--web270

web267 查看源代码发现这三个页面 然后发现登录页面直接admin/admin登录成功 然后看到了 ///backdoor/shell unserialize(base64_decode($_GET[code]))EXP <?php namespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){…...

智慧公厕解决什么问题?实现了什么样的价值?

公共厕所一直是城市管理的难题&#xff0c;常常面临着卫生条件不佳、管理不善以及使用体验差等问题。为了解决这些困扰城市的难题&#xff0c;智慧公厕应运而生。智慧公厕不仅应用了信息化和数字化技术&#xff0c;还通过全方位的智能化应用&#xff0c;彻底改变了传统公厕的面…...

IATF16949认证是什么?

IATF16949认证是一项国际质量管理体系的认证标准&#xff0c;由国际汽车行业联合会&#xff08;IATF&#xff09;开发&#xff0c;旨在提高汽车行业的质量管理水平&#xff0c;满足客户对汽车部件和零部件的要求。该标准是在ISO/TS 16949标准的基础上&#xff0c;专门为汽车行业…...

【Vue2】关于response返回数据的错误小记

关于Vue2中response返回数据的一个错误小记 如图&#xff0c;在这里返回的时候&#xff0c;后端是通过List< String >返回的&#xff0c;response接收到的实际上是一个Array数组&#xff0c;但是赋值给searchedTaskList的时候&#xff0c;需要在.then包括的范围里面赋值给…...

深入理解C++构造函数和析构函数

目录标题 1. 构造函数默认构造函数参数化构造函数拷贝构造函数 2. 析构函数3. 构造函数和析构函数的使用场景自动资源管理防止资源泄露深拷贝和浅拷贝 4. C的类中必定有个构造函数吗&#xff1f;5. 总结 C中的构造函数和析构函数是类对象生命周期管理的重要组成部分。构造函数用…...

CMakeLists.txt语法规则:数学运算 math

一. 简介 前面几篇文章学习了 CMakeLists.txt语法中的一些常用变量&#xff0c;常用命令&#xff0c;双引号的作用。条件判断语句&#xff0c;循环语句等等。 本文简单学习一下 CMakeLists.txt语法中数学运算 match。 二. CMakeLists.txt语法规则&#xff1a;数学运算 math 在…...

图片无损压缩工具-VIKY

一、前言 Viky v3.4是一款功能强大的图片压缩工具&#xff0c;它能够提供高效的图片无损压缩服务。通过使用独特的压缩算法&#xff0c;该软件在显著减小图片文件大小的同时&#xff0c;还保持了图像的清晰度和色彩饱和度&#xff0c;确保了图像质量的优异表现。 二、软件特点…...

【Linux操作系统】:文件操作

目录 前言 一、C语言中文件IO操作 1.文件的打开方式 2.fopen&#xff1a;打开文件 3.fread&#xff1a;读文件 4.fwrite:写文件 二、系统文件I/O 1.系统调用open、read、write 2.文件描述符fd 3.文件描述符的分配规则 4.重定向 5.缓冲区 6.理解文件系统 磁盘 磁盘…...

渗透之sql注入----二次注入

目录 二次注入的原理&#xff1a; 实战&#xff1a; 第一步&#xff1a;找注入点 找漏洞&#xff1a; 注入大概过程&#xff1a; 第二步&#xff1a;开始注入 二次注入的原理&#xff1a; 二次注入是由于对用户输入的数据过滤不严谨&#xff0c;导致存在异常的数据被出入…...

LeetCode 每日一题 ---- 【2105. 给植物浇水 II】

LeetCode 每日一题 ---- 【2105. 给植物浇水 II】 2105.给植物浇水II方法&#xff1a;模拟双指针 2105.给植物浇水II 方法&#xff1a;模拟双指针 今天是给植物浇水II&#xff0c;昨天是I&#xff0c;本质上和昨天的没有区别&#xff0c;都是模拟&#xff0c;今天额外需要注意…...

【刷题】代码随想录算法训练营第三十五天|435、无重叠区间,763、划分字母区间 ,56、合并区间

目录 435、无重叠区间763、划分字母区间56、合并区间 435、无重叠区间 讲解&#xff1a;https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html 左边界和有边界排序&#xff0c;注意sort的排序规则函数编写。 class Solution { public:// 按照…...

【JVM】了解JVM规范中的虚拟机结构

目录 JVM规范的主要内容 1&#xff09;字节码指令集(相当于中央处理器CPU) JVM指令分类 2&#xff09;Class文件的格式 3&#xff09;数据类型和值 4&#xff09;运行时数据区 5&#xff09;栈帧 6&#xff09;特殊方法 7&#xff09;类库 JVM规范的主要内容 1&#…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

PydanticAI快速入门示例

参考链接&#xff1a;https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...