微服务·架构组件之网关- Spring Cloud Gateway

微服务·架构组件之网关- Spring Cloud Gateway

引言

微服务架构已成为构建现代化应用程序的关键范式之一,它将应用程序拆分成多个小型、可独立部署的服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件,用于构建和管理微服务架构中的网关。本报告旨在调查和介绍Spring Cloud Gateway的核心概念、架构、功能以及其在微服务架构中的作用。

概述

Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式,统一访问接口。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,目标是替代 Netflix ZUUL,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。它是基于Nttey的响应式开发模式。

核心概念

请添加图片描述
路由(Route):路由是网关最基础的部分,路由信息由一个ID、一个目标的URL、一组断言工程和一组过滤器组成。如果断言为真,则说明请求URL和配置的路由匹配。

断言(Predicates):Java8中的断言函数,Spring Cloud Gateway中的断言函数允许开发者去定义函数匹配来自Http Request中的任何信息,比如请求头和参数等。

过滤器(Filter):一个标准的Spring webFilter, 可以分为Gateway Filter和Global Filter。过滤器Filter可以对请求和响应进行处理。

示例:

server:port: 8080
spring:application:name: api-gatewaycloud:gateway:routes:- 	id: product-serviceuri:http://127.0.0.1:9002predicates:-	Path=/product/**
  • id:自定义的路由Id,保持唯一。
  • uri:目标服务地址
  • predicates:路由条件,Predicate接受一个输入参数,返回一个boolean结果。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑,比如:与、或、非
  • filters:过滤规则。

工作流程

请添加图片描述

  • 客户端将请求发送到Spring Cloud Gateway上。
  • Spring Cloud Gateway通过Gateway Handler Mapping找到与请求相匹配的路由,并将其发送给Gateway Web Handler。
  • Gateway Web Handler 通过指定的过滤器链(Filter Chain)将请求转发到实际的服务节点中,执行业务逻辑,返回响应结果。
  • 过滤器可能会在转发请求之前(pre)或之后(post)执行业务逻辑。
  • 过滤器可以在请求转发到服务端前,对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等。
  • 过滤器可以在响应返回客户端之前,对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。

路由规则

在这里插入图片描述

动态路由

动态路由,即自动从注册中心获取服务列表并访问。
现在以spring cloud gateway 集成nacos为例

  1. 添加依赖:在项目的’pom.xml’文件中添加Spring cloud gateway和nacos的相关依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 配置文件:在’application.properties’或’application.yml’中配置Nacos注册中心的地址以及网关的路由规则
spring:application:name: gateway-servicecloud:nacos:discovery:server-addr: localhost:8848 gateway:discovery:locator:enabled: true # 启用服务发现routes:- id: service-routeuri: lb://service-name # 后端服务名称predicates:- Path=/service-path/** # 匹配的请求路径filters:- StripPrefix=1 # 去掉前缀
  1. 启动服务发现:在Spring Boot应用程序的主类上使用’@EnableDiscoveryClient’注解,以启用服务发现功能。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class GatewayServiceApplication {public static void main(String[] args) {SpringApplication.run(GatewayServiceApplication.class, args);}
}

重写转发路径

在Spring Cloud gateway中,路由转发是直接将匹配的路由path直接拼接到映射路径(URL)之后,那么在微服务中开发往往没有那么便利,这里可以通过RewritePath机制来进行路径重写。

spring:application:name: gateway-servicecloud:nacos:discovery:server-addr: localhost:8848 gateway:discovery:locator:enabled: true # 启用服务发现routes:- id: service-routeuri: lb://service-name # 后端服务名称predicates:- Path=/service-path/** # 匹配的请求路径filters:- RewritePath=/serive-path/(? <segment>.*), /$\{segment}

过滤器

Spring Cloud Gateway的Filter从作用范围可分为两种:GatewayFilter与GlobalFilter

  • GatewayFilter:应用到单个路由或者一个分组的路由上。
  • GlobalFilter:应用到所有的路由上。

局部过滤器(GatewayFilter)

局部过滤器是针对单个路由的过滤器,可以对访问的URL过滤,进行切面处理。常见的局部过滤器:

  • AddRequestHeader,为原始请求添加Header。
  • Hystrix:为路由引入Hystrix的断路器保护。
  • FallbackHeaders:为fallbackUri的请求头中添加具体的异常信息。
  • RequestRateLiiter:对于请求限流,限流算法为令牌桶算法。

全局过滤器(GlobalFilter)

全局过滤器作用于所有路由,Spring Cloud Gateway定义了GlobalFilter接口,用户可以自定义实现自己的Global Filter。通过全局过滤器可以实现对权限的统一检验,安全性验证等功能。
在这里插入图片描述

高级应用

鉴权

在这里插入图片描述
角色:

  • 客户端:访问微服务资源
  • 网关:负责转发、认证、鉴权
  • OAuth2.0授权服务:负责认证授权颁发令牌
  • 微服务集合:提供资源

流程:

  • 客户端发送请求给网关获取令牌
  • 网关收到请求,直接转发给授权服务
  • 授权服务验证用户名、密码等,验证通过颁发令牌给客户端
  • 客户端携带令牌请求资源,请求直接到网关层
  • 网关层对令牌及性能校验、鉴权和访问资源所需的权限进行比较。如果权限有交集则通过校验,直接转发给微服务
  • 微服务处理逻辑

网关限流

常见的限流算法

  • 计数器法
    一般我们会限制一秒钟能够通过的请求数,比如限流的qps为100,算法的实现思路就从从第一请求进来开始,在接下来的1s内,每来一个请求,就把计数加1,如果累加的数字达到100,那么或许的请求就会被全部拒绝。等到1s结束后,计数器恢复成0,重新开始计数。
  • 漏斗算法
    匀速处理请求。不管调用方多么不稳定,通过漏斗算法进行限流,每10ms处理一次请求,因为处理的速度是固定的,请求进来的速度是未知的,可能突然进来很多请求,没来得及处理请求就先放到桶里。如果桶满了,那么新进来的请求就丢弃。
  • 令牌桶算法
    令牌桶算法是对漏斗算法的一个改进,存在一个桶,用来存放固定数量的令牌,然后以一定的速率往桶中放令牌。每次请求进来的时候需要先获取令牌,只有拿到令牌才有机会继续执行,否则选择等待可用的令牌或者直接拒绝。
  • Gateway令牌桶
    Spring Cloud Gateway 官方提供了RequestRateLimiterGatewayFilterFactory类,使用redis和lua脚本实现了令牌桶的方式。

实现步骤

  • 引入依赖
<!--基于Redis实现限流-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId><version>2.2.10.RELEASE</version>
</dependency>
  • 创建限流标示
    限流通常要根据某个参数值作为参考依据来进行线路的,例如每个IP只能只能访问2次,创建根据IP限流的对象,该对象需要实现KeyResolver接口
public class IpKeyResolver implements KeyResolver {/**** 根据IP限流* @param exchange* @return*/@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());}
}

需要将IpKeyResolver的实例交给Spring容器管理。

@Configuration
public class GatewayRateLimitConfig {@Bean("ipKeyResolver")
public KeyResolver userIpKeyResolver(){return new IpKeyResolver();
}
}
  • 配置限流速率
spring:cloud:gateway:routes:#商品服务- id: goods_routeuri: lb://mall-goodspredicates:- Path=/mall/brand/**filters:- StripPrefix=1# 指定过滤器- name: RequestRateLimiterargs:# 指定限流标识key-resolver: '#{@ipKeyResolver}'# 速率限流redis-rate-limiter.replenishRate: 1# 能容纳的并发流量总数redis-rate-limiter.burstCapacity: 2

监控

监控每个请求的响应参数是否包含手机号码
首先,您需要创建一个自定义过滤器类,该类将检查响应参数中是否包含手机号码。这可以通过解析响应内容并搜索手机号码的正则表达式来完成。下面是一个示例:

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
@Order(1) // 设置过滤器顺序
public class PhoneNumberCheckFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 检查响应内容是否包含手机号码的逻辑// 解析响应内容并搜索手机号码的正则表达式// 如果包含手机号码,则可以进行相关处理,例如记录日志或触发警报// 这里仅提供示例框架,具体实现需要根据需求编写return chain.filter(exchange);}
}

然后配置过滤器

spring:cloud:gateway:routes:- id: route-nameuri: http://example.comfilters:- PhoneNumberCheck= # 这里填写自定义过滤器的名字

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

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

相关文章

yml配置动态数据源(数据库@DS)与引起(If you want an embedded database (H2, HSQL or Derby))类问题

1&#xff1a;yml 配置 spring:datasource:dynamic:datasource:master:url: jdbc:mysql://192.168.11.50:3306/dsdd?characterEncodingUTF-8&useUnicodetrue&useSSLfalse&tinyInt1isBitfalse&allowPublicKeyRetrievaltrue&serverTimezoneUTCusername: ro…

0401hive入门-hadoop-大数据学习.md

文章目录 1 Hive概述2 Hive部署2.1 规划2.2 安装软件 3 Hive体验4 Hive客户端4.1 HiveServer2 服务4.2 DataGrip 5 问题集5.1 Could not open client transport with JDBC Uri 结语 1 Hive概述 Apache Hive是一个开源的数据仓库查询和分析工具&#xff0c;最初由Facebook开发&…

Direct3D绘制旋转立方体例程

初始化文件见Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客 D3DPractice.cpp #include <windows.h> #include "d3dUtility.h" #include <d3dx9math.h>IDirect3DDevice9* Device NULL; IDirect3DVertexBuffer9* VB NULL; IDirect3…

华为云云耀云服务器L实例评测 | 分分钟完成打地鼠小游戏部署

前言 在上篇文章【华为云云耀云服务器L实例评测 | 快速部署MySQL使用指南】中&#xff0c;我们已经用【华为云云耀云服务器L实例】在命令行窗口内完成了MySQL的部署并简单使用。但是后台有小伙伴跟我留言说&#xff0c;能不能用【华为云云耀云服务器L实例】来实现个简单的小游…

Jmeter系列-阶梯加压线程组Stepping Thread Group详解(6)

前言 tepping Thread Group是第一个自定义线程组但&#xff0c;随着版本的迭代&#xff0c;已经有更好的线程组代替Stepping Thread Group了【Concurrency Thread Group】&#xff0c;所以说Stepping Thread Group已经是过去式了&#xff0c;但还是介绍一下 Stepping Thread …

详解Redis之Lettuce实战

摘要 是 Redis 的一款高级 Java 客户端&#xff0c;已成为 SpringBoot 2.0 版本默认的 redis 客户端。Lettuce 后起之秀&#xff0c;不仅功能丰富&#xff0c;提供了很多新的功能特性&#xff0c;比如异步操作、响应式编程等&#xff0c;还解决了 Jedis 中线程不安全的问题。 …

Python 内置函数速查手册(函数大全,带示例)

1. abs() abs() 返回数字的绝对值。 >>> abs(-7) **输出&#xff1a;**7 >>> abs(7) 输出&#xff1a; 7 2. all() all() 将容器作为参数。如果 python 可迭代对象中的所有值都是 True &#xff0c;则此函数返回 True。空值为 False。 >>>…

使用Spring WebSocket实现实时通信功能

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

ElasticSearch详解

目录 一、Elasticsearch是什么&#xff1f; 二、为什么要使用ElasticSearch 2.1 关系型数据库有什么问题&#xff1f; 2.2 ElasticSearch有什么优势&#xff1f; 2.3 ES使用场景 三、ElasticSearch概念、原理与实现 3.1 搜索引擎原理 3.2 Lucene 倒排索引核心原理 倒排…

GoT:用大语言模型解决复杂的问题

GoT&#xff1a;用大语言模型解决复杂的问题 摘要介绍背景和符号表示语言模型和上下文学习Input-Output&#xff08;IO&#xff09;Chain of thought&#xff08;CoT&#xff09;Multiple CoTTree of thoughts&#xff08;ToT&#xff09; GoT框架推理过程思维变换聚合变换&…

手写数据库连接池

数据库连接是个耗时操作.对数据库连接的高效管理影响应用程序的性能指标. 数据库连接池正是针对这个问题提出来的. 数据库连接池负责分配,管理和释放数据库连接.它允许应用程序重复使用一个现有的数据路连接,而不需要每次重新建立一个新的连接,利用数据库连接池将明显提升对数…

从零开始完整实现-循环神经网络RNN

一 简介 使用 pytorch 搭建循环神经网络RNN&#xff0c;循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一类用于 处理序列数据的神经网络架构。与传统神经网络不同&#xff0c;RNN 具有内部循环结构&#xff0c;可以在处理序列数据时保持状态…

mysql文档--innodb中的重头戏--事务隔离级别!!!!--举例学习--现象演示

阿丹&#xff1a; 先要说明一点就是在网上现在查找的mysql中的事务隔离级别其实都是在innodb中的事务隔离级别。因为在mysql的5.5.5版本后myisam被innodb打败&#xff0c;从此innodb成为了mysql中的默认存储引擎。所以在网上查找的事务隔离级别基本上都是innodb的。并且支持事务…

Docker的数据管理(持久化存储)

文章目录 一、概述二、数据卷三、数据卷容器四、端口映射五、容器互联&#xff08;使用centos镜像&#xff09;总结 一、概述 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&a…

C++基础入门

文章目录 前言一、C历史及发展1.C是什么2.C历史 二、开始C1.基础类型1.第一个简单的C程序2.命名空间1.命名空间的介绍2.命名空间的使用3.命名空间的using声明与using指示 3.初识输入输出操作4.引用1.引用概念2.引用的使用1.引用做参数2.引用做返回值 3.引用和指针的区别4.const…

dantax参数调优

dantax参数调优 1.speed调优 可能会导致数据倾斜 处理的速度不同&#xff0c;可能会导致job非常慢 举例子&#xff0c;比如总限速是每秒100条record&#xff0c;其中第一个channel速度是每秒99条record&#xff0c;第二个channel是每秒1条record&#xff0c;加起来是每条100条…

执行上下文-通俗易懂版

(1) js引擎执行代码时候/前&#xff0c;在堆内存创建一个全局对象&#xff0c;该对象 所有的作用域&#xff08;scope&#xff09;都可以访问&#xff0c;里面会包含Date、Array、String、Number、setTimeout、setInterval等等&#xff0c;其中还有一个window属性指向自己 (2…

Kafka3.0.0版本——文件清理策略

目录 一、文件清理策略1.1、文件清理策略的概述1.2、文件清理策略的官方文档1.3、日志超过了设置的时间如何处理1.3.1、delete日志删除&#xff08;将过期数据删除&#xff09;1.3.2、compact日志压缩 一、文件清理策略 1.1、文件清理策略的概述 Kafka 中默认的日志保存时间为…

QuantLib学习笔记——看看几何布朗运动有没有股票走势的感觉

⭐️ 小鹿在乱撞 小伙伴们肯定看过股票的走势&#xff0c;真是上蹿下跳啊&#xff0c;最近小编学了一丢丢关于随机过程和QuantLib的知识&#xff0c;想利用随机过程生成一个类似股票价格走势的图&#xff0c;安排&#xff01;&#xff01;&#xff01; ⭐️ 随机过程 随机过程…

Python 之使用Numpy库来加载Numpy(.npy)文件并检查其内容

文章目录 总的介绍data.dtypedata.shapedata.ndimdata.size 总的介绍 要判断一个Numpy&#xff08;.npy&#xff09;文件的数据集类型&#xff0c;你可以使用Python中的Numpy库来加载该文件并检查其内容。以下是一些常见的步骤&#xff1a; 导入Numpy库&#xff1a; 首先&…