Sentinel 是什么?

Sentinel 具有以下特征:

丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel 的主要特性:

Sentinel 的开源生态:

我们大概叙述后开始整合我们的分布式项目,我这里里为一个简单分布式项目,注册中心为Nacos,一个服务提供者(user-center)和一个服务消费者(content-center)

  1. import lombok.RequiredArgsConstructor;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.beans.BeanUtils;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.cloud.client.ServiceInstance;
  6. import org.springframework.cloud.client.discovery.DiscoveryClient;
  7. import org.springframework.http.ResponseEntity;
  8. import org.springframework.stereotype.Service;
  9. import org.springframework.web.client.RestTemplate;
  10.  
  11. import java.util.List;
  12. import java.util.concurrent.ThreadLocalRandom;
  13. import java.util.stream.Collectors;
  14.  
  15. @Slf4j
  16. @Service
  17. @RequiredArgsConstructor(onConstructor = @__(@Autowired))
  18. public class ShareService {
  19. private final ShareMapper shareMapper;
  20. private final RestTemplate restTemplate;
  21.  
  22. public ShareDTO findById(Integer id) {
  23. // 获取分享详情
  24. Share share = this.shareMapper.selectByPrimaryKey(id);
  25. // 发布人id
  26. Integer userId = share.getUserId();
  27.  
  28. UserDTO userDTO = this.restTemplate.getForObject(
  29. "http://user-center/users/{userId}",
  30. UserDTO.class, userId
  31. );
  32.  
  33. ShareDTO shareDTO = new ShareDTO();
  34. // 消息的装配
  35. BeanUtils.copyProperties(share, shareDTO);
  36. // shareDTO.setWxNickname(userDTO.getWxNickname());
  37. return shareDTO;
  38. }
  39.  
  40. }

可以看到我的content-center调用user-center/users服务

  1. import lombok.RequiredArgsConstructor;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7.  
  8. @RestController
  9. @RequestMapping("/shares")
  10. @RequiredArgsConstructor(onConstructor = @__(@Autowired))
  11. public class ShareConroller {
  12. private final ShareService shareService;
  13.  
  14. @GetMapping("/{id}")
  15. public ShareDTO findById(@PathVariable Integer id) {
  16. return this.shareService.findById(id);
  17. }
  18. }

我们现在只启动content-center不启动user服务,可想而知肯定报错,我们来看

没错500,找不到user-center服务,我们现在整合Sentinel,首先加入两个依赖

  1. <dependency>
  2.    <groupId>org.springframework.cloud</groupId>
  3.    <artifactId>spring-cloud-alibaba-sentinel</artifactId>
  4. </dependency>
  5. <dependency>
  6.    <groupId>org.springframework.boot</groupId>
  7.    <artifactId>spring-boot-starter-actuator</artifactId>
  8. </dependency>

和actuator配合使用,可通过http://localhost:8010/actuator/sentinel端点进行查看

  1. {
  2.    "blockPage":null,
  3.    "appName":"content-center",
  4.    "consoleServer":"localhost:8333",
  5.    "coldFactor":"3",
  6.    "rules":{
  7.        "systemRules":[

  8.       ],
  9.        "authorityRule":[

  10.       ],
  11.        "paramFlowRule":[

  12.       ],
  13.        "flowRules":[

  14.       ],
  15.        "degradeRules":[

  16.       ]
  17.   },
  18.    "metricsFileCharset":"UTF-8",
  19.    "filter":{
  20.        "order":-2147483648,
  21.        "urlPatterns":[
  22.            "/*"
  23.       ],
  24.        "enabled":true
  25.   },
  26.    "totalMetricsFileCount":6,
  27.    "datasource":{

  28.   },
  29.    "clientIp":"192.168.2.29",
  30.    "clientPort":"8719",
  31.    "logUsePid":false,
  32.    "metricsFileSize":52428800,
  33.    "logDir":"/Users/zhangguowei/logs/csp/",
  34.    "heartbeatIntervalMs":10000
  35. }

我们暂时先不要管这些是什么我们后面再详细阐述,从JSON的形式看不太方便,Sentinel为我们整合有UI界面

整合Sentinel可视化界面

下载 sentinel的jar包然后直接启动https://github.com/alibaba/Sentinel/releases

启动的时候可以自定义端口号

账号密码默认为sentinel,在项目的yml中加入

  1. spring:
  2. datasource:
  3.   url: jdbc:mysql://localhost:3306/content_center
  4.   hikari:
  5.     username: ***
  6.     password: ******
  7.     driver-class-name: com.mysql.cj.jdbc.Driver
  8. cloud:
  9.   sentinel:
  10.     transport:
  11.        # 指向sentinel UI界面
  12.       dashboard: localhost:8333
  13.   nacos:
  14.     discovery:
  15.        # 指定nacos server的地址
  16.       server-addr: localhost:8848
  17. application:
  18.    # 服务名称尽量用-,不要用_,不要用特殊字符
  19.   name: content-center
  20. server:
  21. port: 8010
  22. management:
  23. endpoints:
  24.   web:
  25.     exposure:
  26.       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这个路径,

我们来写段测试代码

  1. import org.springframework.web.client.RestTemplate;
  2.  
  3. public class SentinelTest {
  4.  
  5. public static void main(String[] args) {
  6. RestTemplate restTemplate = new RestTemplate();
  7. for (int i = 0; i <10000 ; i++) {
  8. String forObject = restTemplate.getForObject("http://localhost:8010/actuator/sentinel", String.class);
  9. try {
  10. Thread.sleep(500);
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15.  
  16. }
  17. }

理论上这样调用的话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)初探的更多相关文章

  1. SpringCloud Alibaba Sentinel 限流详解

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 熔断规则 在上一篇文章中我们讲解了 ...

  2. Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探

    目录 Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探 1. Sentinel 是什么? 2. Sentinel 的特征: 3. Sentinel 的开源生 ...

  3. SpringCloud Alibaba (三):Sentinel 流量控制组件

    SpringCloud Alibaba (三):Sentinel 流量控制组件 Sentinel 是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 是面向分布式服务架构 ...

  4. SpringCloud Alibaba整合Sentinel

    SpringCloud Alibaba整合Sentinel Sentinel 控制台 1. 概述 Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理.监控(单机和集群),规则 ...

  5. Alibaba Sentinel 限流与熔断初探(技巧篇)

    目录 1.Sentinel 是什么 ?主要能解决什么问题? 2.限流与熔断的使用场景 3.Sentinel 源码结构 4.在 IntelliJ IDEA 中运行 Sentine Demo 温馨提示:源 ...

  6. Spring Cloud Alibaba | Sentinel: 服务限流基础篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...

  7. Spring Cloud Alibaba | Nacos服务中心初探

    目录 Spring Cloud Alibaba | Nacos服务中心初探 1. 什么是Nacos? 1.1 Nacos 1.0 1.2 Nacos 2.0 2. Nacos 架构及概念 2.1 服务 ...

  8. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...

  9. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 ...

  10. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战 在阅读本文前,建议先阅读<Spring Cloud Alibaba | Sentinel:分布式系 ...

随机推荐

  1. SQL Server 2016新特性:DROP IF EXISTS

    原文:SQL Server 2016新特性:DROP IF EXISTS  在我们写T-SQL要删除某个对象(表.存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如: 旧 ...

  2. SignalR的简单实现(一)

    原文:SignalR的简单实现(一) ASP.NET SignalR是ASP.NET开发人员的一个新库,它使您的应用程序添加实时Web功能变得非常简单.什么是"实时网络"功能?能够 ...

  3. 浅谈Linux(Centos7.4)环境下NTP服务器的构建

     一.软件环境 1.操作系统版本 [root@Geeklp201 etc]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core ...

  4. <第三方>TGRefreshO按照QQ的刷新方式下拉刷新

    一 .使用方法:   刷新机制,类似QQ一样的刷新机制,弹簧.橡皮筋下拉刷新控件,类似QQ下拉刷新效果,同时支持其他样式:   首先写上这一句(必须的)   #import <TGRefresh ...

  5. tortoisegit密码找回之抓包法

    因为一直用tortoisegit记住密码(此方法只适用于tortoisegit有记住密码),昨天需要登陆gitlab发现密码忘记了,用了N个常用默认密码都不对:和度娘交流一会儿也无果,gitlab里的 ...

  6. ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程

    在前面随笔介绍的<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>里面,介绍了如何改进和完善审计日志和登录日志的应用服务端和Winform客户端,由于篇幅限制,没有进 ...

  7. 电商、P2P等大型互联网系统包含哪些业务模块?

    01 前言 在互联网飞速发展的时代,各大互联网公司正在进行激烈的竞争,业务模式也在不断的扩张,这种现状使得目前各大公司的架构系统面临着极大的挑战,而对于我们普通的软件开发者而言,如果你仅仅了解过一些关 ...

  8. Laravel --- 查询字段中使用表达式

    比如: select id, name, count(post) from ... 在laravel中: $user = $this ->select( 'id', 'name', DB::ra ...

  9. 软件测试入门-测试模型(V型 W型 H型)

    软件测试工程师称为“QA”,质量保证者——这是入门的第一点要学习的. 首先看基本的测试模型 1.“V”型 特点:[活动串行]这是一种古老的瀑布模型,反映了实际和测试之间的关系. 局限:仅仅把测试过程作 ...

  10. spring与springmvc父子容器

    转载地址:http://www.tianshouzhi.com/api/tutorials/spring 1.spring和springmvc父子容器概念介绍 在spring和springmvc进行整 ...