返回顶部
首页 > 资讯 > 精选 >怎么为Spring Cloud Gateway加上全局过滤器
  • 136
分享到

怎么为Spring Cloud Gateway加上全局过滤器

2023-06-14 05:06:49 136人浏览 薄情痞子
摘要

本篇内容介绍了“怎么为spring cloud Gateway加上全局过滤器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!既然是一个网关。那

本篇内容介绍了“怎么为spring cloud Gateway加上全局过滤器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

既然是一个网关。那么全局过滤器肯定是少不了的一个存在。像是鉴权、认证啥的不可能每个服务都做一次,一般都是在网关处就搞定了。
Zuul他就有很强大的过滤器体系来给人使用。
Gateway当然也不会差这么点东西。
对于SpringCloud体系来说,一切的实现都是那么的简单。那么废话不多说,直接开始写起来。
 
Gateway内部有一个接口 名为GlobalFilter,这个就是Gateway的全局过滤器接口,只要在应用中实现此接口后注册为spring的Bean,背后就会帮你将这个实现注册到全局过滤器链条里边去。
我这里就简单的写了个模拟鉴权的过滤器实现:

@Componentpublic class AuthFilter implements GlobalFilter, Ordered {  @Override  public Mono<Void> filter(ServerWEBExchange exchange, GatewayFilterChain chain) {    String token = exchange.getRequest().getHeaders().getFirst("Authorization");    //不为空则通过    if (!StringUtils.isEmpty(token)) return chain.filter(exchange);    ServerHttpResponse response = exchange.getResponse();    // 封装错误信息    Map<String, Object> responseData = Maps.newHashMapWithExpectedSize(3);    responseData.put("code", httpstatus.UNAUTHORIZED.value());    responseData.put("message", "Token is empty");    responseData.put("cause", "Token is empty");    // 将信息转换为 JSON    ObjectMapper objectMapper = new ObjectMapper();    byte[] data = new byte[0];    try {      data = objectMapper.writeValueAsBytes(responseData);    } catch (jsonProcessingException e) {      e.printStackTrace();    }    // 返回错误信息json    DataBuffer buffer = response.bufferFactory().wrap(data);    response.setStatusCode(HttpStatus.UNAUTHORIZED);    response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");    return response.writeWith(Mono.just(buffer));  }  //最后执行  @Override  public int getOrder() {    return Ordered.LOWEST_PRECEDENCE;  }}

虽说是鉴权,但实际上我这就是个简单的demo而已。想知道真正的Spring Security鉴权/认证怎么写?
我以前写的这个:https://GitHub.com/skypyb/code_demo/tree/master/spring-security-demo 应该可以帮助你。
 
看我写的这个过滤器内部实现哈,其实就是拿出Request Header中的 Authorization字段(token) 然后判断是否存在。不存在就返回错误,存在就交给链条中的下一个过滤器。
 
过滤器其实也没啥好说的,那么说说限流。
关于限流这个东西,常见的算法就是漏桶和令牌桶了,对于一个应用单机限流来说也复杂不到哪儿去。
靠着Google guava包里的RateLimiter工具都能搞定大多数场景了。
不过既然人家Gateway好心好意给你搞了个限流的实现。那么还是尊重他用一下。
由于Gateway是用的Redislua脚本实现了令牌桶的算法,那么先导入几个需要的依赖:

<!--Redis begin-->    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-data-redis</artifactId>    </dependency>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-data-redis-Reactive</artifactId>    </dependency>    <dependency>      <groupId>redis.clients</groupId>      <artifactId>jedis</artifactId>    </dependency>    <!--Redis end-->

既然是Redis,那还是先配一下Redis序列化先:

@Configurationpublic class RedisConfig {  @Bean  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();    redisTemplate.seTKEySerializer(stringRedisSerializer);    redisTemplate.setHashKeySerializer(stringRedisSerializer);    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));    redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());    redisTemplate.setConnectionFactory(connectionFactory);    return redisTemplate;  }}

万事俱备,开始进行限流的具体实现了。
 
既然是限流,那么也得有个限流策略
是根据用户来限流呢?还是说根据请求路径限流?或者是IP限流?
不过这个都是由需求来决定了,我这就简单的写个根据IP来限流的。
人家也给你封装完毕了,只需要你自己实现KeyResolver这个接口就可以。
由于实现这个一般来说也就一行代码,所以我就不写个单独的类去实现了,而是直接写在配置类里边。

@Configurationpublic class GatewayRateLimiterConfig {    @Bean(value = "ipKeyResolver")  public KeyResolver ipKeyResolver() {    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());  }}

看,我其实只需要返回我需要限制的东西就可以了。我这里提取到用户的IP将其返回,即可实现通过ip来进行限流的策略。
不过限流相关的配置写了,那也得用起来。
这个怎么用起来? 其实直接在配置文件里配置就OK了

spring: application:  # 应用名称  name: sc-demo-alibaba-gateway cloud:  Nacos:   discovery:    server-addr: 192.168.3.105:8848 #注册进nacos  # 使用 Sentinel 作为熔断器  sentinel:   transport:    port: 18102    dashboard: 192.168.3.105:8858  # 路由网关配置  gateway:   # 这里是设置与服务注册发现组件结合,这样可以采用服务名的路由策略   discovery:    locator:     enabled: true   # 配置路由规则   routes:    - id: ROUTER#sc-demo-alibaba-consumer #这个是路由ID,需要保证在所有路由定义中唯一,值随便写就是了     # 采用 LoadBalanceClient 方式请求,以 lb:// 开头,后面的是注册在 Nacos 上的服务名     uri: lb://sc-demo-alibaba-consumer     predicates:      # Method ,这里是匹配 GET 和 POST 请求      - Method=GET,POST     filters:      - name: RequestRateLimiter       args:        redis-rate-limiter.burstCapacity: 20        redis-rate-limiter.replenishRate: 5        key-resolver: '#{@ipKeyResolver}'    - id: ROUTER#sc-demo-alibaba-provider     uri: lb://sc-demo-alibaba-provider     predicates:      - Method=GET,POST #Redis配置 redis:  host: 192.168.3.105  port: 6379  #Redis连接池配置  jedis:   pool:    min-idle: 0    max-idle: 8    max-active: 8    max-wait: -1msserver: port: 8888feign: sentinel:  enabled: truemanagement: endpoints:  web:   exposure:    include: "*"# 配置日志级别,方别调试logging: level:  org.springframework.cloud.gateway: debug

这里可以看到,除了Redis配置 ( spring.redis.** )以外。
主要就是对于Getway的配置。
在Gateway路由配置中,设置了一个filters参数。
这个是为了指定路由的各种过滤器的。这个参数也有很多种,可以参考官方讲解: https://cloud.spring.io/spring-cloud-gateway/2.0.x/single/spring-cloud-gateway.html#gateway-route-filters

我这就是指定了一个RequestRateLimiter,请求限流。

  • redis-rate-limiter.burstCapacity: 20     

这个参数表示突发容量,即每秒可以最大通过多少次请求

  • redis-rate-limiter.replenishRate: 5      

 这个是令牌桶的补充速度,每秒往桶里边放几个令牌

  • key-resolver: ‘#{@ipKeyResolver}'             

这个就是用上KeyResolver的具体实现了,这里用spel表达式指定我写的那个ip限制类

准备好之后将应用启动就完事了,想测的话可以用jmeter测测看,或者将请求限制写的更小一点,在网页上狂按f5也行。

“怎么为Spring Cloud Gateway加上全局过滤器”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么为Spring Cloud Gateway加上全局过滤器

本文链接: https://lsjlt.com/news/267876.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么为Spring Cloud Gateway加上全局过滤器
    本篇内容介绍了“怎么为Spring Cloud Gateway加上全局过滤器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!既然是一个网关。那...
    99+
    2023-06-14
  • 如何为Spring Cloud Gateway加上全局过滤器
    既然是一个网关。那么全局过滤器肯定是少不了的一个存在。像是鉴权、认证啥的不可能每个服务都做一次,一般都是在网关处就搞定了。 Zuul他就有很强大的过滤器体系来给人使用。 Gatewa...
    99+
    2024-04-02
  • spring cloud gateway全局过滤器实现向request header中放数据
    gateway全局过滤器向request header放数据 exchange.getRequest().getHeaders().set(); 是不能向 headers中放...
    99+
    2024-04-02
  • spring cloud gateway集成hystrix全局断路器操作
    gateway集成hystrix全局断路器 pom.xml添加依赖 <dependency> <groupId>org.springframework.c...
    99+
    2024-04-02
  • spring cloud gateway集成hystrix全局断路器的操作
    这篇文章主要讲解了“spring cloud gateway集成hystrix全局断路器的操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring cloud gateway集成hys...
    99+
    2023-06-20
  • 聊聊Spring Cloud Gateway过滤器精确控制异常返回问题
    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览在《Spring Cloud...
    99+
    2024-04-02
  • springcloud整合gateway实现网关全局过滤器功能
    目录1.代码实现:2.实现效果:springcloud整合gateway实现网关全局过滤器功能,在​ ​ springcloud整合gateway实现网关 ​​基础功能上进...
    99+
    2024-04-02
  • springcloud如何整合gateway实现网关全局过滤器功能
    这篇文章主要讲解了“springcloud如何整合gateway实现网关全局过滤器功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springcloud如何整合gateway实现网关全局过...
    99+
    2023-06-29
  • vue全局过滤器怎么设置(教程)
    Vue.js 是一个高效、灵活并且易于学习的前端框架,具有响应式和组件化的特性。Vue.js 还提供了一种很便捷的方式来处理数据,那就是 Vue.js 的过滤器。在 Vue.js 中,过滤器可以用于转换数据。通常我们要将数据进行格式化以满足...
    99+
    2023-05-14
  • vue-cli 3中怎么实现一个全局过滤器
    vue-cli 3中怎么实现一个全局过滤器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、创建 filters.js首先新建一个filter...
    99+
    2024-04-02
  • vue全局过滤器基本使用方法是什么
    本篇内容介绍了“vue全局过滤器基本使用方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一.过滤器的概念Vue.js允许你自定义过滤...
    99+
    2023-06-25
  • 怎么为Jenkins添加SSH全局凭证
    这篇“怎么为Jenkins添加SSH全局凭证”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么为Jenkins添加SSH全局...
    99+
    2023-06-29
  • Matplotlib怎么为图表添加交云端算法控过滤器
    要为Matplotlib图表添加交云端算法控过滤器,可以使用widgets模块中的interact函数。这个函数可以创建一个交互式控...
    99+
    2024-05-21
    Matplotlib
  • SpringBoot整合Spring Security过滤器链加载执行流程是什么
    这篇文章主要讲解了“SpringBoot整合Spring Security过滤器链加载执行流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot整合Sprin...
    99+
    2023-07-05
  • odoo怎么为可编辑列表视图字段搜索添加查询过滤条件
    这篇文章主要介绍“odoo怎么为可编辑列表视图字段搜索添加查询过滤条件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“odoo怎么为可编辑列表视图字段搜索添加查询过滤条件”文章能帮助大家解决问题。Od...
    99+
    2023-07-05
  • Vue怎么通过浏览器控制台查看全局data值
    今天小编给大家分享一下Vue怎么通过浏览器控制台查看全局data值的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。(1)没有或...
    99+
    2023-07-06
  • 怎么实现一个更全面的Golang版本的布谷鸟过滤器
    这篇文章给大家分享的是有关怎么实现一个更全面的Golang版本的布谷鸟过滤器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。布谷鸟过滤器布谷鸟过滤器在网络上已经有很多的介绍文章了,这里不再做过多的介绍,只提一下要点...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作