SpringCloud Alibaba五大组件之——Sentinel

SpringCloud Alibaba五大组件之——Sentinel(文末附有完整项目GitHub链接)

  • 前言
  • 一、什么是Sentinel
  • 二、Sentinel控制台
    • 1.下载jar包
    • 2.自己打包
    • 3.启动控制台
    • 4.浏览器访问
  • 三、项目中引入Sentinel
    • 1.在api-service模块的pom文件引入依赖:
    • 2.application.yml
    • 3.补充:jvm启动参数
    • 4.编写简单的测试程序
    • 5.@SentinelResource注解
    • 6.其他方式
  • 四、规则讲解
    • 1.代码中硬编码
    • 2.控制台配置(生产环境中不推荐)
      • (1)左侧菜单栏添加
      • (2)簇点链路中添加
    • 3.为何不推荐控制台中添加
  • 五、生产环境下,规则集成Nacos
    • 1.引入依赖
    • 2.Nacos中新增config
    • 3.application.yml文件修改
    • 4.重启
  • 六、结语

前言

前文,我们已经介绍了SpringCloud Alibaba五大组件中的两个:dubbo和nacos,文章连接:太细了有手就行,SpringCloud Alibaba+Nacos+Dubbo整合,有需要的可以去查阅。
ps:本文用到的项目demo也是基于这篇文章去扩展的,包括模块结构和版本依赖等等。

一、什么是Sentinel

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

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

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

  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。

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

Sentinel 的主要特性:
在这里插入图片描述
上面内容都是引用于官网

二、Sentinel控制台

官方提供两种方式跑控制台,我建议没有特殊需求下,通通用第一种就行

1.下载jar包

打来Sentinel的官网:https://github.com/alibaba/Sentinel/releases,找到自己需要的版本下载,本文编写时最高版本是1.8.8,本文用的是1.8.6版本
在这里插入图片描述

版本问题作者这里再啰嗦一句,一定要选对,因为我这一系列文章,SpringCloud alibaba定的是2021.0.6.0,所以一切版本如下图来选,直接毕业版本。
在这里插入图片描述

2.自己打包

下载整个工程,用mvn clean package打成jar包

3.启动控制台

打开cmd,进入jar包的目录,执行一下代码:

java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

其中 -Dserver.port=8180 用于指定 Sentinel 控制台端口为 8180,默认8080
dashboard.server:网页的端口,客户端必须按指定的访问,也可以省略,默认是127.0.0.1:8080

4.浏览器访问

访问:http://localhost:8180,默认账户和密码都是sentinel
在这里插入图片描述
登录,显示这个界面则成功
在这里插入图片描述

三、项目中引入Sentinel

1.在api-service模块的pom文件引入依赖:

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

2.application.yml

修改配置文件,新加如下配置:

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8180

此处的port,默认是8179,主要就是项目启动后,会自行启动一个HTTP server,通过这个端口和sentinel客户端进行交互,来传输数据。
dashboard: localhost:8180,这个要和上一步启动sentinel控制台时候的ip端口一致。

3.补充:jvm启动参数

只要你前面配置和项目都正确,这一步可以省略,但是如果你项目启动,sentinel控制台服务注册不上,你就jvm加入下面参数:

-Dcsp.sentinel.dashboard.server=127.0.0.1:8180

4.编写简单的测试程序

controller:

@RestController
@RequestMapping("/testSentinel")
public class SentinelController {

    @Resource
    UserInfoService userInfoService;

    @RequestMapping("/one")
    public void testThree() {
        userInfoService.testSentinel();
    }
}

service:

@Service
public class UserInfoServiceImpl{

    @Override
    @SentinelResource(value = "testSentinel", blockHandler = "testBlockHandler", fallback = "testFallback")
    public void testSentinel() {
        System.out.println("testSentinel");
        //这行代码是为了测试报错熔断,如果只是流控测试,此行代码可以屏蔽
        //int a = 1/0;
    }

    public void testBlockHandler(BlockException ex) {
        System.out.println("进入testBlockHandler");
    }

    public void testFallback(Throwable e) {
        System.out.println("进入testFallback");
        e.printStackTrace();
    }
}

浏览器访问一下接口
查看控制台,这里可以看到我们的测试接口,项目已经集成好了sentinel
在这里插入图片描述
PS:1.因为sentinel是懒加载,这里一定要浏览器随便访问一个接口,不然服务注册不上,也可以添加配置:spring.cloud.sentinel.eager:true实现服务器启动了自动心跳注册。
2.访问了要等个几秒钟,有延迟,刷新一下就能看到了。

5.@SentinelResource注解

常用的几个注解参数:

  • value:定义资源名
  • blockHandler:会在原方法被限流/降级/系统保护的时候调用,记得方法定义在同一个类中
  • fallback: 会针对所有类型的异常,出现时调用
  • defaultFallback:全局默认出异常时候调用,定义了fallback,则此参数不生效

6.其他方式

当然除了注解之外,还提供了其他编码方式去控制一段代码或者一个方法的访问,比如最常见的SphU.entry,大家也可以去官网上查阅根据需求选择

try {
  // 资源名可使用任意有业务语义的字符串,注意数目不能太多(超过 1K),超出几千请作为参数传入而不要直接作为资源名
  // EntryType 代表流量类型(inbound/outbound),其中系统规则只对 IN 类型的埋点生效
  entry = SphU.entry("自定义资源名");
  // 被保护的业务逻辑
  // do something...
} catch (BlockException ex) {
  // 资源访问阻止,被限流或被降级
  // 进行相应的处理操作
} catch (Exception ex) {
  // 若需要配置降级规则,需要通过这种方式记录业务异常
  Tracer.traceEntry(ex, entry);
} finally {
  // 务必保证 exit,务必保证每个 entry 与 exit 配对
  if (entry != null) {
    entry.exit();
  }
}

四、规则讲解

这里会讲几个常用的配置,其余的配置大家可以去官方查看:sentinel官网,配置规则主要有两种方式,第一种是代码中硬编码,第二种是通过控制台配置的形式

1.代码中硬编码

先介绍下,java代码中的几个规则对象:

  • DegradeRule:熔断降级,主要是当一个接口不可访问后,进行的一系列操作,避免所有请求堵塞
  • AuthorityRule: 授权规则(来源访问),判断来源请求是否放行,常用的场景是黑白名单
  • FlowRule: 流量控制规则,监控QPS,避免系统被瞬时的流量高峰冲垮
  • ParamFlowRule: 热点参数限流,可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效
  • SystemRule:系统保护规则,当系统负载高于某个阈值,就禁止或者减少流量的进入;当 load 开始好转,则恢复流量的进入

当然还有网关控制和集群流量控制,这两者在代码中无法实现,只有通过控制台配置。
我们就拿熔断规则来举例,在service中,增加如下规则初始化方法:

    @PostConstruct
    public void initRule() {
        //熔断规则: 5s内调用接口出现异常次数超过5的时候, 进行熔断
        List<DegradeRule> degradeRules = new ArrayList<>();
        DegradeRule rule = new DegradeRule();
        rule.setResource("testSentinel");
        rule.setCount(5);
        //统计时长
        rule.setStatIntervalMs(5000);
        rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);//熔断规则
        //熔断时长
        rule.setTimeWindow(10);
        degradeRules.add(rule);
        DegradeRuleManager.loadRules(degradeRules);
    }

大家可以在文末获取代码自行去测试。

2.控制台配置(生产环境中不推荐)

控制台中我们有两种方式去添加流控规则
第一种方式:

(1)左侧菜单栏添加

在这里插入图片描述
在这里插入图片描述
注意这里的资源名,和我们代码中的资源名要匹配,不然配置不会生效。

(2)簇点链路中添加

在这里插入图片描述
在这里插入图片描述
在链路中添加,可以保证我们的资源名是一定存在的,两种添加方式,你自己选择喜欢的。

3.为何不推荐控制台中添加

因为控制台中添加规则,会推送到项目的内存中,重启就没了,不能持久化,所以在生产环境中不推荐,总不能你每次重启项目都要单独配置一次。

五、生产环境下,规则集成Nacos

生产环境下,都用的Nacos统一管理规则,就是常说的push规则,通过Nacos推送到sentinel控制台,然后再更新到项目中。这样即使项目重启,只要Nacos还在,配置就是接近持久化的状态。

1.引入依赖

由于spring-cloud-starter-alibaba-sentinel 的Maven依赖并没有引入Nacos相关的,所以我们要单独引入依赖:

  <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-nacos</artifactId>
  </dependency>

2.Nacos中新增config

新增一个流量控制的config
在这里插入图片描述
选取json格式:

[
    {
        "resource": "testSentinel",
        "limitApp": "default",
        "grade": 1,
        "count": 2,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]
  • resource:资源名,即限流规则的作用对象
  • limitApp:流控针对的调用来源,若为 default 则不区分调用来源
  • grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
  • count:限流阈值
  • strategy:调用关系限流策略
  • controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
  • clusterMode:是否为集群模式

3.application.yml文件修改

在前面的基础上,新增datasource的配置:
注意,这里的nacos一定要和上一步新增的对应,

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8180
      datasource:
        ds:
          nacos:
            server-addr: 172.16.72.132:8848
            data-id: sentinel-rule
            namespace: 76dae550-4133-44d8-b591-dc82f5f97b6e
            group-id: SENTINEL_PROVIDER_GROUP
            username: nacos
            password: nacos
            data-type: json
            rule-type: flow

由于spring.cloud.sentinel.datasource属性对应的是一个Map,所以它的需要自定义指定Map的KEY,下面的配置中ds就作为KEY,然后后面就可以配置不同的数据源

4.重启

重启后,查看sentinel控制台,可以看到我们在nacos定义的规则在这里插入图片描述
测试一下新加的流控规则,我们是定义的qps不超过2,超过的请求全部拒绝(默认),这里补充一下拒绝策略。

  • 快速失败:超过设置阈值的请求全部拒绝,请求失败
  • Warm Up :
  • 排队等待:

在这里插入图片描述
可以看到,标记1和标记2都能正常打印,当第三个请求来了的时候,“进入testFallback”就不打印了,转而进入了blockHandler方法,说明流控是生效了的。

六、结语

到这里,SpringCloud alibaba五大组件之一的流控熔断降级sentinel就讲解完了,欢迎大家评论区指点,后面还剩两个组件:分布式队列RocketMQ和分布式事务Seata,RocketMQ可能会找个时间再写一篇文章,但是Seata的话,如果项目比较庞大,加上事务会顶不住,qps明显降低很多,我一个阿里工作的朋友给我谈过,他们项目组的微服务,都是裸奔的没有用事务,所以这文章我再考虑出不出,其实本文项目中的一个分支seata,我是已经实现了整合的,但是感觉生产环境中又不试用,就没有发出来,后面看情况吧
附上项目GitHub链接:https://github.com/wangqing-github/DubboAndNacos/tree/sentinel,选取sentinel分支。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883264.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

<Java>String类型变量的使用

两边有一个string就是连接&#xff0c;否则做加法 ‘ ’是char&#xff0c;“ ”是string&#xff0c;char能做加法&#xff0c;string只能连接

R包:ggheatmap热图

加载R包 # devtools::install_github("XiaoLuo-boy/ggheatmap")library(ggheatmap) library(tidyr)数据 set.seed(123) df <- matrix(runif(225,0,10),ncol 15) colnames(df) <- paste("sample",1:15,sep "") rownames(df) <- sapp…

NLP技术在营业选址中的实践与探索

传统营业选址面临的问题 在电信业务的服务流程中&#xff0c;用户装机地址的准确性和清晰度对于整个服务体验和运营效率起着至关重要的作用。然而&#xff0c;在实际操作中&#xff0c;装机地址的确定往往面临诸多挑战&#xff0c;这些问题不仅影响用户的服务体验&#xff0c;也…

wireshark使用要点

目录 IP过滤 端口过滤 内容过滤 过滤udp 过滤tcp IP过滤 ip.src XXX.XXX.XXX.XXX 只显示消息源地址为XXX.XXX.XXX.XXX的信息 ip.dst XXX.XXX.XXX.XXX 只显示消息目的地址为XXX.XXX.XXX.XXX的信息 ip.addr XXX.XXX.XXX.XXX显示消息源地址为XXX.XXX.XXX.XXX&#xff0…

通过 OBD Demo 体验 OceanBase 4.3 社区版

本文作者&#xff1a;马顺华 引言 OceanBase 4.3 是一个专为实时分析 AP 业务设计的重大更新版本。它基于LSM-Tree架构&#xff0c;引入了列存引擎&#xff0c;实现了行存与列存数据存储的无缝整合。这一版本不仅显著提升了AP场景的查询性能&#xff0c;同时也确保了TP业务场景…

抽象类、比较器和接口

一.抽象类 1.抽象类的概念&#xff1a;如果一个类中没有包含足够的信息来描述一个具体的对象&#xff0c;这样的类就是抽象类。&#xff08;图例说明&#xff1a;&#xff09; 2.抽象方法的概念&#xff1a;当一个方法被abstract来修饰&#xff0c;此时代表着这个方法可以不进…

leetcode-189:轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

毕业设计选题:基于ssm+vue+uniapp的自助购药小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

828华为云征文|使用Flexus X实例集成ES搜索引擎

目录 一、应用场景 1.1 Flexus X实例概述 1.2 ES搜索引擎 二、安装相关服务 2.1 安装Elasticsearch7.17.0 2.2 安装kibana7.17.0 三、开通安全组规则 四、整体感受 4.1 Flexus X实例 4.2 使用感觉 一、应用场景 1.1 Flexus X实例概述 Flexus X实例是华为云推出的一款…

Cisco Packet Tracer的安装加汉化

这个工具学计算机网络的同学会用到 1.下载安装 网盘链接&#xff1a;https://pan.baidu.com/s/1CmnxAD9MkCtE7pc8Tjw0IA 提取码&#xff1a;frkb 点击第一个进行安装&#xff0c;按步骤来即可。 2.汉化 &#xff08;1&#xff09;复制chinese.ptl文件 &#xff08;2&…

Redisson分布式锁的概念和使用

Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁&#xff1f;1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff…

如何在 macOS 上恢复未保存的 Excel 文件 – 文件恢复的最佳方法

Microsoft Excel 主要用于学生、员工和组织创建电子表格、报告和许多其他内容。我们是人&#xff0c;我们也容易忘记事情。因此&#xff0c;您想要在 macOS 上恢复未保存的 Excel 文件并不罕见。 虽然在 Excel 上恢复未保存的电子表格很容易&#xff0c;但在 macOS 上就有些棘…

AWS注册时常见错误处理

引言 创建AWS账号是使用AWS云服务的第一步&#xff0c;但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题&#xff0c;包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。 常见问题及解决方法 1. …

VSCode编程配置再次总结

VScode 中C++编程再次总结 0.简介 1.配置总结 1.1 launch jsion文件 launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.json的任务,并能实现调试功能。 左侧任务栏的第四个选项运行和调试,点击创建launch.json {"conf…

String类常用的方法

源代码&#xff1a; 输出结果&#xff1a;

卡码网KamaCoder 108. 冗余连接

题目来源&#xff1a;108. 冗余连接 C题解&#xff08;思路来源代码随想录&#xff09;&#xff1a;并查集。因为原来是树&#xff0c;所以加入边之前肯定不是一个根&#xff0c;如果是一个根&#xff0c;再加一条边&#xff0c;肯定成环。所以只要找到根一致的两个点组成的边即…

前端工程化4:从0到1构建完整的前端监控平台

前言 一套完整的前端监控系统的主要部分&#xff1a; 数据上报方式数据上送时机性能数据采集错误数据采集用户行为采集定制化指标监控sdk 监控的目的&#xff1a; 一、数据上报方式 本文的方案是&#xff0c;优先navigator.sendBeacon&#xff0c;降级使用1x1像素gif图片…

网站建设中,JavaScript为什么现在可以做后台了?

JavaScript&#xff0c;作为一种最初为浏览器端脚本设计的语言&#xff0c;已经逐渐发展成为可以在服务器端运行的强大工具。以下是JavaScript可以做后台开发的原因分析&#xff1a; Node.js的崛起 事件驱动与非阻塞I/O&#xff1a;Node.js的事件驱动和非阻塞I/O模型使得JavaSc…

[WMCTF2020]Make PHP Great Again 2.01

又是php代码审计,开始吧. 这不用审吧&#xff0c;啊喂. 意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.&#xff0c;貌似呢require_once()已经被用过一次了&#xff0c;直接读取还不行&#xff0c;看一下下面的知识点. require_once() require…

2.1 HuggingFists系统架构(一)

系统架构 HuggingFists的前端主体开发语言为HtmlJavascript&#xff0c;后端的主体开发语言为Java。在算子部分有一定份额的Python代码&#xff0c;用于整合Python在数据处理方面强大能力。 功能架构 HuggingFists的功能架构如上&#xff0c;由下向上各层为&#xff1a; 数据存…