前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Gateway基于内置过滤工厂实现限流

Spring Cloud Gateway基于内置过滤工厂实现限流

作者头像
胖虎
发布2019-06-26 15:48:34
1.2K0
发布2019-06-26 15:48:34
举报
文章被收录于专栏:晏霖晏霖

前言

本文使用 gateway 内置的过滤工厂 -RequestRateLimiter 实现限流的。

本文Demo 是对《重新定义》 代码示例进行改造。

正文

前置准备工作

  1. 本机安装一个 redis ,端口按默认的,然后启动。
  2. 创建一个 eureka-service ,端口是 8888,然后启动。
  3. 创建一个 eureka客户端,返回一个字符串即可,并注册在准备好的注册中心上。
  4. 父工程pom文件,滑动一下滚轮即可看到pom 的内容。

说明一下,我准备好的客户端接口,和父pom如下

代码语言:javascript
复制
@RequestMapping("/hello")
@RestController
public class HelloController {


    @GetMapping("/rateLimit")
    public String hello() {
        return "Hello, spring cloud Gateway";
    }

}
代码语言:javascript
复制
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

下面是重点部分

说明一下,所有工程<parent> 中,groupId,artifactId,version替换成父pom即可。

创建一个maven工程,作为我们gateway。pom需要添加的依赖如下

代码语言:javascript
复制
<dependencies>
        <!-- Spring Cloud Gateway的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

创建一个 RemoteAddrKeyResolver 类,为了编写 key-resolver 对应的 remoteAddrKeyResolver

代码语言:javascript
复制
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

public class RemoteAddrKeyResolver implements KeyResolver {

    public static final String BEAN_NAME = "remoteAddrKeyResolver";

    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }

}

把key对应的解析器加载到spring 容器中。

代码语言:javascript
复制
@SpringBootApplication@EnableEurekaClient
public class GatewayApplication {


    @Bean(name = RemoteAddrKeyResolver.BEAN_NAME)
    public RemoteAddrKeyResolver remoteAddrKeyResolver() {
        return new RemoteAddrKeyResolver();
    }

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

yml 配置

代码语言:javascript
复制
server.port: 8081
eureka:
  client:
    serviceUrl:
      defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8888}/eureka/
  instance:
    prefer-ip-address: true
spring:
  application:
    name: ch18-6-1-gateway
  redis:
      host: localhost
      port: 6379
  cloud:
    gateway:
      routes:
        - id: ch18-6-provider
          uri: http://localhost:8000/hello/rateLimit
          order: 0
          predicates:
            - Path=/client/**
          filters:
            #filter名称必须是RequestRateLimiter
            - name: RequestRateLimiter
              args:
                #使用SpEL按名称引用bean
                key-resolver: "#{@remoteAddrKeyResolver}"
                #允许用户每秒处理多少个请求
                redis-rate-limiter.replenishRate: 1
                #令牌桶的容量,允许在一秒钟内完成的最大请求数
                redis-rate-limiter.burstCapacity: 5
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
logging:
  level:
    #org.springframework.cloud.gateway: debug
    cn.springcloud.book.filter: debug

代码解释:

我们说下面的代码意思是把 gateway 配合注册中心进行转发

代码语言:javascript
复制
discovery:
        locator:
          enabled: true
          lower-case-service-id: true
下面代码是路由转发,跟 zuul 的path 和serviceId 的作用一样
代码语言:javascript
复制
cloud:
    gateway:
      routes:
        - id: ch18-6-provider
          uri: http://localhost:8000/hello/rateLimit
          order: 0
          predicates:
            - Path=/client/**

更多关于 路由规则和 gateway的学习 请观看我好友的博客 :https://www.lhdyx.cn/article/84

测试

在启动 我们gateway 工程之前,要保证我们前置准备 都已经做好,然后启动 网关。

下面 访问:http://localhost:8081/client/hello/rateLimit ,然后用你那单身 20 多年的手速点击浏览器刷新按钮,看你一秒内能不能超过 5次,我可以,看图。

工程结构图,有需要加微信

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 晏霖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
    • 前置准备工作
      • 下面是重点部分
      相关产品与服务
      微服务引擎 TSE
      微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档