SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控

这篇具有很好参考价值的文章主要介绍了SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringCloudAlibaba–Sentinel

Sentinel被称为分布式系统的流量防卫兵,是阿里开源流量框架,从服务限流、降级、熔断等多个纬度保护服务。Sentinel同时提供了简洁易用的控制台,可以看到接入应用的秒级数据,并可以在控制台设置一些规则保护应用。它比Hystrix支持的范围广泛,如Spring Cloud、Dubbo、gRPC都可以整合。集成简单,只需少量的配置和代码就可以完成,容易完成自己定制化的逻辑。

  • 资源是Sentinel最关键的概念,遵循Sentinel API的开发规范定义资源,就能将应用保护起来。

  • 规则可以通过控制面板配置,也可以和资源联合起来,规则可以在控制台修改并且即时生效。

名词解释

  • 限流:对某个资源的访问数量做限制,不让流量一窝蜂地挤进资源访问
  • 降级:即使系统出现问题情况下,也要尽可能提供服务,在可用和完全不可用之间找一个平衡点,如返回友好提示。
  • 熔断:是一种资源访问的状态,熔断状态时,直接拒绝所有的访问,返回友好提示

同类产品对比

基础特性 Sentinel Hystrix Resilience4j
限流 QPS、线程数、调用关系 有限的支持 Rate Limiter
注解支持 支持 支持 支持
动态规则配置 支持多种数据源 支持多种数据源 有限支持数据源
熔断降级策略 平均响应时间、异常比例、异常数 异常比例 平均响应时间、异常比例
控制台 配置各种规则 简单监控 无控制台
常用适配框架 Servlet、SpringCloud、Dubbo、gRPC Servlet、Spring CloudNetflix SpringBoot、Cloud

Resilience4j在国外使用较多,而Hystrix框架已经停止更新进入维护了。

下载和运行

按照笔者之前的笔记,SpringCloudAlibaba是选择的2021.0.4.0版本的,那么可以看下它们之间的版本对应关系

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

选择这个1.8.5版本即可,到sentinel的下载页面选择即可https://github.com/alibaba/Sentinel/releases

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

下载完毕后的jar包启动即可

java -jar sentinel-dashboard-1.8.5.jar

默认的端口是8080,如需更改命令行添加即可

java -jar -Dserver.port=9090 sentinel-dashboard-1.8.5.jar

启动后,打开http://localhost:8080/,账号和密码都是sentinel

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

进入后发现没有任何的资源可以进行规则控制。sentinel是采用的懒加载的方式,当使用时才会进行加载。

集成Sentinel

生产者

项目中引入依赖

<dependencies>
    <!-- 服务注册  服务发现需要引入的 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!--健康监控-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

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

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

</dependencies>

bootstrap.yml中做配置

server:
  port: 8002
spring:
  application:
    name: provider # 应用名

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos服务地址
    sentinel:
      transport:
        port: 8719 # 启动http server,并且该服务与Sentinel仪表板进行交互,使sentinel可以控制应用,若端口占用则8719+1依次扫描
        dashboard: 127.0.0.1:8080 # 仪表版访问地址

java controller做个资源

@RestController // @RestController注解是@Controller+@ResponseBody
public class TestController {

    @RequestMapping("/test")
    public String test() {
        return "sentinel-provider8002 test()" + RandomUtils.nextInt(0, 1000);
    }
}

消费者

同生产者引入依赖,做好配置,再到controller做个资源

使用RestTemplate+Ribbon做远程调用,添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

javaConfig配置

@Configuration
public class GenericConfiguration { // 常规配置类
    @LoadBalanced // 标注此注解后,RestTemplate就具有了客户端负载均衡能力
    @Bean
    public RestTemplate restTemplate(){ // 创建RestTemplate,并交个Spring容器管理
        return new RestTemplate();
    }
}
@RestController // @RestController注解是@Controller+@ResponseBody
public class TestController {
    private final String SERVER_URL = "http://provider";
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/test")
    public String test() {
        return restTemplate.getForObject(SERVER_URL + "/test", String.class);
    }
    @RequestMapping("/sentinelTest")
    public String sentinelTest() {
        return "sentinel-consumer9001 sentinelTest" + RandomUtils.nextInt(0, 1000);
    }

}

完成后,启动项目调用生产者的test接口,然后到sentinel控制台。

curl localhost:9001/test
==> sentinel-provider8002 test()599

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

两个服务都出现在了控制台上。

Sentinel常用控制规则

我们需要对接口进行压测,所以使用jmeter吧,到jmter官方下载即可。

流控规则

流控主要是设置QPS或线程数等参数保护应用,针对某个资源的设置,下面操作sentinel控制台设置一些规则。

注意:要先调用接口后,才能添加规则(s加载)

QPS–直接–快速失败

QPS:(Query Per Second)指每秒可处理的请求数

在簇点链路–>列表视图–>到/sentinelTest资源点击流控,阈值选择QPS,单机阈值1,新增。

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

打开jmeter压测:

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

查看执行结果

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

10个请求也就两个成功了,其他都被限流了,直接blocked

QPS–直接–WarmUp

数据预热,即初始请求QPS等于阈值/codeFactor,codeFactor默认值3,经过预热时长1s后单机阈值变为100

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

压测数量100

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

看结果

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

前期接口正常返回,当访问量越来越多时,请求QPS=codeFactor(3)时,其他访问直接回绝,经过1s的预热,QPS变成了100后,后面的的所有请求全部正常访问。

QPS–直接–排队等待

让请求全部均匀访问通过,如果请求量超过阈值就等待,若等待超时就返回失败。

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

虽然QPS单机阈值是1,但是我们的超时时间为15s,所以等得起访问全部成功。

QPS–关联–快速失败

如果访问B接口到达了阈值,那么就让A接口返回失败。适用于资源之间有资源竞争或依赖关系。

再写一个接口sentinelTestB

@RequestMapping("/sentinelTestB")
public String sentinelTestB() {
    return "sentinel-consumer9001 sentinelTestB" + RandomUtils.nextInt(0, 1000);
}

设置规则,要注意当我们重启项目后,这些接口需要重新访问一遍才会出现在sentinel的簇点链路中

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

jmter不停访问/sentinelTestB,让B接口超过达阈值,然后在去调用/sentinelTest时直接回绝访问

因为sentinelTestB是没有做流控的,所以请求都是成功的,但是因为访问B接口的请求数是超过QPS阈值的,那么A接口则直接失败。

curl localhost:9001/sentinelTest
Blocked by Sentinel (flow limiting)

线程数–直接

限制处理请求的业务线程数,达到阈值就限流

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控,Java,SpringCloud,SpringBoot,springcloud,sentinel

可以看到很多请求都被限流了,这个跟服务器的配置有关,当服务器的配置较好时,可以适当将阈值设置的高一些,保证资源的访问情况。文章来源地址https://www.toymoban.com/news/detail-602774.html

控制台几个关键词

  • 资源名:就是接口的资源,名称唯一即可
  • 针对来源:此资源对调用者进行限流,默认defatult,对所有客户端限流;可填写调用者的spring.application.name指定对某个客户端进行限流。
  • 阈值类型:QPS:每秒能接受的请求数量,线程数:能够使用的业务线程数(服务器内部的线程数)
  • 流控模式:
    • 直接:达到条件,直接执行某个流控效果
    • 关联:如果关联资源达到条件,直接限流自身
    • 链路:记录从入口资源的流量,达到条件也只限流入口资源
  • 流控效果:
    • 快速失败:达到条件,直接返回失败
    • WarmUp:预热,给一个缓冲时间,缓慢增加阈值
    • 排队等待:让系统匀速处理请求,其他请求进入等待,超时后未被处理的请求直接返回失败

到了这里,关于SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 微服务实战系列之ZooKeeper(中)

    微服务实战系列之ZooKeeper(中)

    昨日博主的第一篇 ZooKeeper ,对它自身具备的能力做了初步介绍。书接上文,马不停蹄,我们继续挖掘它内在的美,充分把握它的核心与脉络。 Q:集群一致性协同是如何进行的 我们讲到分布式,一般是在集群环境下实现的。以ZooKeeper为例,它是如何保障集群环境下的成功运

    2024年02月04日
    浏览(10)
  • 微服务实战系列之Cache(技巧篇)

    微服务实战系列之Cache(技巧篇)

    凡工具必带使用说明书,如不合理的使用,可能得到 “意外收获” 。这就好比每个人擅长的领域有所差异,如果放错了位置或用错了人,也一定会让 Leader 们陷入两难之地: “上无法肩负领导之重托,下难免失去伙伴之信任” ,最终的结局大致是 不欢而散 。 通过前序系列

    2024年02月03日
    浏览(11)
  • 微服务实战系列之ZooKeeper(实践篇)

    微服务实战系列之ZooKeeper(实践篇)

    关于 ZooKeeper ,博主已完整的通过庖丁解牛式的 “解法” ,完成了概述。我想掌握了这些基础原理和概念后,工作的问题自然迎刃而解,甚至offer也可能手到擒来,真实一举两得,美极了。 为了更有直观的体验,强化概念,博主特别献上一篇实践文章。理论联系实践,才能学

    2024年01月21日
    浏览(19)
  • 微服务实战系列之J2Cache

    微服务实战系列之J2Cache

    经过近几天陆续发布 Cache 系列博文,博主已对业界主流的缓存工具进行了基本介绍,当然也提到了一些基本技巧。相信各位盆友看见这么多 Cache 工具后,在选型上一定存在某些偏爱: A同学说:不管业务千变万化,我对Redis的爱永不变。 B同学说:不管集中式还是分布式,单

    2024年02月04日
    浏览(10)
  • 《学成在线》微服务实战项目实操笔记系列(P92~P120)【下】

    《学成在线》微服务实战项目实操笔记系列(P92~P120)【下】

    史上最详细《学成在线》项目实操笔记系列【下】,跟视频的每一P对应,全系列18万字,涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳,参考这篇,相信会带给你极大启发。 4.1 (课程发布)模块需求 P92 课程预览:在发布课程之前需要预览一下,看最终的效果有没

    2024年02月19日
    浏览(14)
  • k8s实战从入门到上天系列第一篇:K8s微服务实战内容开篇介绍

            我们使用开源ruoyi微服务基本使用,基于基本的微服务实践。我们来讲解k8s的实战内容。         第一章:开源ruoyi微服务简介基本使用         第二章:k8s基本知识回顾、k3s集群搭建和基本使用         第三章:微服务镜像构建         第四章:中间件镜像构建

    2024年02月01日
    浏览(11)
  • 【微服务实战之Docker容器】第四章-【微服务实战之Docker容器】第三章-镜像仓库

    【微服务实战之Docker容器】第四章-【微服务实战之Docker容器】第三章-镜像仓库

    【微服务实战之Docker容器】第一章-下载及安装 Docker挂载主机目录访问如果出现cannot open directory .: Permission denied解决办法: 在挂载目录后多加一个–privileged=true参数即可 如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的

    2024年02月07日
    浏览(13)
  • Docker微服务实战

    Docker微服务实战

    业务需求 利用Docker部署应用服务,实现在网页端通过输入地址 ip:端口/hello/docker,页面显示hello docker ! IDEA编写代码 创建springboot项目 网上很多教程,此步骤省略… 项目的目录结构 控制层代码 application.properties 配置信息 启动类自动生成无需改动 POM.XML代码 测试代码是否能够正

    2024年02月11日
    浏览(9)
  • 【微服务实战】01-工程结构概览

    领域模型层 基础设施层 ⇒ 仓储 应用层 ⇒ Api、后台任务Job 共享层 总结 领域模型专注业务的设计,不依赖仓储等基础设施层 基础设施的仓储层仅负责领域模型的取出和存储 使用CQRS模式设计应用层 Web Api是面向前端的交互的接口,避免依赖领域模型 将共享代码设计为共享包

    2024年02月12日
    浏览(7)
  • 《微服务实战》 第十三章 JWT

    《微服务实战》 第十三章 JWT

    【项目实战】Spring boot整合JWT、Vue案例展示用户鉴权 【微服务实战】JWT JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。 基于JSON的开发标准 用户信息加密到token里,服务器不保存任何用户信息 在传统的用户登录认证中,因为http是无状态的,所以都是采用session方式

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包