开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情
相关阅读
- 带你学习Spring Cloud 技术第一篇-总览
- 带你学习Spring Cloud 技术第二篇-技术介绍
- 带你学习Spring Cloud 技术第三篇-服务注册中心
- 学习Spring Cloud 技术第四篇-服务调用
- 学习Spring Cloud 技术第五篇-服务降级
- 学习Spring Cloud 技术第六篇-服务网关
- 学习Spring Cloud 技术第七篇-服务配置
- 学习Spring Cloud 技术第八篇-服务总线
- 学习Spring Cloud 技术第九篇-消息驱动(Spring Cloud Stream)
一、Sentinel(分布式系统的流量防卫兵)
官网资料:
- spring-cloud-alibaba-group.github.io/github-page…
- github.com/alibaba/Sen…
- github.com/alibaba/Sen…
- github.com/alibaba/spr…
- github.com/alibaba/Sen…
二、Sentinel 简介
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性:
Sentinel 的开源生态:
Sentinel 分为两个部分:
- 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
三、软件下载地址
下载地址:github.com/alibaba/Sen… 本文使用的版本是:github.com/alibaba/Sen…
启动Sentinel控制台
java -jar -Xms128m -Xmx128m -Dserver.port=8080 sentinel-dashboard-1.7.0.jar
安装完成之后,访问http://localhost:8080/
出现下面的界面,表示我们安装是成功的。
用户名/密码:sentinel/sentinel进行登陆
接下来就到了配置我们的项目步骤!
四、代码实操
4.1 项目代码的修改
修改我们的项目spring-cloud-alibaba-provider8001
pom.xml
<!-- sentinel-datasource-nacos 后面的持久化会用到的 -->
<!--
持久化的用到的地方
-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!-- spring-cloud-starter-alibaba-sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
bootstrap.yml
server:
port: 8001
spring:
application:
name: cloud-alibaba-prvider # 服务的名称
cloud:
nacos:
# 服务注册与发现的配置信息
discovery:
server-addr: 127.0.0.1:8848 # 服务的地址
#enabled: true # 是否进行服务注册与发现
#service: ${spring.application.name} # 服务的名字 默认 ${spring.application.name}
# 服务配置的配置信息
config:
server-addr: 127.0.0.1:8848 # 服务的地址
file-extension: yaml
#prefix: client # 默认 ${spring.application.name}
# cloud-alibaba-prvider-dev.yaml
# 修改的地方 加上我们的sentinel的配置
sentinel:
transport:
dashboard: 127.0.0.1:8080 # 配置sentinel的 dashboard 的地址
port: 8791 # 默认的端口是 8791 如果被占用 将会进行 +1 的扫描的操作,直至找到没有占用的端口
management:
endpoints:
web:
exposure:
include: "*"
#config:
# info: "这是从服务提供者nacos的配置的信息 ${spring.application.name}:${server.port}"
4.2 请求测试
4.3 查看sentinel的控制台
如上面的所示,出现了我们访问的记录以及其他的信息。
sentinel的功能很多,这里举一个例子。其他的配置请移步到:github.com/alibaba/Sen…
4.4 配置访问的限流
找到我们的配置,进行流控的配置:
配置成访问的限流问1 req/s;
配置完成的展示
4.5 请求测试
根据上面的图片信息,我们发现,在1s内,当请求数量超过1次的时候,就会返回给我们Blocked by Sentinel (flow limiting)这样的信息。说明我们的配置是生效的。
五、自定义的错误信息返回
根据前面阐述,返回的信息是Blocked by Sentinel (flow limiting)这样的信息,但是,有的时候,不想返回这样的自带的信息,那么这个时候,如何处理呢?
5.1 修改代码
@Slf4j
@RefreshScope
@RestController
public class NacosController {
@Value("${config.info}")
private String configInfo;
@SentinelResource(value = "getConfigInfo", blockHandler = "my_blockHandler")
@GetMapping("/getConfigInfo")
public String getConfigInfo() {
return configInfo;
}
// 限流返回的方法
public String my_blockHandler(BlockException blockException) {
return "你好,我是自定义的返回 "+ configInfo;
}
}
5.2 测试
首先我们发现,以前我们定义的限流规则没有了,是说明,我们的规则没有进行持久化的操作,后续的话,还是要进行之久化的。
新增我们的配置:
访问测试:
红色的部分就是我们的自定义的返回操作。
5.3 发生异常的时候,自定义的测试会有效果吗?
应当配置对应的策略,而且在@SentinelResource注解里面也有String fallback()这个属性,配置当发生错误的时候,应当如何的处理我们的业务的问题,如何进行降级的操作。
六、持久化的问题
正如前面的测试,我们重新启动的服务,配置的限流的规则以及其他的配置出现消失的问题。那如何进行配置持久化呢?目前,可以使用的持久化采用的是nacos辅助我们进行持久化。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
这个依赖就是负责我们持久化的操作的。
首先登录一下我们的nacos:
上面的配置管理也可以配置我们的限流规则。
6.1 修改我们的项目
bootstrap.yml
server:
port: 8001
spring:
application:
name: cloud-alibaba-prvider # 服务的名称
cloud:
nacos:
# 服务注册与发现的配置信息
discovery:
server-addr: 127.0.0.1:8848 # 服务的地址
#enabled: true # 是否进行服务注册与发现
#service: ${spring.application.name} # 服务的名字 默认 ${spring.application.name}
# 服务配置的配置信息
config:
server-addr: 127.0.0.1:8848 # 服务的地址
file-extension: yaml
#prefix: client # 默认 ${spring.application.name}
# cloud-alibaba-prvider-dev.yaml
sentinel:
transport:
dashboard: 127.0.0.1:8080 # 配置sentinel的 dashboard 的地址
port: 8791 # 默认的端口是 8791 如果被占用 将会进行 +1 的扫描的操作,直至找到没有占用的端口
# 增加数据源的配置
datasource:
ds1:
nacos:
server-addr: 127.0.0.1:8848
dataId: cloud-alibaba-prvider
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
management:
endpoints:
web:
exposure:
include: "*"
#config:
# info: "这是从服务提供者nacos的配置的信息 ${spring.application.name}:${server.port}"
上面的截图是我们修改的地方:
创建我们的新的配置:
里面的配置信息:
[
{
"resource":"getConfigInfo",
"limitApp":"default",
"grade":1,
"count":1,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
上面是配置的信息。
6.2 测试
重新启动项目。spring-cloud-alibaba-provider8001
访问几次看看,流控规则出现了:
配置的规则是生效的,说明持久化是配置也是生效的。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情