当前位置: 首页 > news >正文

第七章 SpringCloud Alibaba 实现微服务集成Sentinel

什么是Sentinel

Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量
为切入点, 从流量控制熔断降级系统负载保护等多个维度来保护服务的稳定性。
Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景, 例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不用
    应用等。
  • 完备的实时监控:Sentinel 提供了实时的监控功能。通过控制台可以看到接入应用的单台机器秒
    级数据, 甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块, 例如SpringCloud、Dubbo、gRPC 的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
    Sentinel 分为两个部分:
  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo /
    Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等
    应用容器。

微服务集成Sentinel

为微服务集成Sentinel非常简单, 只需要加入Sentinel的依赖即可

在订单service-orderpom.xml中加入下面依赖

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

编写一个Controller测试使用

@RestController
@Slf4j
public class OrderController3 {@RequestMapping("/order/message1")public String message1() {return "message1";}@RequestMapping("/order/message2")public String message2() {return "message2";}
}

安装Sentinel控制台

Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能。
下载jar包,解压到文件夹:Sentinel官方

要对应SpringCloud Alibaba 版本下载

百度盘:链接:https://pan.baidu.com/s/1wpB-0C-EHR3hVNYxMyTESQ 提取码:dgl8
启动控制台

# 直接使用jar命令启动项目(控制台本身是一个SpringBoot项目)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -
Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar

修改 shop-order ,在里面加入有关控制台的配置

server:port: 8091tomcat:max-threads: 5
spring:application:name: service-orderdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: rootjpa:properties:hibernate:hbm2ddl:auto: updatedialect: org.hibernate.dialect.MySQL5InnoDBDialectcloud:nacos:discovery:server-addr: 127.0.0.1:8848sentinel:transport:port: 9999 #跟控制台交流的端口,随意指定一个未使用的端口即可dashboard: localhost:8080 #配置Sentinel dashboard地址clientIp: localhosteager: true

通过浏览器访问localhost:8080 进入控制台 ( 默认用户名密码是 sentinel/sentinel )

在这里插入图片描述
补充:了解控制台的使用原理
Sentinel的控制台其实就是一个SpringBoot编写的程序。我们需要将我们的微服务程序注册到控制台上,即在微服务中指定控制台的地址, 并且还要开启一个跟控制台传递数据的端口, 控制台也可以通过此端口调用微服务中的监控程序获取微服务的各种信息。
在这里插入图片描述

实现一个接口的限流

通过控制台为message1添加一个流控规则
在这里插入图片描述
在这里插入图片描述
通过控制台快速频繁访问, 观察效果
在这里插入图片描述

Sentinel的概念和功能

基本概念

  • 资源
    资源就是Sentinel要保护的东西
    资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,可以是一个服务,也可以是
    一个方法,甚至可以是一段代码。

我们入门案例中的message1方法就可以认为是一个资源

  • 规则
    规则就是用来定义如何进行保护资源的
    作用在资源之上, 定义以什么样的方式保护资源,主要包括流量控制规则、熔断降级规则以及系统
    保护规则。

我们入门案例中就是为message1资源设置了一种流控规则, 限制了进入message1的流量

重要功能

在这里插入图片描述

Sentinel的主要功能就是容错,主要体现为下面这三个:

  • 流量控制
    流量控制在网络传输中是一个常用的概念,它用于调整网络包的数据。任意时间到来的请求往往是
    随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状。
  • 熔断降级
    当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则
    对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。
    Sentinel 对这个问题采取了两种手段:
    通过并发线程数进行限制
    Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。当某个资源
    出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆
    积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的
    线程完成任务后才开始继续接收请求。
    通过响应时间对资源进行降级
    除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。
    当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的
    时间窗口之后才重新恢复。

Sentinel 和 Hystrix 的区别
两者的原则是一致的, 都是当一个资源出现问题时, 让其快速失败, 不要波及到其它服务
但是在限制的手段上, 确采取了完全不一样的方法:
Hystrix 采用的是线程池隔离的方式, 优点是做到了资源之间的隔离, 缺点是增加了线程
切换的成本。
Sentinel 采用的是通过并发线程的数量和响应时间来对资源做限制。

  • 系统负载保护
    Sentinel 同时提供系统维度的自适应保护能力。当系统负载较高的时候,如果还持续让
    请求进入可能会导致系统崩溃,无法响应。在集群环境下,会把本应这台机器承载的流量转发到其
    它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,Sentinel 提供了对应的保
    护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请
    求。
    总之一句话: 我们需要做的事情,就是在Sentinel的资源上配置各种各样的规则,来实现各种容错的功能。
    第八章 SpringCloud Alibaba 实现Sentinel规则配置

相关文章:

  • Ubuntu22,桌面服务状态查看与重启
  • 2024黑龙江省职业院校技能大赛暨国赛选拔赛“GZ031应用软件系统开发”赛项赛题题库
  • 3.DevEco Studio安装鸿蒙手机app本地模拟器
  • 2019年AMC8数学竞赛真题的典型考点和详细解析
  • 后端项目全局异常处理-使用RuntimeException自定义异常异常分类简单举例
  • 详细教程 - 从零开发 Vue 鸿蒙harmonyOS应用 第三节 (封装TabBar JS版)
  • 基于以太坊的智能合约开发Solidity(事件日志篇)
  • Java8 IfPresent 与 forEach 的组合操作
  • Nacos配置管理-微服务配置拉取
  • Linux Conda 安装 Jupyter
  • Github仓库远程操作——简单版
  • C语言——const函数
  • ad23如何分层打印SCH、PCB的pdf文件
  • MySQL数据存储、索引记录
  • Codeforces Round 914 (Div. 2) A~E
  • 【node学习】协程
  • android图片蒙层
  • Angularjs之国际化
  • IDEA常用插件整理
  • iOS | NSProxy
  • IP路由与转发
  • JavaScript设计模式之工厂模式
  • Java多态
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Laravel 实践之路: 数据库迁移与数据填充
  • magento 货币换算
  • MySQL的数据类型
  • Object.assign方法不能实现深复制
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • PHP面试之三:MySQL数据库
  • SAP云平台里Global Account和Sub Account的关系
  • underscore源码剖析之整体架构
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 阿里云前端周刊 - 第 26 期
  • 从0实现一个tiny react(三)生命周期
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 电商搜索引擎的架构设计和性能优化
  • 基于web的全景—— Pannellum小试
  • 前端攻城师
  • 悄悄地说一个bug
  • 如何设计一个比特币钱包服务
  • 数据仓库的几种建模方法
  • 数据科学 第 3 章 11 字符串处理
  • 思否第一天
  • 思维导图—你不知道的JavaScript中卷
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 系统认识JavaScript正则表达式
  • 用Python写一份独特的元宵节祝福
  • 在Unity中实现一个简单的消息管理器
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 进程与线程(三)——进程/线程间通信
  • 移动端高清、多屏适配方案
  • #pragma预处理命令
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言