【第26章】Spring Cloud之Sentinel适配API Gateway

news2024/11/17 11:33:30

文章目录

  • 前言
  • 一、准备
    • 1. 引入库
    • 2. 注册过滤器
    • 3. 添加配置
    • 4. 效果展示
  • 二、基于网关的流控
    • 1. 新增流控规则
    • 2. 测试准备
    • 3. 测试结果
  • 总结


前言

Sentinel从1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:

  • route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId
  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组

一、准备

1. 引入库

这里我引入了和sentinel-dashboard控制台相同版本的网关层依赖包,
第二个starter引入尽量和你的spring-cloud-alibaba相同即可

<!-- https://mvnrepository.com/artifact/com.alibaba.csp/sentinel-spring-cloud-gateway-adapter -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
    <version>1.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
     <version>2023.0.1.0</version>
 </dependency>

2. 注册过滤器

package org.example.gateway.config;

import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.result.view.ViewResolver;
import java.util.Collections;
import java.util.List;

/**
 * Create by zjg on 2024/8/24
 */
public class SentinelConfiguration {
    private final List<ViewResolver> viewResolvers;
    private final ServerCodecConfigurer serverCodecConfigurer;

    public SentinelConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider,
                                ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
        // Register the block exception handler for Spring Cloud Gateway.
        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }

    @Bean
    @Order(-1)
    public GlobalFilter sentinelGatewayFilter() {
        return new SentinelGatewayFilter();
    }
}

3. 添加配置

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080

4. 效果展示

在这里插入图片描述

首次加载的时候,我们需要发起一次请求,才能在界面上看到监控信息,因为 Sentinel 使用了 lazy load 策略。

二、基于网关的流控

在这里插入图片描述
通过上图大家可以清楚的看到,我们在请求了localhost:8888/provider/hello?a=1接口之后出现了对应的服务。

1. 新增流控规则

本机嘛,阈值没必要那么高

在这里插入图片描述

2. 测试准备

我这里使用curl命令来进行http请求测试,生成一个脚本,发起6次请求

curl --location --request GET 'localhost:8888/provider/hello?a=1' --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGFpbXMiOnsidXNlcm5hbWUiOiJhZG1pbiJ9LCJpc3MiOiJhdXRoMCIsImV4cCI6MTcyNDU5MDMzOH0.hWebKIoGRWSRaayncuMtwH9UPDVr5gcvcCm7R1FlxNg'

3. 测试结果

在这里插入图片描述

大家可以看到前5次是正常的,到第6次就超过了我们设置的阈值,返回都没有,其实是后台报错了导致的,我准备对各个组件适配Sentinel,这种使用方式是不太友好的。


总结

回到顶部

我最开始的愿景是:网关作为流量的统一入口,在网关层面做统一的流控是最合适不过了。

但是看到了官方的这句话Sentinel 网关流控默认的粒度是 route 维度以及自定义 API 分组维度,默认不支持 URL 粒度。若通过 Spring Cloud Alibaba 接入,请将 spring.cloud.sentinel.filter.enabled 配置项置为 false(若在网关流控控制台上看到了 URL 资源,就是此配置项没有置为 false)。
自定义支持 URL 粒度,但是这样做的工作量是巨大且难以管理的,尤其是我们有众多接口服务的时候。

这时候Sentinel针对网关的整合只能先告一段落,暂时让各个组件整合Sentinel,各组件维护自己的流控和降级规则等等。

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

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

相关文章

基于IndexDB+md-editor-v3实现的简单的文章书写小系统

基于IndexDBmd-editor-v3实现的简单的文章书写小系统 文章说明核心代码效果展示源码下载 文章说明 采用vue3 IndexDB 实现的个人仓库系统&#xff0c;采用markdown书写文章&#xff0c;并将文章信息存储在IndexDB数据库中&#xff0c;通过JavaScript原生自带的分词API进行文章…

盘点10款顶级加密软件,让企业数据安全得到保障!

随着数字化进程的加快&#xff0c;企业数据的安全性面临着越来越多的威胁。无论是内部的数据泄露还是外部的网络攻击&#xff0c;企业必须采用强大的加密软件来确保敏感信息的安全。2024年&#xff0c;企业数据安全需求日益增长&#xff0c;各类加密软件应运而生&#xff0c;提…

收银系统源码-收银台(exe、apk安装包)自由灵活操作简单!

收银系统现在已经成为门店经营必备工具&#xff0c;尤其是连锁多门店。一套好的收银系统可以帮助门店管理门店、管理商品、管理会员等&#xff0c;可以更好的经营决策。线下收银端更是门店每天高频使用的。但线下收银端需要具备哪些亮点才能更加高效呢&#xff1f; 1.收银端支…

CPP/C语言中的位运算

背景: leetcode 汉明距离问题看题解时&#xff0c;遇见了这个问题这里简单总结一下。 实例: 异或运算符 ^ 会将左右两边的数据转化为二进制形式&#xff0c;按位与 4\^1100\^0011015或运算 | 同样将左右两边数据转化为二进制形式&#xff0c;按位或 4|1100|0011015与运算…

数据结构之红黑树的 “奥秘“

目录&#xff1a; 一.红黑树概念 二. 红黑树的性质 三.红黑树的实现 四.红黑树验证 五.AVL树和红黑树的比较 一.红黑树概念 1.红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何 一条从根…

03 Flask-添加配置信息

回顾之前学习的内容 02 Flask-快速上手 Flask 中最简单的web应用组成 1. 导入核心库 Flask from flask import Flask2. 实例化 web应用 注意&#xff1a;不要漏了 app Flask(__name__) 中的 __name__ 表示&#xff1a;是从当前的py文件实例化 app Flask(__name__)3. 创…

内网隧道:端口转发

目录 LCX端口转发 场景一 场景二 SSH的端口转发 一、本地转发&#xff08;正向访问A&#xff09;&#xff1a; 二、远程转发&#xff08;反向访问A&#xff09; 三.NETSH端口转发 端口转发和端口映射 端口转发,有时被称为做隧道,是安全壳( SSH)为网络安全通信使用的一种方…

视频监控接入平台web客户端有时无法登录,有时打开实时视频出现黑屏的问题解决

目录 一、背景说明 二、解决过程 1、问题产生 2、命令介绍 ①基本用法 ②常用选项 ③示例 3、问题解决 三、最终结果 一、背景说明 在本地登录视频监控平台的服务器进行测试时&#xff0c;发现客户端登录不上。 检查服务器的服务和数据库&#xff0c;运行状况正常&#xff0c…

45个图源二维码分享及使用方法

我们曾在《40个图源二维码分享及使用方法》一文中&#xff0c;为你分享了40个图源二维码。 现在在此基础之上新增5个图源二维码&#xff0c;共分享45个。 如果你需要这些图源&#xff0c;请在文末查看领取方式。 45个图源 打开下面的网址进入水经微图&#xff08;简称“微图…

Swift 创建扩展(Extension)

类别(Category) 和 扩展(Extension) 的 用法很多. 常用的 扩展(Extension) 有分离代码和封装模块的功能,例如登陆页面有注册功能,有登陆功能,有找回密码功能,都写在一个页面就太冗余了,可以考虑使用 扩展(Extension) 登陆页面的方法来分离代码 本文介绍Swift 如何创建扩展(Ex…

maven项目下使用Jacoco测试覆盖率

【本文前提是了解maven项目及其Pom.xml机制&#xff0c;不熟悉可以看该博客的0.Pre部分Auto-Unit-Test-Case-Generator -- java项目自动测试生成-CSDN博客】 JaCoCo&#xff08;Java Code Coverage&#xff09;是一个开源的代码覆盖率工具&#xff0c;专门用于测量 Java 应用程…

Web测试中如何简单定位Bug

定位bug之前要确定自己对用例的理解是否有问题。&#xff08;在工作中,很多测试结果错误都是因为自己对用例的理解没有到位&#xff0c;以致于操作错误导致结果不符合预期&#xff09; 一般来说bug分为前端bug和后端bug&#xff0c;前端bug为请求数据错误&#xff0c;后端bug为…

web基础之信息泄露

1、目录遍历漏洞 &#xff08;1&#xff09;原理&#xff1a;本质是没有过滤用户输入的 ../ 相关的目录跳转符&#xff0c;使得攻击者通过目录跳转符来遍历服务器中的任意文件。 &#xff08;2&#xff09;题解&#xff1a; eg:根据提示遍历网页目录信息&#xff0c;会在某一个…

vscode---snippets配置全局代码片段,快捷开发!

代码片段的作用&#xff1a;在开发一个项目时&#xff0c;经常会遇到好多同一个代码逻辑&#xff0c;可配置固顶逻辑的代码块&#xff0c;避免重复敲同一代码&#xff1b; 举例&#xff1a;比如跳转登录&#xff0c;需要调用app的客户端方法&#xff0c;api调用跳转&#xff1…

Web 原生组件化方案:Web Components

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 Web 组件化是一种将Web应用的UI部分拆分成可复用的独立组件的架构方法。这种方法有助于提高代码的可维护性、可重用性和可测试性。 而Web Components 标准则提供了一套原生的API&#xff0c;允许开发者创建…

TestCraft - GPT支持的测试想法生成器和自动化测试生成器

在当今快速变化的软件开发世界中&#xff0c;自动化测试已成为确保软件质量的关键环节。而随着AI技术的进步&#xff0c;越来越多的工具开始引入人工智能&#xff0c;来辅助生成测试用例和自动化测试脚本。其中&#xff0c;TestCraft&#xff0c;作为一款GPT支持的测试想法生成…

天命所归,SyntaxFlow助大圣取得真经

之前预告许久的SyntaxFlow功能已经登陆Yakit&#xff01; SyntaxFlow代码查询需要先进行项目编译。 手动编译 在前端的YakRunner界面&#xff0c;主界面或选项栏可以直接点击“编译项目”功能。 可见图中红色方框圈起的选项 编译项目的选项如下&#xff1a;必选项为项目名、…

工控机防病毒/防勒索病毒如何一步搞定?

随着勒索病毒的肆虐和内部运营泄密事件的频发&#xff0c;企业数据安全正面临着前所未有的挑战。苏州深信达网络科技有限公司&#xff0c;作为数据安全解决方案的先驱&#xff0c;推出了MCK主机加固解决方案&#xff0c;为企业数据安全提供了一道坚不可摧的防线。 MCK主机加固…

Linux:多路转接 select、poll、epoll

目录 1&#xff1a;select 1. 参数解释 2. 函数返回值 3. fd_set 4. fd_set 相关接口 5. timeval 5. 常见使用 6. 理解 select 执行过程 7. select 的特点 8. select 缺点 9. select 应用 2&#xff1a;socket 就绪条件 1. 读事件就绪&#xff08;Readable&#x…

智能优化算法-海马优化算法(SHO)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 海马优化算法 (Seahorse Optimization Algorithm, SHO) 是一种基于群体智能的元启发式优化算法&#xff0c;它模拟了海马的觅食行为、繁殖行为以及社会互动&#xff0c;用于解决复杂的优化问题。 SHO的工作机制…