Gateway配合sentinel自定义限流_使用Sentinel实现gateway网关及服务接口限流

点击关注“阿甘正专”,设为星标eb4168826aa97bce22f69436b0918fc9.gif

奇迹每天都在发生,等你而来


4a1fae905ef53df4749a203e229e2f45.png

1、Sentinel 简介

1.1 Sentinel是什么:

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。

1.2 Sentinel 的主要工作机制:

  • 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。

  • 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。

  • Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。

1.3 Sentinel的功能特性:

  1. 流量控制

  2. 熔断降级

  3. 系统自适应保护

具体可参考官网介绍:

https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5

本文主要从限流入手,说说如何把Sentinel整合到Spring Cloud应用中,以及如何使用Sentinel Dashboard来配置限流规则。

1.4 什么是流量控制

流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

4883f034d5fa4df2024990153298b52a.png

流量控制设计理念

流量控制有以下几个角度:

  • 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;

  • 运行指标,例如 QPS、线程池、系统负载等;

  • 控制的效果,例如直接限流、冷启动、排队等。

Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

2、Sentinel控制台

2.1 获取Sentinel控制台

您可以从 release 页面 下载最新版本的控制台 jar 包。

您也可以从最新版本的源码自行构建 Sentinel 控制台:

  • 下载 控制台 工程

  • 使用以下命令将代码打包成一个 fat jar:

mvn clean package -DskipTests

2.2 启动

注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

使用如下命令启动控制台:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080

注意:只有1.6.0及以上版本,才有这个简单的登录页面。默认用户名和密码都是sentinel。对于用户登录的相关配置可以在启动命令中增加下面的参数来进行配置:

  • -Dsentinel.dashboard.auth.username=sentinel: 用于指定控制台的登录用户名为 sentinel;

  • -Dsentinel.dashboard.auth.password=123456: 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel

  • -Dserver.servlet.session.timeout=7200: 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;

本地启动,访问:localhost:8080,输入账户密码登录后,可以看到如下页面:

43c8ad74998c547418f56f18d586df4c.png

登录成功后:

d382bae2fa5e5d1cd62874638d24eeca.png

注:首次登陆是显示空白,因为这里我启动了其他服务应用。

3、SpringCloud应用整合Sentinel

3.1 添加Sentinel依赖

基于SpringBoot构建一个SpringCloud应用:service-orderpom.xml中需引入Spring Cloud Alibaba的Sentinel依赖:

<dependency>    <groupId>com.alibaba.cloudgroupId>    <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>dependency>

版本号我使用的是 2.2.1.RELEASE,应保持和你的 Spring Cloud Alibaba 应用一致。

3.2 增加配置

spring.cloud.sentinel.transport.port=8719#sentinel控制台spring.cloud.sentinel.transport.dashboard=localhost:8080#服务启动直接建立心跳连接spring.cloud.sentinel.eager=true

其中,spring.cloud.sentinel.eager=true 可使 你的SpringCloud应用启动时,直接与Sentinel建立心跳连接,访问sentinel 控制台就可以看到服务连接情况,不需要第一次访问应用的某个接口,才连接sentinel。

这里的 spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。

Feign 的支持

Sentinel 适配了 Feign 组件。如果想使用,除了引入 spring-cloud-starter-alibaba-sentinel 的依赖外还需要 2 个步骤:

  • 配置文件打开 Sentinel 对 Feign 的支持,增加如下配置:

feign.sentinel.enabled=true
  • 加入 spring-cloud-starter-openfeign 依赖使 Sentinel starter 中的自动化配置类生效:

<dependency>    <groupId>org.springframework.cloudgroupId>    <artifactId>spring-cloud-starter-openfeignartifactId>dependency>

3.3 增加测试类

/** * @description: * @author: stwen_gan * @date: **/@RestControllerpublic class TestController {    @GetMapping("/test")    public String test(){         return "测试";    }}

访问该接口:localhost:9009/test,然后刷新sentinel控制台:http://localhost:8080/

6cad1cfdc6b148c69333eb0dba500f48.png

在完成了上面后,我们在service-order服务下,点击簇点链路菜单,可以看到如下界面:

9e5733f361dc979d48f1ee5537cc6dd7.png

其中/test接口,就是我们上一节中实现并调用过的接口。通过点击流控按钮,来为该接口设置限流规则,比如:

b0cb69a55842beb37bcbdd6c4416cb4c.png

这里做一个最简单的配置:

  • 阈值类型选择:QPS

  • 单机阈值:1

综合起来的配置效果就是,该接口的限流策略是每秒最多允许1个请求进入。

点击新增按钮之后,可以看到如下界面:

7b90e0b06bf6eda579749fb12e5fb401.png

其实就是左侧菜单中流控规则的界面,这里可以看到当前设置的所有限流策略。

3.5 验证限流规则

在完成了上面所有内容之后,我们可以尝试一下快速的调用这个接口,看看是否会触发限流控制,比如:

1faedf52442aa349fb0ac5646fc376a7.png

我这里使用postman快速点击,访问多次,就会出现被限流情况(1秒钟内访问超过1次)。

4、网关流控

Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。

efd61cdc4c89c2877fca93feae6e0747.png

4.1 Spring Cloud Gateway网关整合Sentinel

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

  • route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId

  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组

基于SpringBoot再构建一个service-gateway网关模块,使用时需引入以下模块(以 Maven 为例):

        <dependency>            <groupId>com.alibaba.cloudgroupId>            <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>        dependency>        <dependency>            <groupId>com.alibaba.cloudgroupId>            <artifactId>spring-cloud-alibaba-sentinel-gatewayartifactId>        dependency>        <dependency>            <groupId>org.springframework.cloudgroupId>            <artifactId>spring-cloud-starter-gatewayartifactId>        dependency>
增加配置:
spring.cloud.sentinel.transport.port=8719# sentinel 控制台 sentinel/sentinelspring.cloud.sentinel.transport.dashboard=localhost:8080

将上面的service-order模块配置到service-gateway网关模块统一入口,配置路由规则:

spring.cloud.gateway.routes[0].id=orderspring.cloud.gateway.routes[0].uri=lb://service-orderspring.cloud.gateway.routes[0].predicates[0]=Path=/serviceOrder/**spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1

启动网关应用,通过网关访问刚才那个测试接口:localhost:1234/serviceOrder/test

刷新sentinel控制台,如下:

b7a608557e8e7faa308e2e8c4abd0986.png

gateway应用还可以自定义API分组管理

a81a6e476682df0e8f7a4fea0727356a.png

下一篇讲解:如何将 Sentinel使用Nacos存储限流规则及同步

参考:https://github.com/alibaba/Sentinel

52914b0e22371b721188a8d9d6886f3a.gif

●史上最强Tomcat8性能优化

●阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路

●B2B电商平台--ChinaPay银联电子支付功能

●学会Zookeeper分布式锁,让面试官对你刮目相看

●SpringCloud电商秒杀微服务-Redisson分布式锁方案

查看更多好文,进入公众号--撩我--往期精彩

3f17c5441a68a56b75619f4e0d42a429.png

右上角按钮分享给更多人哦~cf5120921cf79b70bf6d5cdeffcd0032.pngcf5120921cf79b70bf6d5cdeffcd0032.png

来都来了,点个在看再走吧~~~

768c7bda5af5d772dfe015750689ec75.gif
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值