写在前面

我们知道随着微服务应用的增多,服务与服务之间的稳定性就显得越来越重要,否则极易出现由于某个服务出现问题而导致其余服务全部崩溃的雪崩效应发生。在前面学习Spring Cloud的时候,我们知道了如何使用Hystrix来进行服务熔断和降级,但是由于Netflix已经宣布Hystrix不再更新,那么我们就需要选择一个它的替代品,除了官方推荐的resilience4j外,Spring Cloud Alibaba旗下的Sentinel也是备受关注。

Sentinel介绍

Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保存等多个维度来保护服务的稳定性。仅仅通过本篇文章是无法掌握和使用Sentinel的,因此我会用后续几篇文章来深入理解Sentinel,本文主要介绍如何使用Sentinel来实现接口限流。

Sentinel特点

(1)丰富的应用场景。Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
(2)完备的实时监控。Sentinel还提供实时的监控功能,使得开发者可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
(3)广泛的开源生态。 Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Dubbo、gRPC的整合。开发者只需引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
(4)完善的 SPI 扩展点。 Sentinel 提供简单易用、完善的SPI扩展点。开发者可以通过实现扩展点,快速的定制逻辑,如定制规则管理、适配数据源等。

更多特点可以参看如下图片所示:

Sentinel实现接口限流

Sentinel其实和之前学习的Hystrix类似,不过它更为人性化,功能更为强大。同样提供了与hystrix-dashboard类似的sentinel-dashboard用于帮助用户可视化配置管理资源,不过它除了提供hystrix-dashboard一样的实时监控外,还提供了机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。开发者只需要对应用进行简单的配置,就可以使用这些功能。

因此Sentinel的使用分为两部分,第一部分是下载启动sentinel-dashboard;第二部分是整合客户端应用。

下载启动sentinel-dashboard

第一步,下载jar包。开发者可以点击 这里 来下载最新版本的sentinel-dashboard的jar包:

,如果下载速度很慢的话,可以将其下载地址复制到这个 网站进行加速下载。

第二步,启动sentinel-dashboard应用。注意sentinel-dashboard已经是一个打包好的Spring Boot应用,因此如果要自定义其启动参数等信息,可以通过在启动命令中添加参数来调整,如使用-Dserver.port={portNumber}命令来指定其运行端口。当然也可以在sentinel-dashboard-1.8.0.jar同一文件夹下面新建YAML或者Properties格式的配置文件来覆盖其默认的配置文件。注意sentinel-dashboard默认启动端口为8080。开发者可以直接使用如下命令来启动sentinel-dashboard:

1
D:\SpringCloud\cloudali\sentinel-dashboard>start /min sentinel-dashboard-1.8.0.jar

之后打开浏览器,在其地址栏中访问http://localhost:8080链接,如果出现如下页面,则表明sentinel-dashboard应用已经正常启动:

注意只有sentinel版本在1.6.0及以上才会出现上述所示的登录页面,其默认登录用户和密码均为sentinel,如果开发者想自定义这些信息,可以通过在启动命令参数中添加如下配置:

1
2
3
4
5
6
# 设置sentinel-dashboard登录页面的用户名
-Dsentinel.dashboard.auth.username=sentinel
# 设置sentinel-dashboard登录页面的密码
-Dsentinel.dashboard.auth.password=sentinel
# 设置spring boot服务端session的过期时间,注意7200表示7200秒,60m表示60分钟,默认为30分钟即30m
-Dserver.servlet.session.timeout=7200

当用户输入正确的用户名和密码后,就会出现如下的登录成功页面:

可以看到页面是空荡荡的,那是因为目前只是启动了sentinel-dashboard,还没有将其与微服务应用进行整合,进而实现接口限流这一目的。

整合客户端应用

考虑到微服务的特性,这里就新建一个测试用的实例,这也与微服务的解耦思想相匹配。

第一步,创建Spring Boot项目。使用Spring Initializr工具创建一个Spring Boot应用,名称为sentinel-hello

第二步,编辑依赖文件。请注意考虑到版本兼容问题,因此最好还是使用之前学习Nacos时的Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本。编辑项目的pom.xml依赖文件,添加如下配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

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

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

第三步,配置服务名称和sentinel-dashboard的访问地址。application.properties配置文件中指定服务名称,端口号,以及sentinel-dashboard的访问地址,如下所示:

1
2
3
4
5
6
# 应用名称
spring.application.name=sentinel-hello
# 端口号
server.port=8036
# sentinel-dashboard访问地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080

第四步,提供一个访问接口。由于这是一个web工程,因此可以添加一个Controller,并提供一个访问入口。在项目目录下新建controller包,并在里面新建HelloController文件,其中的代码为:

1
2
3
4
5
6
7
8
9
10
@RestController
@Slf4j
public class HelloController {

@GetMapping(value = "/hello")
public String hello(){
log.info("the hello method is calling...");
return "hello,sentinel!";
}
}

第五步,启动项目。首先确保之前下载的sentinel-dashboard服务已经正常运行,然后启动这里名为sentinel-hello的服务。接着在浏览器访问http://127.0.0.1:8036/hello链接,即可看到如下的返回信息:

当然也可以使用curl工具来进行测试,如下所示:

1
2
C:\Users\envy>curl -X GET "http://127.0.0.1:8036/hello"
hello,sentinel!

接下来刷新一下之前的http://localhost:8080链接,可以看到页面左侧出现了一些信息:

可以看到这个页面就详细监控了我们之前多次对于/hello接口的调用情况,接下来学习如何设置接口限流。

设置接口限流

我们在前面是多次调用了/hello接口,接下来就对该接口进行限流设置。点击sentinel-dashboard首页左侧的流控规则按钮,然后点击右侧的新增流控规则按钮,按照下图进行设置:

这里的流控规则非常简单,资源名填入/hello,就是你需要限流的接口;阈值类型选择QPS,也就是每秒查询条数;单机阈值设置2,表示每秒最多允许2个请求进入。之后点击新增按钮,之后页面就显示流控规则已经添加:

接下来就开始验证上述流控规则是否有效,可以同时多次访问http://127.0.0.1:8036/hello链接,看看页面的返回情况,当每秒请求次数超出设置的2次,页面就会提示以下信息:

通过上述简单的配置,我们就完成了对/hello接口的限流工作。这样关于Sentinel实现接口限流的学习就到此为止,后续开始学习其他内容。