微服务·架构组件之网关- 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.rhkb.cn/news/123969.html

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

相关文章

java八股文面试[数据库]——写失效(双写缓冲区)

InnoDB的页和操作系统的页大小不一致&#xff0c;InnoDB页大小一般为16K&#xff0c;操作系统页大小为4K&#xff0c;InnoDB的页写入到磁盘时&#xff0c;一个页需要分4次写。 如果存储引擎正在写入页的数据到磁盘时发生了宕机&#xff0c;可能出现页只写了一部分的情况&#…

使用element-ui导航,进入对应的三级页面菜单保持点击状态

1.注意事项 01.路由中使用了keepAlive属性&#xff0c;要用keepAlive&#xff1a;true&#xff0c;不能等于false&#xff0c;使用false页面会刷新 2.使用的方法 NavMenu 导航菜单 3.项目实例 <template><div class"policy-home"><div class"…

C++:类和对象(中)

目录 1. 类的6个默认成员函数 四个重要默认函数语法示例&#xff1a; 2. 构造函数 2.1概念 2.2特性 3. 析构函数 3.1概念 3.2特性 4. 拷贝构造函数 4.1概念 4.2特性 5. 赋值运算符重载 5.1运算符重载 5.2 赋值运算符重载 6. const成员函数 7. 取地址及const取地…

day-06 多进程服务器端 -- 进程间通信

一.多进程服务器端 &#xff08;一&#xff09;进程概念及应用 利用之前学习到的内容&#xff0c;我们的服务器可以按照顺序处理多个客户端的服务请求。在客户端和服务时间增长的情况下&#xff0c;服务器就不足以满足需求了。 1.两种类型的服务器端 &#xff08;1&#xff…

Stable Diffuse 之 安装文件夹、以及操作界面 UI 、Prompt相关说明

Stable Diffuse 之 安装文件夹、以及操作界面 UI 、Prompt相关说明 目录 Stable Diffuse 之 安装文件夹、以及操作界面 UI 、Prompt相关说明 一、简单介绍 二、安装文件相关说明 三、界面的简单说明 四、prompt 的一些语法简单说明 1、Prompt &#xff1a;正向提示词 &am…

【全网严谨版】L1-016 查验身份证 (C++解法 整理分析了多种方法)

问题描述 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#…

接口测试工具开发文档

1 开发规划 1.1 开发人员 角 色 主要职责 负责模块 人员 备注 n xxx模块 xxx 1.2 开发计划 <附开发计划表> 1.3 开发环境和工具 开发工具 工具 作用 Notepad 编辑器 Perl 解释器 2 总体设计 设计思路&#xff1a;因为测试app和server。首先必须…

3、QT 的基础控件的使用

一、qFileDialog 文件窗体 Header: #include <QFileDialog> qmake: QT widgets Inherits: QDialog静态函数接口&#xff1a; void Widget::on_pushButton_clicked() {//获取单个文件的路径名QString filename QFileDialog :: getOpenFileName(this, tr("Open Fi…

Json“牵手”当当网商品详情数据方法,当当商品详情API接口,当当API申请指南

当当网是知名的综合性网上购物商城&#xff0c;由国内著名出版机构科文公司、美国老虎基金、美国IDG集团、卢森堡剑桥集团、亚洲创业投资基金&#xff08;原名软银中国创业基金&#xff09;共同投资成立1。 当当网从1999年11月正式开通&#xff0c;已从早期的网上卖书拓展到网…

【LeetCode - 每日一题】2594. 修车的最少时间(23.09.07)

2594. 修车的最少时间 题意 给定每个师傅修车的时间和需要修的车辆总数&#xff0c;计算修理所有汽车需要的最少时间。师傅可以同时修车。 解法 二分 看到题目没有任何头绪&#xff0c;直接查看题解。 至于为什么用二分做呢&#xff0c;讨论区有个友友这么说到&#xff1a…

学习心得08:OpenGL

我是想学习一下如何编程&#xff0c;这本书大多介绍的是原理。这两个完全是一回事。所以我又买了另外一本看看。

《TCP/IP网络编程》阅读笔记--Socket类型及协议设置

目录 1--协议的定义 2--Socket的创建 2-1--协议族&#xff08;Protocol Family&#xff09; 2-2--Socket类型&#xff08;Type&#xff09; 3--Linux下实现TCP Socket 3-1--服务器端 3-2--客户端 3-3--编译运行 4--Windows下实现 TCP Socket 4-1--TCP服务端 4-2--TC…

发布自定义node包,实现自定义脚本命令

比方说yarn&#xff0c;cnpm&#xff0c;vite等命令&#xff0c;无需执行node xxxx&#xff0c;可以自定义执行并完成一些操作 创建一个文件夹如下 在index.js中输入 #!/usr/bin/env node console.log(hello world);在package.json中添加 {...,"bin": {"pack…

陇剑杯2023线上wp

1. hard_web hard_web_1 题目内容&#xff1a;服务器开放了哪些端口&#xff0c;请按照端口大小顺序提交答案&#xff0c;并以英文逗号隔开(如服务器开放了 80 81 82 83 端口&#xff0c;则答案为 80,81,82,83) 半开放扫描 端口开放状态 攻击机发送 SYN 请求连接此端口靶机…

在element-plus中想要多选框(Checkbox)的功能,但是想要单选框(Radio)的圆形样式如何实现

在element plus中想要多选框&#xff08;Checkbox&#xff09;的功能&#xff0c;但是想要单选框(Radio)的圆形样式如何实现 原因 在完成一个业务需求时&#xff0c;需要一个框进行选择或者取消 element plus中的多选框&#xff08;Checkbox&#xff09;可以满足这个需求 但…

腾讯云、阿里云、华为云便宜云服务器活动整理汇总

云服务器的选择是一个很重要的事情&#xff0c;避免产生不必要的麻烦&#xff0c;建议选择互联网大厂提供的云计算服务&#xff0c;腾讯云、阿里云、华为云就是一个很不错的选择&#xff0c;云服务器稳定性、安全性以及售后各方面都更受用户认可&#xff0c;下面小编给大家整理…

2023 年高教社杯全国大学生数学建模竞赛题目 C 题 蔬菜类商品的自动定价与补货决策

C 题 蔬菜类商品的自动定价与补货决策 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c;商超通常会根据各商品的历史销售和需求情况每天进…

表面之下:理解低代码代理世界中低佣金的经济学

低代码市场在中国自2019年左右兴起&#xff0c;至今已近五年。从最初的质疑&#xff0c;到如今的广泛应用&#xff0c;其业务价值已得到市场普遍认可。根据爱分析测算&#xff0c;2023年中国低代码市场规模为50.2亿元人民币&#xff0c;年增速为39.9%。低代码市场在满足企业需求…

无涯教程-JavaScript - ERFC.PRECISE函数

描述 ERFC.PRECISE函数返回x和无穷大之间集成的互补ERF函数。 互补误差函数等于1-ERF(即1-误差函数),由等式给出- $$Erfc(x) \frac {2} {\sqrt {\pi}} \int_ {x} ^ {\infty} e ^ {-t ^ 2} dt $$ 语法 ERFC.PRECISE(x)争论 Argument描述Required/OptionalxThe lower bound…

python技术面试题合集(二)

python技术面试题 1、简述django FBV和CBV FBV是基于函数编程&#xff0c;CBV是基于类编程&#xff0c;本质上也是FBV编程&#xff0c;在Djanog中使用CBV&#xff0c;则需要继承View类&#xff0c;在路由中指定as_view函数&#xff0c;返回的还是一个函数 在DRF中的使用的就是…