微服务 过滤器 集成Sentinel实现网关限流

news2024/12/22 22:11:41

微服务 过滤器 集成Sentinel实现网关限流

  • Gateway - -> 过滤器Filter
    • 局部路由过滤器
      • 使用局部过滤器
    • 全局过滤器
      • 使用全局过滤器
  • 集成Sentinel实现网关限流
    • 网关限流
    • API分组限流


Gateway - -> 过滤器Filter

过滤器就是在请求的传递过程中,对请求和响应做一些手脚.
在Gateway中, Filter的生命周期只有两个:“pre”和“post”"。
.PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
.POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTPHeader、收集统计信息和指标、将响应从微服务发送给客户端等。
在Gateway中,Filter的作用范围两种:
.GatewayFilter:应用到单个路由或者一个分组的路由上。
.GlobalFilter:应用到所有的路由上

局部路由过滤器

第一步:编写配置文件

在这里插入图片描述

第二步:创建局部过滤器类

@Component
    public class TimeGatewayFilterFactory extends AbstractGatewayFilterFactory<TimeGatewayFilterFactory.Config> {
        //解析参数
        public TimeGatewayFilterFactory(){
            super(Config.class);
        }

        //读取配置文件中的参数  赋值到  配置类中
        public List<String> shortcutFieldOrder(){
            return Arrays.asList("show");
        }

        //拦截到之后就会调用apply方法,把创建对象时候反射创建出来的config传入进来
        @Override
        public GatewayFilter apply(Config config) {
            return new GatewayFilter() {
                @Override
                public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                    //前置的逻辑
                    System.out.println("前置逻辑");
                    return chain.filter(exchange).then(Mono.fromRunnable(()->{
                        //后置的逻辑
                        System.out.println("后置逻辑");
                    }));
                }
            };
        }

        //将解析好的参数注入其中
        @Setter
            @Getter
            static class Config{
                private boolean show;
            }

    }

使用局部过滤器

假设我们给商品类创建一个局部过滤器,当传入参数为true的时候,控制台内返回网关转发到服务的时间

创建一个过滤器类:

@Component
    public class TimeGatewayFilterFactory extends AbstractGatewayFilterFactory<TimeGatewayFilterFactory.Config> {
        //解析参数
        public TimeGatewayFilterFactory(){
            super(Config.class);
        }

        //读取配置文件中的参数  赋值到  配置类中
        public List<String> shortcutFieldOrder(){
            return Arrays.asList("show");
        }

        //拦截到之后就会调用apply方法,把创建对象时候反射创建出来的config传入进来
        @Override
        public GatewayFilter apply(Config config) {
            return new GatewayFilter() {
                @Override
                public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

                    if(!config.show){
                        return chain.filter(exchange);
                    }

                    //前置的逻辑
                    long start = System.currentTimeMillis();
                    return chain.filter(exchange).then(Mono.fromRunnable(()->{
                        System.out.println("请求耗时:"+(System.currentTimeMillis()-start));
                    }));
                }
            };
        }
        //将解析好的参数注入其中
        @Setter
            @Getter
            static class Config{
                private boolean show;
            }

    }

运行结果:

当参数为true的时候
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果访问别的模块,控制台是不会返回的,这就是局部过滤
当参数为false的时候
在这里插入图片描述
在这里插入图片描述

全局过滤器

全局过滤器作用于所有路由,无需配置,通过全局过滤器可以实现对权限的统一校验,安全性验证等功能。

假设我们现在有一个需求:实现统一鉴权的功能,我们需要在网关判断请求是否包含token且,如果没有则不转发路由,有则正常逻辑。

使用全局过滤器

1.编写全局过滤类

@Component
public class AuthGlobalFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //前置逻辑
        //获取请求中的token信息,验证token是否有效,如果无效拦截请求,
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        if(StringUtils.isEmpty(token)||!"123".equals(token)){
            System.out.println("鉴定失败");
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

集成Sentinel实现网关限流

网关是所有请求的公共入口,所以可以在网关进行限流,而且限流的方式也很多,我们本次采用前
面学过的Sentinel组件来实现网关的限流。Sentinel支持对SpringCloud Gateway、Zuul等主流网关进
行限流。
从1.6.0版本开始,Sentinel提供了SpringCloud Gateway的适配模块,可以提供两种资源维度的限流:
. route维度:即在spring配置文件中配置的路由条目,资源名为对应的routeld
·自定义API维度:用户可以利用Sentinel提供的API来自定义一些API分组

实现步骤:

1.添加依赖

<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

2.添加配置文件

cloud:
  sentinel:
    transport:
      port: 9999
      dashboard: localhost:8080

运行结果

在这里插入图片描述


那么问题来了,如果给网关限流了,那还有必要给接口限流吗?
答案是一定的,网关限流是为了控制通过网关转发到各个微服务的流量,为了防止网关因为流量过大而损坏,但是万一该微服务中被其它若干个别的模块调用的时候,同样也会遭受到很大的压力,容易造成该模块服务器的损坏
总结一句话

网关限流是为了控制访问该微服务的总体流量,但没有办法控制访问该其中特定接口的流量,接口同样也要增加限流

网关限流

在这里插入图片描述

API分组限流

第一步:创建API分组

在这里插入图片描述

创建流控:

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

0xScope x Footprint | 真实的 NFT 市场是什么样?

2023 年 1 月数据源&#xff1a;NFT 真实交易分析面板前言NFT 作为一个2017年才出现的概念&#xff0c;在2018年至2020年一直处于生态发展的酝酿期&#xff0c;在2021年初开始迎来真正的爆发&#xff0c;一系列如CryptoPunk&#xff0c;The Sandbox&#xff0c;BAYC等知名NFT开…

Vue组件间通信的方式

目录 常用的父子组件通讯方式&#xff1a;props,emit 2.$parent,$children 3.$ref 4.provide/inject 5.EventBus 事件总线 &#xff08;任意两个组件通讯&#xff09; 6.$attrs、$listener 7.Vuex 状态管理器 8.localStorage/sessionStorage 在开发中&#xff0c;组…

相见恨晚,这6个适合安卓用户的浏览器,你用过吗

每个人手机里面有一款浏览器&#xff0c;当我们遇到问题的时候&#xff0c;可以打开浏览器搜索自己想要的答案。如果选用的手机浏览器不好&#xff0c;那么手机上可能会被安装很多垃圾软件。下面&#xff0c;和大家聊聊几款好用、适合安卓用户的浏览器&#xff0c;个人觉得这些…

【逐步剖C】第四章-操作符

​ 一、算术操作符 即基本的、-、*、/ 和 %。但也有几个需要注意的地方&#xff1a; 除了 ‘%’ 取模操作符只能作用整数&#xff0c;其他可以作用于整数和浮点数 对于除法&#xff0c;只要有操作数为浮点数就执行浮点数除法。如果两个操作数都为整数&#xff0c;执行整数除…

python多进程、多线程(详细)

多任务概念同一时间执行多个任务多任务优势最大的好处是充分利用CPU资源&#xff0c;提高程序的执行效率GIL锁&#xff08;全局解释锁&#xff09;让一个进程中同一个时刻只有一个线程可以被CPU调用&#xff0c;可以解决线程安全问题&#xff0c;有线程锁也有进程锁Rlock&#…

「自控元件及线路」1.3 直流电动机的特性与控制方法

本节介绍电机的基本物理量和基本关系 本节介绍直流电机的静态特性以及动态特性 本节介绍直流电机的控制方法、启动方法、稳定运行条件 本节介绍直流电动机的四种工作状态 本节介绍控制系统中应用的直流电动机的类型 文章目录基础知识基本物理量&#xff1a;电磁转矩与电枢反电势…

将TensorFlow模型快速迁移到昇腾平台

当前业界很多训练脚本是基于TensorFlow的Python API进行开发的&#xff0c;默认运行在CPU/GPU/TPU上&#xff0c;为了使这些脚本能够利用昇腾AI处理器的强大算力执行训练&#xff0c;需要对TensorFlow的训练脚本进行迁移。首先&#xff0c;我们了解下模型迁移的全流程&#xff…

.net6Api返回统一结果+Vue3前端访问

目录 第一种 第二种 第三种 Vue3前端访问 在我们开发api的时候&#xff0c;需要让接口返回统一的接口&#xff0c;这样容易理解&#xff0c;也容易管理。所以封装返回的统一结果是非常必要的。 下面介绍3种方案。 第一种 建立一个控制器&#xff0c;让所有控制器都继承…

电脑休眠唤醒后会出现屏幕闪烁问题怎么彻底解决?

电脑休眠唤醒后会出现屏幕闪烁问题怎么彻底解决&#xff1f;有的用户在电脑待机休眠之后&#xff0c;重新去唤醒电脑使用&#xff0c;这个时候电脑屏幕就会出现验证的屏幕闪烁&#xff0c;导致无法进行正常的使用。这个情况是电脑系统不兼容导致的。如果想要彻底解决问题&#…

NoClassDefFoundError错误解决

NoClassDefFoundError 类型报错 NoClassDefFoundError与ClassNotFoundException略有区别&#xff0c;从两者的异常类型可以发现&#xff0c;前者属于Error&#xff0c;后者属于Exception&#xff0c;发生了Error往往会导致程序直接崩溃或者无法启动运行。 NoClassDefFoundErro…

ecchart关系图展示(知识图谱)

<!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>ECharts 关系图</title><script type"text/javascript" src"http://code.jquery.com/jquery-3.5.1.min.js"></script><script s…

蓝桥杯-迷宫

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知一个30行50列的方格&#xff0c;方格由0和1组成&#xff0c;1 表示障碍物&#xff0c;0表示可行的方块。人从最上边开始行走&#xff0c;逃出这个迷宫&#xff0c;走到…

Git 之reflog回滚操作失误

前言 以前只知道有git log命令&#xff0c;并不知道有git reflog。今天一个偶然的机会&#xff0c;我不小心把自己前两天写的代码给整丢了&#xff0c;如果时几个小时的代码&#xff0c;我重新写一遍就算了&#xff0c;但是这次不一样&#xff0c;这次是非常重大的修改&#x…

openfeign集成sentinel实现服务降级

openfeign集成sentinel实现服务降级使用openfeign调用服务&#xff08;不含sentinel&#xff09;代码测试openfeign集成sentinel实现服务降级引入sentinel相关环境编写FeignClient注解接口的实现类在服务提供者中&#xff0c;认为添加异常代码&#xff0c;以供测试 / 或者不启动…

SpringBean的生命周期

下文要讲的均是spring的默认作用域singleton的bean的生命周期&#xff0c;对spring作用域不了解的可以 https://blog.csdn.net/hlzdbk/article/details/128811271?spm1001.2014.3001.5502 什么是SpringBean的生命周期 springBean的生命周期&#xff0c;指的是spring里一个be…

Python爬虫以及数据可视化分析之某站热搜排行榜信息爬取分析

目录前言一&#xff0c;确定目标二&#xff0c;发送请求三, 解析数据四, 保存数据pyecharts进行可视化“某站”数据排名前10视频类型“某站”标题标签可视化“某站”喜欢视频分类概况总结前言 本项目将会对“某站”热搜排行的数据进行网页信息爬取以及数据可视化分析 本教程仅…

数据结构:栈的学习

作者&#xff1a;爱塔居 专栏&#xff1a;数据结构 作者简介&#xff1a;大三学生&#xff0c;希望跟大家一起进步 目录 一、栈 1.1 概念 1.2 栈的使用 1.3 示例 二、栈的应用场景 2.1 改变元素的序列 2.2 逆波兰表达式求值 2.3 括号匹配 2.4 栈的压入、弹出序列 一、栈…

upstream sent duplicate header line: “Transfer-Encoding: chunked“

实际情景&#xff1a; 公司项目有一个下载文件的功能&#xff0c;没有经过Nginx代理之前&#xff0c;好好的&#xff0c;正常下载&#xff1b; 加入了Nginx代理之后&#xff0c;过Nginx访问就会有 err_empty_response 这个错误&#xff1b; 搞了半天&#xff0c;nginx.conf加入…

第一章 linux概述

第一章 Linux概述 1、为什么要使用Linux Linux内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支…

【蓝桥杯_学习_51单片机】矩阵键盘 状态机法

矩阵键盘 一.基础知识 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵形式采用逐行或逐列的“扫描”&#xff0c;就可以读出任何位置按键的状态 矩阵键盘和独立按键一样&#xff0c;也需要进行消抖处理&#xff01; 于此补充一下抖…