SpringCloud-Alibaba-Sentinel(1)初探
Sentinel 是什么?
Sentinel 具有以下特征:
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性:
Sentinel 的开源生态:
我们大概叙述后开始整合我们的分布式项目,我这里里为一个简单分布式项目,注册中心为Nacos,一个服务提供者(user-center)和一个服务消费者(content-center)
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors; @Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {
private final ShareMapper shareMapper;
private final RestTemplate restTemplate; public ShareDTO findById(Integer id) {
// 获取分享详情
Share share = this.shareMapper.selectByPrimaryKey(id);
// 发布人id
Integer userId = share.getUserId(); UserDTO userDTO = this.restTemplate.getForObject(
"http://user-center/users/{userId}",
UserDTO.class, userId
); ShareDTO shareDTO = new ShareDTO();
// 消息的装配
BeanUtils.copyProperties(share, shareDTO);
// shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
} }
可以看到我的content-center调用user-center/users服务
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/shares")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareConroller {
private final ShareService shareService; @GetMapping("/{id}")
public ShareDTO findById(@PathVariable Integer id) {
return this.shareService.findById(id);
}
}
我们现在只启动content-center不启动user服务,可想而知肯定报错,我们来看
没错500,找不到user-center服务,我们现在整合Sentinel,首先加入两个依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
和actuator配合使用,可通过http://localhost:8010/actuator/sentinel端点进行查看
{
"blockPage":null,
"appName":"content-center",
"consoleServer":"localhost:8333",
"coldFactor":"3",
"rules":{
"systemRules":[
],
"authorityRule":[
],
"paramFlowRule":[
],
"flowRules":[
],
"degradeRules":[
]
},
"metricsFileCharset":"UTF-8",
"filter":{
"order":-2147483648,
"urlPatterns":[
"/*"
],
"enabled":true
},
"totalMetricsFileCount":6,
"datasource":{
},
"clientIp":"192.168.2.29",
"clientPort":"8719",
"logUsePid":false,
"metricsFileSize":52428800,
"logDir":"/Users/zhangguowei/logs/csp/",
"heartbeatIntervalMs":10000
}
我们暂时先不要管这些是什么我们后面再详细阐述,从JSON的形式看不太方便,Sentinel为我们整合有UI界面
整合Sentinel可视化界面
下载 sentinel的jar包然后直接启动https://github.com/alibaba/Sentinel/releases
启动的时候可以自定义端口号
账号密码默认为sentinel,在项目的yml中加入
spring:
datasource:
url: jdbc:mysql://localhost:3306/content_center
hikari:
username: ***
password: ******
driver-class-name: com.mysql.cj.jdbc.Driver
cloud:
sentinel:
transport:
# 指向sentinel UI界面
dashboard: localhost:8333
nacos:
discovery:
# 指定nacos server的地址
server-addr: localhost:8848
application:
# 服务名称尽量用-,不要用_,不要用特殊字符
name: content-center
server:
port: 8010
management:
endpoints:
web:
exposure:
include: "*"
这个时候我们继续刚刚的500再执行几次会看到
相对于原来的Hystrix 的UI界面 Sentinel更人性化
他支持QPS的查看,请求时间等等
那么我们首先来探讨流控规则,我们现在把user服务也启动,我们点击簇点链路
可以看到content曾经访问过的路径,我们点击流控按钮,就可以为这路径设置流控规则
我们可以看到资源名默认为我们请求的路径,其实也不一定是路径,他只是做唯一标识,
针对来源:Sentinel可以针对调用者进行限流控制,比如两个服务调用content服务,我可以把针对来源写为A然后设置QPS的阈值为200,B为300QPS,也就是我当前访问的API接口对不同的服务有不同的限流规则,那么就可以用针对来源来设置,我们暂时用default,标识不区分来源,后面详细说如何区分来源。
阈值类型有两个选项,分别是QPS和线程数,如果选择QPS然后设置阈值,就是当这个API达到这个QPS阈值时会进行限流,同理也可以使用线程数限流,当达到一定的线程数的时候进行限流,是否集群我们在后面会详细探讨。
流控模式,sentinel提供了三种流控模式,我们先来看直接我们设置直接并保存
可以看到访问一次直接再次访问就直接限流了。那关联是什么意思,也就是说当关联的资源达到阈值,就限流自己,我们来尝试,刚刚上面所说我们可以用http://localhost:8010/actuator/sentinel 来查看信息,我们用/shares/1关联actuator/sentinel
它表示actuator/sentinel这个端点达到这个阈值那么就限流/shares/1这个路径,
我们来写段测试代码
import org.springframework.web.client.RestTemplate; public class SentinelTest { public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
for (int i = 0; i <10000 ; i++) {
String forObject = restTemplate.getForObject("http://localhost:8010/actuator/sentinel", String.class);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
}
理论上这样调用的话QPS肯定大于1,那么此时/shares/1会被限流
此时/shares/1会一直处于限流状态,他适用于什么场景:比如一个请求查询shares一个来修改shares处于高并发状态,查询过快的话会影响修改的性能,修改快的话会影响查询性能,所以这个时候可以根据业务场景,是希望优先读还是优先改,如果我们希望优先改,我们可以把关联的资源写成修改的API,资源名设置为查询API,这样修改超过阈值的话查询就会被限流。总的来说关联就是保护关联资源的设计。
我们继续来说第三个模式
点击链路会变成入口资源,链路:只记录指定链路上的流量,指定资源从入口资源进来的流量达到阈值就会限流,我们继续写代码来测试
这里用到@SentinelResource注解,后续我们会说到
我们访问后点击簇点链路
会发现有testa和testb
以及common
我们在common上面点击流控
我们把入口写testa
第一次请求正常请求
请求多次后直接500被限流而testb无论怎么请求都会正常请求,
这其实就是细粒度的针对来源,我们上面所说的针对来源是微服务级别而链路是API级别的。那现在我们三种流控模式都尝试完毕,我们恢复成直接状态,最后我们来探讨流控效果
快速失败很好理解,就是直接抛异常,在测试当中我们也看到了,他的源码在com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController 目录中
第二种叫Warm Up
什么意思呢?就是说sentinel也有个默认值为3,从阈值/3,经过预热时长,才到达设置的QPS阈值。也就是说,我把阈值设置为100我把预热时长设置为10秒
那么他就会用100除3作为最初的阈值,然后经过10秒之后才去达到这个100限流。比如有一个秒杀微服务,平常的并发并不是很高,但是在某一个瞬间,某一场秒杀活动开始,在开始的瞬间流量会激增,如果不做任何处理,可能服务一下就宕了,所以Sentinel设计Warm Up这种模式,可以让允许通过的流量缓慢的增加,在经过10秒之后才达到设定的阈值,这样就会更好的保护我们的微服务
相关源码在:com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
我们来看最后一种效果
这个是排队等待,这个也很好理解就是 匀速排队,让请求以均匀的速度通过,但是阈值的类型必须设置为QPS,否则都无效了
也就说比如我阈值100,60只允许阈值为100,其他的请求在后面排队直到设置的超时时间,如果过了超时时间求丢弃这次请求,这里我就不再做实验,他比较适用于突发流量场景,比如你的系统突然来了好多流量,一会就比较少,你希望应用在空闲的时候处理请求而不直接拒绝就可以使用排队等待。这个模式的源码路径为:
com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
暂时先说到这里 sentinel提供很多非常灵活,而且还有强大的限流规则。
SpringCloud-Alibaba-Sentinel(1)初探的更多相关文章
- SpringCloud Alibaba Sentinel 限流详解
点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 熔断规则 在上一篇文章中我们讲解了 ...
- Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探
目录 Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探 1. Sentinel 是什么? 2. Sentinel 的特征: 3. Sentinel 的开源生 ...
- SpringCloud Alibaba (三):Sentinel 流量控制组件
SpringCloud Alibaba (三):Sentinel 流量控制组件 Sentinel 是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 是面向分布式服务架构 ...
- SpringCloud Alibaba整合Sentinel
SpringCloud Alibaba整合Sentinel Sentinel 控制台 1. 概述 Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理.监控(单机和集群),规则 ...
- Alibaba Sentinel 限流与熔断初探(技巧篇)
目录 1.Sentinel 是什么 ?主要能解决什么问题? 2.限流与熔断的使用场景 3.Sentinel 源码结构 4.在 IntelliJ IDEA 中运行 Sentine Demo 温馨提示:源 ...
- Spring Cloud Alibaba | Sentinel: 服务限流基础篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...
- Spring Cloud Alibaba | Nacos服务中心初探
目录 Spring Cloud Alibaba | Nacos服务中心初探 1. 什么是Nacos? 1.1 Nacos 1.0 1.2 Nacos 2.0 2. Nacos 架构及概念 2.1 服务 ...
- Spring Cloud Alibaba | Sentinel: 服务限流高级篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战 在阅读本文前,建议先阅读<Spring Cloud Alibaba | Sentinel:分布式系 ...
随机推荐
- 天气预报API接口
原文:天气预报API接口 一.中央气象台API接口: 1. XML接口 http://flash.weather.com.cn/wmaps/xml/china.xml 这个是全国天气的根节点,列出所有 ...
- Xdite:永葆热情的上瘾式学习法(套路王:每天总结自己,反省自己的作息规律,找到自己的幸运时间、幸运方法,倒霉时间、倒霉方法。幸运是与注意力挂钩的。重复才能让自己登峰造极,主动去掉运气部分来训练自己。游戏吸引自己的几个原因非常适合训练自己)good
版权声明 本文首发自微信公共帐号: 学习学习再学习(xiaolai-xuexi) 无需授权即可转载, 甚至无需保留以上版权声明: 转载时请务必注明作者. 以下是<共同成长社区>第 58 次 ...
- SQL 时间格式化函数发布
SQL 时间格式化函数,有时候因某种需要需要格式化成需要的时间格式,需要的朋友可以收藏下,以备后用. SQL Server里面可能经常会用到的日期格式转换方法: sql server使用convert ...
- Delphi使用TObject类对象创建接受window消息(使用Classes.AllocateHWnd为对象创建一个尺寸为0的窗口,从而有了Handle)good
在delphi中,有时候我们希望对象可以接收windows消息,怎么办呢?因为要接收windows消息起码要有windows Handle,难道要建立的一个可见窗口?那样似乎太差强人意了.delphi ...
- <房间内功能>打赏小动画
截图如下 : 功能: 每次点击礼物,都要通过动画显示一个小图标,最多显示两行图标栏,送多次会显示然后再次显示,显示 XX 送给 XX 一个小礼物的动画样式.动画样式效果为,整体动画模 ...
- js一道面试题
题目是这样的,按照以下函数的结果写一个sub()方法: sub(1)(2)(3);/*return 6*/ sub(4)(3)(3);/*return 10*/ 我的山寨做法: function su ...
- [2017.02.05] 阅读《Efficient C++》思维导图
- Spring Cloud Ribbon配置详解
概述 有时候需要自定义Ribbon的配置和客户端超时配置. 自动化配置 /* 使用属性自定义功能区客户端 从版本1.2.0开始,Spring Cloud Netflix现在支持使用属性与Ribbon文 ...
- 3013C语言_输入输出
第三章 输入输出 3.1输入输出概念及其实现 (1)数据从计算机内部向外部输出设备(如显示器.打印机等)输送的操作称为 “输出”,数据从计算机外部向输入设备(如键盘.鼠标.扫描仪等)送入的操作称为 “ ...
- vue-cli3.x npm create projectName 报错: Unexpected end of JSON input while parsing near......
npm 版本与node版本还有webpack版本之间的问题 清理缓存,“ npm cache clean --force " 一切OK