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 了,其实这个更多的就是配置,没有啥其他代码部分的东西。先理解配置部分东西,方便与工作中使用。

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

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

相关文章

JavaEE技术之MySql高级-搭建主从复制(主从同步原理、一主多从配置)

文章目录 MySQL主从同步1、MySQL主从同步原理2、一主多从配置2.1、准备主服务器2.2、准备从服务器2.3、启动主从同步2.4、实现主从同步2.5、停止和重置2.6、常见问题问题1问题2 MySQL主从同步 1、MySQL主从同步原理 基本原理&#xff1a; slave会从master读取binlog来进行数据…

Vue3:介绍

Vue 3 相较于 Vue 2 在多个方面进行了改进和优化&#xff0c;主要优势包括但不限于以下几个方面&#xff1a; 响应式系统优化&#xff1a; Vue 3 引入了基于 Proxy 的响应式系统&#xff0c;取代了 Vue 2 中基于 Object.defineProperty 的实现。Proxy 可以直接监听整个对象&…

一文掌握nodejs中的核心概念

1. 事件循环与非阻塞 I/O 概述&#xff1a; 允许 Node.js 在单线程的情况下执行非阻塞 I/O 的机制。 组成部分&#xff1a; 调用栈&#xff1a; 执行同步代码。回调队列&#xff1a; 存放在异步操作完成后等待执行的回调函数。事件循环&#xff1a; 检查调用栈是否为空&…

WHAT - 浏览器缓存机制系列(二)

目录 一、介绍二、强缓存三、协商缓存今天主要介绍 HTTP请求缓存中的强缓存和协商缓存。 一、介绍 浏览器每次发起请求时,会先在浏览器缓存中查找请求的缓存结果和缓存标识。 当浏览器第一次向服务器发起请求后,浏览器缓存肯定是没有对应缓存的,所以向服务器发起请求,服…

AI换人视频制作

AI换人视频制作 举例&#xff1a; 让潘金莲和唐僧一起让奥特曼打孙悟空 工具 需要魔法上网自行百度https://discord.com/invite/viggle接受邀请后进入频道 输入 / 选择mix 选择mix 分别上传对应的图片 和视频 选择 背景设置为 白色 和fintune 为on等待几分钟 搜索 下载对应视…

实现WPF中的数据更新 属性通知界面:INotifyPropertyChanged接口

在WPF (Windows Presentation Foundation) 应用程序中&#xff0c;当数据发生变化时&#xff0c;通常希望UI能够自动更新以反映这些变化。为了实现这一功能&#xff0c;WPF 提供了数据绑定机制&#xff0c;并且配合 INotifyPropertyChanged 接口使用&#xff0c;可以在数据模型…

docker安装与重装

docker安装与重装 docker安装 https://blog.csdn.net/lyqhf153/article/details/79585976 参考上面的方式 cat /etc/issueuname -r uname -acat /proc/versiondf -hyum list docker-ce --showduplicates | sort -r 查看docker-ce的版本列表sudo yum install -y docker 没有…

Mesa3D图形库与NIR(New Intermediate Representation)

Mesa 是一个开源图形库&#xff0c;为 Unix 和 Linux 系统提供了 OpenGL 和 Vulkan API 的实现。它也支持其他图形 API&#xff0c;如OpenCL、OpenGL ES 和 Vulkan。Mesa 项目的目标是为开源社区提供高性能的图形库&#xff0c;使得开源操作系统能够充分利用现代图形硬件。 Me…

containerd的原理及应用详解(一)

本系列文章简介: 随着容器技术的迅猛发展,容器运行时成为了关注的焦点之一。而容器运行时的核心组件之一就是containerd。containerd是一个高度可扩展的容器运行时,它负责管理容器的生命周期、镜像管理以及资源隔离等核心功能。它是由Docker团队开发并开源的,目前已经成为了…

企业活动想联系媒体报道宣传如何联系媒体?

在企业的宣传推广工作中,我曾经历过一段费事费力、效率极低的时期。那时,每当公司有重要活动或新项目需要媒体报道时,我便要一家家地联系媒体,发送邮件、打电话,甚至亲自登门拜访,只为求得一篇报道。然而,这样的过程充满了不确定性和挑战,时常让我感到焦虑和压力山大。 记得有一…

C——单链表

一.前言 我们在前面已经了解了链表中的双向链表&#xff0c;而我们在介绍链表分类的时候就说过常用的链表只有两种——双向带头循环链表和单向不带头不循环链表。下来我来介绍另一种常用的链表——单向不带头不循环链表也叫做单链表。不清楚链表分类的以及不了解双向链表的可以…

【数据结构】第五讲:栈和队列

个人主页&#xff1a;深情秋刀鱼-CSDN博客 数据结构专栏&#xff1a;数据结构与算法 源码获取&#xff1a;数据结构: 上传我写的关于数据结构的代码 (gitee.com) 目录 一、栈 1.栈的定义 2.栈的实现 a.栈结构的定义 b.初始化 c.扩容 d.入栈 e.出栈 f.打印 g.取栈顶元素…

Java中常用类String的构造器与常用方法

Java中常用类String的构造器与常用方法 在Java编程中&#xff0c;String类是一个核心类&#xff0c;用于处理文本数据。掌握String类的构造器和常用方法对于编写涉及文本操作的程序至关重要。本文将为初学者介绍String类的一些常用构造器和常用方法&#xff0c;并通过示例代码…

Git 进行项目开发时新建一个分支作为备份

在使用 Git 进行项目开发时&#xff0c;想要在当前的 master 或其它分支基础上进行代码优化或修改时&#xff0c;并且在优化过程中保留一个当前状态的备份&#xff08;即新建一个分支作为备份&#xff09;&#xff0c;然后继续在 master 分支上开发&#xff0c;你可以按照以下步…

乐观锁、悲观锁、互斥锁、读写锁

乐观锁和悲观锁是两种不同的锁机制&#xff0c;用于在多线程环境下解决资源竞争问题。互斥锁和读写锁是两种常见的锁类型&#xff0c;它们都可以用来实现乐观锁或悲观锁。 乐观锁 是一种无锁机制&#xff0c;它假设在多线程环境下对共享资源的操作不会发生冲突&#xff0c;因…

【CTF Crypto】XCTF GFSJ0522 base64 Writeup(Base64编码)

base64 元宵节灯谜是一种古老的传统民间观灯猜谜的习俗。 因为谜语能启迪智慧又饶有兴趣&#xff0c;灯谜增添节日气氛&#xff0c;是一项很有趣的活动。 你也很喜欢这个游戏&#xff0c;这不&#xff0c;今年元宵节&#xff0c;心里有个黑客梦的你&#xff0c;约上你青梅竹马…

Git泄露(续)

接上一篇补充 git config --global user.name " " git config --global user.email 邮箱地址 配置用户名和邮箱 git commit 使其处于交互区&#xff0c;没有使用 -m&#xff0c;默认用vim 来编辑和提交信息 输入要提交的内容&#xff0c;然后按ESC建回到命令…

华纳云:美国服务器的几种防火墙类型介绍

美国服务器的防火墙主要是用于在系统的内外网之间构建一道相对隔绝的保护屏障&#xff0c;用来保障美国服务器的网络安全免受恶意流量的影响&#xff0c;与其他地区的服务器并无本质上的不同&#xff0c;通常可以使用以下几种类型的防火墙&#xff1a; 软件防火墙&#xff1a;软…

「 网络安全常用术语解读 」通用配置枚举CCE详解

1. 背景介绍 NIST提供了安全内容自动化协议&#xff08;Security Content Automation Protocol&#xff0c;SCAP&#xff09;为漏洞描述和评估提供一种通用语言。SCAP组件包括&#xff1a; 通用漏洞披露(Common Vulnerabilities and Exposures, CVE)&#xff1a;提供一个描述…

泰迪智能科技企业数据挖掘流程分析及特色服务优势

企业发展会沉淀大量的数据&#xff0c;数据中囊括了企业业务各种维度指标&#xff0c;通过数据挖掘和数据分析 &#xff0c;让企业业务了解过去、现在和未来将要发生什么&#xff0c;从而更好的调整企业发展方向。泰迪智能科技企业数据挖掘平台是面向企业级用户快速处理数据构建…