Sentinel实战(待完善)

目录

服务雪崩

什么是服务雪崩

服务不可用原因

解决方案

技术选型对比

Sentinel

介绍

优点

核心概念

资源

规则

代码实战

API实现

@SentinelResource注解实现

Sentinel控制台

启动控制台服务

java应用接入控制台

微服务接入Sentinel


服务雪崩

什么是服务雪崩

        在服务调用链路中, 服务提供者不可用, 导致服务调用者不可用, 间接让上上游也不可用, 这个不可用逐渐放大的过程, 叫做服务雪崩

服务不可用原因

  • 内存泄漏
  • 大流量请求, 超过正常承受qps
  • 缓存击穿, 大量直接打到数据库
  • 硬件损坏

解决方案

1. 超时机制

2. 限流

3. 资源隔离(线程池/信号量隔离)

4. 熔断降级

技术选型对比

Sentinel

介绍

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

官方文档: https://sentinelguard.io/zh-cn/docs/introduction.html

优点

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

核心概念

资源

        资源可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

规则

        围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。一个资源可以对应多个规则, 一个规则只能对应一个资源.

代码实战

API实现

1. 引入maven依赖

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version>
</dependency>

2. 接口实现

@RestController
@Slf4j
public class HelloController {// 定义资源名称private static final String RESOURCE_NAME = "HelloWorld";@RequestMapping(value = "/hello")public String hello() {// try catch包起来的代码块 就是资源try (Entry entry = SphU.entry(RESOURCE_NAME)) {// 被保护的逻辑log.info("hello world");return "hello world";} catch (BlockException ex) {// 自定义流控逻辑log.info("blocked!");return "被流控了";}}/*** 定义流控规则*/@PostConstructprivate static void initFlowRules(){List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();//设置受保护的资源rule.setResource(RESOURCE_NAME);// 设置流控规则 QPSrule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 设置受保护的资源阈值, qps>1 就被流控rule.setCount(1);rules.add(rule);// 加载配置好的规则FlowRuleManager.loadRules(rules);}
}

存在缺点: 代码侵入太强, 不够灵活

@SentinelResource注解实现

1. 引入pom依赖, sentinel核心jar和切面jar 

        <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId><version>1.8.6</version></dependency>

2. 注入切面类

@Configuration
public class SentinelAspectConfiguration {@Beanpublic SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();}
}

3. 设置流控规则注解, 注解定义资源以及降级逻辑 

    @PostConstructprivate static void initFlowRules(){List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();//设置受保护的资源rule.setResource(RESOURCE_NAME);// 设置流控规则 QPSrule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 设置受保护的资源阈值rule.setCount(3);rules.add(rule);// 加载配置好的规则FlowRuleManager.loadRules(rules);}@SentinelResource(value = RESOURCE_NAME,blockHandler = "handleException",blockHandlerClass = ExceptionUtil.class,fallback = "fallbackException",fallbackClass = ExceptionUtil.class)@RequestMapping("/hello2")public String hello2() {int i = 1 / 0;return "helloworld ";}
public class ExceptionUtil {public static String fallbackException(Throwable t){return "===被异常降级啦===";}public static String handleException(BlockException ex){return "===被限流啦===";}
}

Sentinel控制台

启动控制台服务

 官方文档:https://sentinelguard.io/zh-cn/docs/dashboard.html

1. 下载控制台

https://github.com/alibaba/Sentinel/releases/download/1.8.7/sentinel-dashboard-1.8.7.jar

2. 启动控制台

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

3. 登录控制台

访问http://localhost:8080/#/login ,默认用户名密码: sentinel/sentinel

java应用接入控制台

1. 引入sentinel通信jar

        <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.6</version></dependency>

2. java应用增加启动参数, 启动服务

-Dproject.name=kk-sentinel-demo -Dcsp.sentinel.dashboard.server=localhost:8080 -Dcsp.sentinel.api.port=8719 

 3. 访问流控接口http://localhost:8800/hello, 登录控制台检查

4. 控制台修改流控规则, 接口测试, 实时生效

5. get接口查看流控规则, url = http://localhost:8720/getRules?type=flow 

 

微服务接入Sentinel

1. 引入pom依赖

        <!--sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- 对外暴露的 Endpoint --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

2. 修改yml配置

server:port: 8800feign:sentinel:enabled: true  #开启Sentinel 对 Feign 的支持spring:application:name: mall-usercloud:nacos:discovery:server-addr: 127.0.0.1:8848sentinel:transport:# 添加sentinel的控制台地址dashboard: 127.0.0.1:8080# 指定应用与Sentinel控制台交互的端口,应用会起一个HttpServer占用该端口# port: 8719#暴露actuator端点   http://localhost:8800/actuator/sentinel
management:endpoints:web:exposure:include: '*'

3. 对URL流控

    // 对URL流控@RequestMapping("/info/{id}")@SentinelResource(value = "userinfo", blockHandler = "handleException")public R info(@PathVariable("id") Integer id){UserEntity user = userService.getById(id);if(id==4){throw new IllegalArgumentException("异常参数");}return R.ok().put("user", user);}// 对子方法流控@SentinelResource(value = "getUser",blockHandler = "handleException")public UserEntity getById(Integer id) {return userDao.getById(id);}

4. 接入openFeign 熔断降级

@FeignClient(value = "mall-order",path = "/order",fallbackFactory = FallbackOrderFeignServiceFactory.class)
public interface OrderFeignService {@RequestMapping("/findOrderByUserId/{userId}")public R findOrderByUserId(@PathVariable("userId") Integer userId);
}@Component
public class FallbackOrderFeignServiceFactory implements FallbackFactory<OrderFeignService> {@Overridepublic OrderFeignService create(Throwable throwable) {return new OrderFeignService() {@Overridepublic R findOrderByUserId(Integer userId) {return R.error(-1,"=======服务降级了========");}};}
}

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

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

相关文章

DETR详解

1. 动机 传统的目标检测任务需要大量的人工先验知识&#xff0c;例如预定义的先验anchor&#xff0c;NMS后处理策略等。这些人工先验知识引入了很多人为因素&#xff0c;且较难处理。如果能够端到端到直接生成目标检测结果&#xff0c;将会使问题变得很优雅。 2. 主要贡献 提…

idea中maven配置(一次成功,全部细节都有)

写这篇文章的原因是maven的配置很简单&#xff0c;但是也很容易出错&#xff0c;我连配了两台电脑的maven出现了各种小错误&#xff0c;参考了以下两篇博文IDEA配置Maven教程&#xff08;超详细版~)_idea maven配置教程-CSDN博客 一次包会——最新IDEA配置Maven指南&#xff0…

python 基础知识点(蓝桥杯python科目个人复习计划57)

今日复习计划&#xff1a;做题 例题1&#xff1a;笨笨的机器人 问题描述&#xff1a; 肖恩有一个机器人&#xff0c;他能根据输入的指令移动相应的距离。但是这个机器人很笨&#xff0c;他永远分不清往左边还是往右边移动。肖恩也知道这一点&#xff0c;所以他设定这个机器人…

mysql 远程不允许连接 1130 -Host ‘‘ is not allowed to connect to this MySQL server

1、docker 进入mysql 命令 sudo docker exec -it 0c58 /bin/bash 2、连接mysql mysql -u root -ppwd 3、 use mysql; 4、更改表所有root用户都可以连接 update user set host ‘%’ where user‘root’; 5、刷新权限 flush privilege&#xff1b; ok解决&#xff1b;

五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等

hello&#xff0c;我是贝格前端工场&#xff0c;本次介绍跨平台开发的框架&#xff0c;欢迎大家评论、点赞。 一、什么是跨平台桌面应用开发框架 跨平台桌面应用开发框架是一种工具或框架&#xff0c;它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的…

3.2日学习打卡----初学FastDFS(二)

3.2日学习打卡 目录: 3.2日学习打卡SpringBoot整合FastDFS实战开发文件上传 FastDFS集成Nginx环境搭建 SpringBoot整合FastDFS 由GitHub大牛tobato在原作者YuQing与yuqih发布的JAVA客户端基础上进行了大量重构工作&#xff0c;并于GitHub上发布了FastDFS-Client1.26.5。 主要特…

现货大宗商品发售平台搭建须知

在搭建现货大宗商品发售平台时&#xff0c;需要考虑以下关键因素&#xff1a; 目标市场分析&#xff1a;首先要明确你的平台将服务于哪些大宗商品市场&#xff0c;如农产品、金属、能源等。了解这些市场的特点、参与者、交易规则等&#xff0c;有助于你设计出更符合市场需求的…

chromedriver,Chrome驱动的实时更新

发现自己的selenium项目跑不起来了 效验驱动版本 下载链接(可能需要魔法) https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/ 找到驱动位置 1. 默认安装路径&#xff1a;Chrome驱动通常会默认安装在系…

详解JavaScript的函数

详解 JavaScript 的函数 函数的语法格式 创建函数/函数声明/函数定义 function 函数名(形参列表) { 函数体 return 返回值; // return 语句可省略 } 函数调用 函数名(实参列表) // 不考虑返回值 返回值 函数名(实参列表) // 考虑返回值 示例代码 //定义的没有参数列表&am…

实验:依赖注入之setter注入

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

【数据结构与算法】整数二分

问题描述 对一个排好序的数组&#xff0c;要求找到大于等于7的最小位置和小于等于7的最大位置 大于等于7的最小位置 易知从某个点开始到最右边的边界都满足条件&#xff0c;我们要找到这个区域的最左边的点。 开始二分&#xff01; left指针指向最左边界&#xff0c;right…

2024-03-01(金融AI行业与大数据生态圈)

1.金融这一块的算法&#xff0c;不像推荐系统&#xff0c;图像等领域&#xff0c;金融领域的算法都比较成熟了。现在来说门槛低&#xff0c;属于初期阶段&#xff0c;上升期。 2.反欺诈的数据标签比较少&#xff0c;有一种“标签染色”的方法来做反欺诈模型的标签。 3.常用反…

官宣 | 凯琦供应链成为亚马逊SPN物流服务商!

再播一条喜讯&#xff01;在亚马逊官方平台的筛选考核下&#xff0c;凯琦供应链近日正式入驻亚马逊SPN服务商平台&#xff0c;成为亚马逊SPN第三方承运商。 这也标志着凯琦9年来在FBA物流领域的服务质量得到了客户、官方及行业的广泛认可&#xff0c;未来凯琦将继续为亚马逊卖家…

第六讲:函数

函数 1. 函数的概念2. 库函数2.1 标准库和头文件2.2 库函数的使用方法2.2.1 功能2.2.2 头文件包含2.2.3 实践2.2.4 库函数文档的一般格式 3. 自定义函数3.1 函数的语法形式3.2 函数的举例 4. 形参和实参4.1 实参4.2 形参4.3 实参和形参的关系 5. return语句6. 数组做函数参数7.…

ubuntu个人系统软件安装配置备忘

1. 替换软件源 /etc/apt/source.list 2. 安装必要软件 安装基础软件 sudo apt update sudo apt install -y python3-pip git vim curl wget clang clang-format flameshot docker升级pip3 python3 -m pip install --upgrade pip 安装google浏览器 https://deb.pkgs.org/…

Excel 按奇数偶数列处理数据

目录 一. 需求背景1.1 获取偶数列的数据1.2 奇偶列数据互换 二. 解决方式2.1 为列添加奇偶辅助列2.2 通过公式将奇偶列互换 一. 需求背景 1.1 获取偶数列的数据 ⏹ 最近在整理歌单&#xff0c;发现部分歌曲没有歌词&#xff0c;于是打算自己制作一份。 从网上找到了歌词&…

JavaScript-关于事件、事件流(捕获、冒泡)、事件源、常用事件

1.如何注册事件(如何绑定事件) ​ 何为注册事件&#xff0c;就是给元素添加事件&#xff0c;其方式有传统注册事件、方法监听注册事件。 0、1级事件&#xff08;传统注册事件&#xff09;不允许多个响应程序 我们在元素内或js内使用on的方式就是传统注册事件&#xff0c;这种形…

#WEB前端(CSS基础)

1.实验&#xff1a;HTML是网页骨架&#xff0c;CCS是网页装修 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; style 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"view…

学习笔记-李沐动手学深度学习(七)(19-21,卷积层、填充padding、步幅stride、多输入多输出通道)

总结 19-卷积层 【补充】看评论区建议的卷积动画视频 数学中的卷积 【链接】https://www.bilibili.com/video/BV1VV411478E/?fromsearch&seid1725700777641154181&vd_sourcee81e116c4ffe5e79d4bc44738263eda4 【可判断是否为卷积的典型标志】两个函数中自变量相加…

Salesforce CPQ - 02 - Quote Price

最近又有客户来咨询学习Salesforce CPQ&#xff0c;所以本人总结了下近几年CPQ培训的一些实际案例拿出来分享给大家&#xff1b; 再次介绍下本人是一位Salesforce十多年的从业者。 先来介绍下Salesforce的价格体系&#xff0c;再介绍下各个Product Price是如何配置及使用的&a…