Alibaba Sentinel整合SpringBoot,为微服务保驾护航!

news2024/11/29 3:58:51

 前言

        随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

  • 源码地址:https://github.com/alibaba/Sentinel
  • 官方文档:https://github.com/alibaba/Sentinel/wiki

正文

1. Sentinel特征

        Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

        Sentinel具有以下特征:

  1.  丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控 制在统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等;
  2. 完备的实时监控:   Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据, 甚至 500 台以下规模的集群的汇总运行情况。
  3. 广泛的开源生态:   Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring CloudDubbo gRPC 合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel
  4. 完善的 SPI 扩展点:   Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。 例如定制规则管理、适配数据源等。

        阿里云提供了 企业级的 Sentinel 服务,  应用高可用服务 AHAS。

        Sentinel和Hystrix对比:

SentinelHystrix
隔离策略信号量隔离线程池隔离/信号量隔离
熔断降级策略基于相应时间或失败比率基于失败比率
实时指标实现滑动窗口滑动窗口(基于RxJava)
规则配置支持多种数据源支持多种数据源
扩展性多个扩展点插件的形式
基于注解支持支持支持
限流基于QPS,支持基于调用关系的限流有限的支持
流量整形支持满启动,匀速器模式不支持
系统负载保护支持不支持
控制台

开箱即用,可配置规则,查看秒级监控,机器发现等

不支持
常见框架的适配Servlet,Spring Cloud,Dubbo,gRPC等Servlet,Spring Cloud Netflix

        Sentinel和Hystrix都是开源,但是目前Hystrix的Netflix团队已经不在维护了,而Sentinel阿里团队一直在迭代更新,社区也在不断发展。

        性能方面,Sentinel比Hystrix更加轻量级,性能也更好一点,并且经过了双十一阿里的超大流量考验。


2. Sentinel快速开始

2.1 API实现

  • 引入依赖

<dependency>

        <groupId>com.alibaba.csp</groupId>

        <artifactId>sentinel core</artifactId>

        <version>1.8.0</version>

</dependency>

  • 代码实现

        在官方文档中,定义的Sentinel进行资源保护需要先定义资源和规则。

@Slf4j
@RestController
@RequestMapping(value = "/sentinel")
public class TestSentinelController {

    private static final String RESOURCE_NAME	=	"hello";

    /**
     *	编写测试代码,对"hello"进行资源保护
     */
    @RequestMapping(value = "/hello")
    public String hello() {

        Entry entry = null;
        try {
            // 资源名可使用任意有业务语义的字符串,比如方法名、接口名或其它可唯一标识的字符串。
            entry = SphU.entry(RESOURCE_NAME);
            // 被保护的业务逻辑
            String str	=	"hello world";
            log.info("====="+str);
            return str;
        } catch (BlockException e1) {
            // 资源访问阻止,被限流或被降级
            // 进行相应的处理操作
            log.info("block!");
        } catch (Exception ex) {
            // 若需要配置降级规则,需要通过这种方式记录业务异常
            Tracer.traceEntry(ex, entry);
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
        return null;
    }
    /**
     *	定义流控规则
     */
    @PostConstruct
    private static void initFlowRules(){
        List<FlowRule> rules	=	new ArrayList<>();
        FlowRule rule = new FlowRule();
        // 设置受保护的资源
        rule.setResource(RESOURCE_NAME);
        // 设置流控规则 QPS
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 设置受保护的资源阈值
        // Set limit QPS to 20.
        rule.setCount(1);
        // 加载配置好的规则
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}
  • 测试效果

  •  缺点
  1. 侵入性很强,需要在controller中写入非业务代码;
  2. 配置不灵活 若需要添加新的受保护资源 需要手动添加 init方法来添加流控规则;

2.2 @SentinelResource注解实现

  • 引入依赖
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel‐annotation‐aspectj</artifactId>
    <version>1.8.0</version>
</dependency>
  • 配置切面支持
@Configuration
public class SentinelAspectConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();  
    }
}
  • 编写测试逻辑,添加@SentinelResource,配置blockHandlerfallback
@RequestMapping(value = "/findOrderByUserId/{id}")
@SentinelResource(
        value = "findOrderByUserId",
        fallback = "fallback",fallbackClass = ExceptionUtil.class,
        blockHandler = "handleException",blockHandlerClass = ExceptionUtil.class)
public R findOrderByUserId(@PathVariable("id") Integer id) {
    // ribbon实现
    String url = "http://mall ‐order/order/findOrderByUserId/"+id;
    R result = restTemplate.getForObject(url,R.class);
    if(id==4){
        throw new IllegalArgumentException("非法参数异常");
    }
    return result; 
}
  • 编写ExceptionUtil(注意:如果制定了从class,方法必须是static的)
public class ExceptionUtil {                                                                                          
    public static R fallback(Integer id,Throwable e){
        return R.error( ‐2, "===被异常降级啦===");
    }

    public static R handleException(Integer id, BlockException e){
        return R.error( ‐2, "===被限流啦===");
    }                                                                                                                  	}
  • 流控规则设置可以通过Sentinel dashboard配置

        pom.xml:客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel‐transport‐simple‐http</artifactId>
    <version>1.8.0</version>
</dependency>

        application.yml:客户端需要配置 Sentinel 控制台【IP:端口】进行通信。

Dcsp.sentinel.dashboard.server=consoleIp:port


3. 启动 Sentinel 控制台

        下载控制台 jar 包并在本地启动:可以参见官网文档https://github.com/alibaba/Sentinel/releases

  • jar包的控制台启动命令

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

        其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080

         从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。可以参考 鉴权模块文档 配置用户名和密码。

        Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包,所以要确保客户端有访问量。

  • 控制台地址:http://localhost:8080/

  • 查看机器列表以及健康情况

        当您在机器列表中看到您的机器,就代表着您已经成功接入控制台;如果没有看到您的机器,请检查配置,并通过 ${user.home}/logs/csp/sentinel-record.log.xxx 日志来排查原因。

  • Sentinel控制台


4. Spring Cloud Alibaba整合Sentinel

  • 引入依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring‐cloud‐starter‐alibaba‐sentinel</artifactId>  
</dependency>
  •  添加yml置,为微服务设置sentinel控制台地址

        添加Sentinel后,需要暴露/actuator/sentinel端点,而Springboot默认是没有暴露该端点的,所以需要设置,测试 http://localhost:8800/actuator/sentinel

server:
    port: 8800

spring:
    application:
    name: mall‐user‐sentinel‐demo
    cloud:
        nacos:
            discovery:
                server-addr: 127.0.0.1:8848
    sentinel:
        transport:
            # 添加sentinel的控制台地址
            dashboard: 127.0.0.1:8080
            # 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
            # port: 8719
  • sentinel控制台中设置流控规

  •  访问 http://localhost:8800/actuator/sentinel,可以查看flowRules
  • 微服务和Sentinel Dashboard通信原理

        Sentinel控制台与微服务端之间,实现了一套服务发现机制,集成了Sentinel的微服务都会将元数据传递给Sentinel控制 台,架构图如下所示:


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

08-05 应用层设计

伸缩性的架构设计——服务器集群的伸缩性 DNS负载均衡 DNS服务器将访问的域名转发到对应的网关&#xff0c;网关层做反向代理。 利用消息组件对业务场景进行解耦 适合用消息组件解耦的场景 长任务&#xff08;时间长&#xff0c;逻辑复杂&#xff0c;可异步&#xff09…

React Antv G2Plot 「指标拆解图」 前端可视化实战 实现渲染、重置、筛选功能

背景 实现对指定数据的「指标拆解图」 渲染&#xff0c;并且可以根据筛选项进行变化。 任务分解 antv 的图表&#xff0c;以及请求后端的载荷对传入的数据结构有严格要求 一个工具函数将后端接口返回的数据格式化成 antv 图表要求的格式一个工具函数将前端提交的请求数据格…

Copilot入门

文章目录 简介安装初试快捷键取消订阅参考文献 简介 Copilot 是一款 GitHub 和 OpenAI 合作开发的 AI 结对编程工具&#xff0c;支持 Visual Studio、Neovim、VS Code、JetBrains IDEs&#xff0c;用于自动补全代码。 本文以 Python PyCharm 为例。 安装 GitHub Copilot&am…

【数据结构】栈及其实现

目录 &#x1f920;前言 什么是栈&#xff1f; 栈的定义及初始化 栈的定义 栈的初始化 栈的判空 栈顶压栈 栈顶出栈 栈的数据个数 栈的销毁 完整代码 总结 &#x1f920;前言 学了相当长一段时间的链表&#xff0c;总算是跨过了一个阶段。从今天开始我们将进入栈和…

什么是AIGC

AIGC是人工智能创意生成的缩写&#xff08;Artificial Intelligence Generated Creativity&#xff09;&#xff0c;指的是利用人工智能技术实现的创意生成。通俗来说&#xff0c;就是让机器产生新颖、独特且有创造性的作品或方案&#xff0c;例如音乐、绘画、视频、文本等等。…

Sui基金会宣布面向APAC的Office Hours计划

诚挚邀请构建者与Sui基金会的Growth团队一起开启“Office Hours”计划&#xff0c;共同努力&#xff0c;迈向业务增长的下一步。 Sui基金会致力于推动Sui在全球范围内的普及。为此&#xff0c;我们通过积极支持开发人员的开发者资助计划、Builder House和大使计划在Sui上开始…

如何高效运行Omniverse,无惧本地硬件压力

无论是创造能够表达原始情感的逼真数字人&#xff0c;还是构建身临其境的虚拟世界&#xff0c;全球设计、工程、创意和其他行业的人士都在通过3D工作流&#xff0c;突破技术壁垒并拓展创意可能&#xff0c;让虚拟世界和现实世界交融与观众产生共鸣。 而在众多连接未来创作内容的…

ES6中函数新增的方式方法

1.1函数形参的默认值 1.1.1基本用法 ES6 之前&#xff0c;不能直接为函数的参数指定默认值&#xff0c;只能采用变通的方法。如下代码&#xff1a; function func(x,y){y y || "tom";console.log(x,y);}func("hello"); //hello tomfunc("…

数据库标准化之核心结局变量集(COS)

COS介绍 核心结果集&#xff08;COS&#xff09;是在特定健康状况下进行的所有临床试验中应测量和报告的一组最少结局变量集。COS数据库是这些变量集的集合&#xff0c;这些集合是通过循证和迭代过程开发的。该数据库由COMET倡议维护&#xff0c;该计划是研究人员&#xff0c;…

Linux 系统上 C 程序的编译与调试 2 总结

1.gcc分布编译链接 &#xff08;1) 预编译 : gcc -E main.c -o main.i (2) 编译&#xff1a; gcc -S main.i -o main.s (3) 汇编&#xff1a; gcc -c main.s -o main.o (4) 链接&#xff1a; gcc main.o -o main gcc -E hello.c -o hello.i #预处理 gcc -S hello.i -o h…

【FMC134】ADC12DJ3200之4通道3.2GSPS(2 通道6.4GSPS) 12 位AD高速采集子卡设计原理图及调试经验

板卡概述 FMC134 是一款4 通道3.2GSPS&#xff08;或者配置成2 通道6.4GSPS&#xff09;采样率的12 位AD 采集FMC子卡模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.4 规范&#xff0c;可以作为一个理想的IO 模块耦合至FPGA 前端&#xff0c;射频模拟信号数字化后通过…

【多线程进阶一】常见的锁策略

目录 一、常见的锁策略 &#x1f345;1、常见的锁策略 &#x1f345;2、Synchronized实现了哪些锁策略&#xff1f; &#x1f345;3、自旋锁的实现方式—CAS &#xff08;1&#xff09;CAS伪代码 &#xff08;2&#xff09;演示 使用CAS方式来实现自增操作&#xff1a; &am…

Linux 系统修改环境变量的方法

1. Linux 系统修改环境变量 正常情况下改变环境变量可以修改的文件有两类&#xff1a; 第一类是 “系统的全局环境变量”&#xff0c;修改之后可作用于整个系统包含的所有用户都会生效&#xff1b;(文件&#xff1a;/etc/profile) 第二类是 “局部环境变量”&#xff0c;也就…

Linux C程序多文件编译

C程序多文件编译 在Linux平台C编程&#xff0c;实现求两数最大值和两数之和的功能 1.编写add.c wysDESKTOP-2OU3HRV:~/mycode/day02$ vi add.c1 int add(int x,int y)2 {3 return x y;4 } 2.编写头文件add.h wysDESKTOP-2OU3HRV:~/mycode/day02$ vi add.hint add(…

Python 实验五 字符串与正则表达式

1.输入一个字符串&#xff0c;将该字符串中下标为偶数的字符组成新串并通过字符串格式化方式显示。 a input("请输入一个字符串&#xff1a;") b a[1::2] print("老串为&#xff1a;%a&#xff0c;新串为&#xff1a;%a"%(a,b))2.编写程序&#xff0c;生…

LInux系统下使用git的三板斧以及报错处理

LInux使用git 我们应该知道git是什么东西&#xff0c;还有git的三板斧&#xff0c;git是一个工具&#xff0c;使用git来将文件上传到代码仓库 文章目录 LInux使用gitcloneaddcommitpush查看当前git的状态 clone 第一步找到你创建的仓库&#xff0c;然后复制http地址&#xf…

目前可以用的ChatGPT网址大全

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;可以与用户进行自然语言交互。它可以回答各种问题&#xff0c;提供有用的信息和建议&#xff0c;还可以进行闲聊和娱乐。ChatGPT使用最先进的自然语言处理技术&#xff0c;可以理解和解释人类语言&#xff0c;从而提供准确和…

【Linux】IO多路转接 - epoll

文章目录 I/O多路转接之epollepoll初识epoll的相关系统调用函数epoll_createepoll_ctlepoll_wait epoll工作原理epoll服务器-*epoll的优缺点epoll工作方式对比LT和ET I/O多路转接之epoll epoll初识 epoll也是系统提供的一个多路转接的接口,epoll才是使用和面试的重点,在效率和…

SpringBoot【开发实用篇】---- 整合第三方技术(缓存)

SpringBoot【开发实用篇】---- 整合第三方技术&#xff08;缓存&#xff09; SpringBoot内置缓存解决方案手机验证码案例SpringBoot整合Ehcache缓存SpringBoot整合Redis缓存SpringBoot整合Memcached缓存SpringBoot整合jetcache缓存纯远程方案纯本地方案本地远程方案远程方案的数…

tomcat控制台打印乱码解决

一、注册表修改 HKEY_CURRENT_USER ->console ->tomcate 新增 32位 CodePage 16进制 fde9 二、idea 中配置 Tomcat 后启动服务&#xff0c;输出打印日志乱码问题 解决办法&#xff1a; ①、打开安装idea文件路径&#xff0c;在bin目录下&#xff0c;找到下面两个文件 ②…