✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:Java微服务
✨特色专栏: 知识分享
🥭本文内容:【2.3】Java微服务:sentinel服务哨兵
📚 ** ps ** : 阅读这篇文章如果有问题或者疑惑,欢迎各位在评论区提问或指出!
---------------------------------------------------------- 目录 --------------------------------------------------------------
目录
[2. 介绍](#2. 介绍)
[3. 特性](#3. 特性)
[三. Sentinel的历史](#三. Sentinel的历史)
[四. Sentinel与Hystrix的对比](#四. Sentinel与Hystrix的对比)
[五. Sentinel核心](#五. Sentinel核心)
[1. 介绍](#1. 介绍)
[2. 功能](#2. 功能)
[3. 文档](#3. 文档)
[4. 控制台安装](#4. 控制台安装)
[七. 客户端接入控制台](#七. 客户端接入控制台)
[1. 添加依赖](#1. 添加依赖)
[2. 定义资源](#2. 定义资源)
[3. 定义规则](#3. 定义规则)
[1. 支持](#1. 支持)
[2. 本地文件中设置方式Demo](#2. 本地文件中设置方式Demo)
[八. RestTemplate支持](#八. RestTemplate支持)
[1. 配置异常类](#1. 配置异常类)
[2. RestTemplate的声明位置加上注解](#2. RestTemplate的声明位置加上注解)
[4. 增加流控进行测试](#4. 增加流控进行测试)
[九. OpenFeign支持](#九. OpenFeign支持)
[1. 添加依赖](#1. 添加依赖)
[2. 开启Sentinel](#2. 开启Sentinel)
一、内容
二、Sentinel介绍
1.背景
Netflix中多项开源产品已进入维护阶段,不再开发新的版本,就目前来看是没有什么问题的。但是从长远角度出发,我们还是需要考虑是否有可替代产品使用。比如本文中介绍Alibaba Sentinel就是一款高性能且轻量级的流量控制、熔断降级可替代方案。是一款面向云原生微服务的高可用流控防护组件
(Hystrix目前状态:不在主动开发,当前处于维护模式 ------摘录自Hystrix官网)
2. 介绍
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。(摘录自Sentinel官网)
3. 特性
Sentinel 具有以下特征:
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
三. Sentinel的历史
- 2012 年,Sentinel 诞生,主要功能为入口流量控制。
- 2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。
- 2018 年,Sentinel 开源,并持续演进。
- 2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。
- 2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。
- 2021 年,Sentinel 正在朝着 2.0 云原生高可用决策中心组件进行演进;同时推出了 Sentinel Rust 原生版本。同时我们也在 Rust 社区进行了 Envoy WASM extension 及 eBPF extension 等场景探索。
- 2022 年,Sentinel 品牌升级为流量治理,领域涵盖流量路由/调度、流量染色、流控降级、过载保护/实例摘除等;同时社区将流量治理相关标准抽出到 OpenSergo 标准中,Sentinel 作为流量治理标准实现。
四. Sentinel与Hystrix的对比
Sentinel | Hystrix | |
---|---|---|
隔离策略 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于响应时间、异常比率、异常数 | 基于异常比率 |
实时指标实现 | 滑动窗口(LeapArray) | 滑动窗口(基于 RxJava) |
规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
调用链路信息 | 支持同步调用 | 不支持 |
限流 | 基于 QPS / 并发数,支持基于调用关系的限流 | 有限支持 |
流量整形 | 支持慢启动、匀速器模式 | 不支持 |
系统负载保护 | 支持 | 不支持 |
控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 较为简单 |
常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
五. Sentinel核心
Sentinel 的使用可以分为两个部分:
**核心库(Java 客户端):**不依赖任何框架/库,能够运行于 Java 7 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配)。
**控制台(Dashboard):**控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。
六、Sentinel控制台
1. 介绍
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。这里,我们将会详细讲述如何通过简单的步骤就可以使用这些功能。
2. 功能
Sentinel 控制台包含如下功能:
- 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
- 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
- 规则管理和推送:统一管理推送规则。
- 鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
3. 文档
4. 控制台安装
1)进入下载页面
2)下载jar包
3)将jar包移动到合适目录并启动
执行命令(注意版本要改为自己的,可以使用tab键补全):
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar
七. 客户端接入控制台
1. 添加依赖
1)父工程中添加
<!-- 父工程添加如下依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> </dependency>
2)子工程中添加
<!-- 在子工程中导入依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
3)添加配置文件
javasentinel: transport: port: 8719 dashboard: localhost:8080
4)重启服务并发送一次请求
然后刷新控制台就有显示了
2. 定义资源
ps:资源属性
Field 说明 默认值 resource 资源名,资源名是限流规则的作用对象 count 限流阈值 grade 限流阈值类型,QPS 模式(1)或并发线程数模式(0) QPS 模式 limitApp 流控针对的调用来源 default
,代表不区分调用来源strategy 调用关系限流策略:直接、链路、关联 根据资源本身(直接) controlBehavior 流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流 直接拒绝 clusterMode 是否集群限流 否 重启服务后,刷新控制台就有显示资源了
3. 定义规则
1)流量控制规则
(不推荐和这一样在控制台进行设置,这里的设置重启服务后会消失,推荐使用动态规则)
请求超过设置,触发限流方法(上文的method1)
2)熔断降级规则
熔断降级规则是远程调用奔溃了,就会调用熔断降级触发方法(上文的method2)
3)热点参数规则
热点参数规则是一种更细粒度的流控规则,它允许将规则具体到参数上
4)授权规则
根据调用来源来判断该次请求是否被允许,这时可以调用Sentinel的来源访问控制的功能。来源访问根据资源的请求来源(origin)限制资源是否通过。
设置禁止访问的来源:
添加配置类:
java/** * 自定义来源处理规则 */ @Component public class MyRequestOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest httpServletRequest) { return httpServletRequest.getParameter("userName"); } }
5)系统保护规则
系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 和线程数四个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效 。入口流量指的是进入应用的流量(
EntryType.IN
),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。系统规则支持以下的阈值类型:
- Load (仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的
maxQps * minRt
计算得出。设定参考值一般是CPU cores * 2.5
。- CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0)。
- RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
6)动态规则扩展
1. 支持
Sentinel 目前支持以下数据源扩展:
2. 本地文件中设置方式Demo
在yml文件中进行配置
javadatasource: ds1: file: file: classpath:flowRule.json data-type: json rule-type: flow
增加并配置JSON文件
重启项目后,调用接口
八. RestTemplate支持
Spring Cloud Alibaba Sentinel 支持对 RestTemplate 调用的服务进行服务保护。需要在构造 RestTemplate Bean 时添加
@SentinelRestTemplate
注解。1. 配置异常类
java/** * sentinel异常工具类 */ public class ExceptionUtil { // 服务流量控制处理 public static ClientHttpResponse handleException(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException exception) { exception.printStackTrace(); return new SentinelClientHttpResponse( JSON.toJSONString(new Order(333L, 333L, "333", 333, 3L, new ArrayList<>()))); } // 服务熔断降级处理 public static ClientHttpResponse fallback(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException exception) { exception.printStackTrace(); return new SentinelClientHttpResponse( JSON.toJSONString(new Order(444L, 444L, "444", 444, 4L, new ArrayList<>()))); } }
2. RestTemplate的声明位置加上注解
java@SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class, fallback = "fallback", fallbackClass = ExceptionUtil.class)
3.注释掉之前在方法上的声明
4. 增加流控进行测试
九. OpenFeign支持
1. 添加依赖
java<!-- spring cloud openfeign 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- spring cloud alibaba sentinel 依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
2. 开启Sentinel
yml文件中添加两处地方:
java# feign 开启 sentinel 支持 feign: sentinel: enabled:true
javacloud: sentinel: transport: port:8719 dashboard:localhost:8080
创建异常注解
java/** * 服务熔断降级处理可以捕获异常 */ @Component publicclass ProductServiceFallbackFactory implements FallbackFactory<ProductService> { // 获取日志,在需要捕获异常的方法中进行处理 Logger logger = LoggerFactory.getLogger(ProductServiceFallbackFactory.class); @Override public ProductService create(Throwable throwable) { returnnew ProductService() { @Override public Product selectProductById(Integer id) { return new new Order(333L, 333L, "333", 333, 3L, new ArrayList<>()); } }; } }
服务接口类中添加注解即可
java@FeignClient(value = "user-service", fallbackFactory = ProductServiceFallbackFactory.class)
参考文献
home | Sentinelhomehttps://sentinelguard.io/zh-cn/index.html微服务系列之Sentinel服务哨兵今日份视频来啦,通过视频学习可真是一点不累,快点进来 ~https://mp.weixin.qq.com/s?__biz=MzA4MDEwNTI1NA==&mid=2459057627&idx=1&sn=2c4b1d9d98b6ea847face29de41d3872&chksm=88cfc792bfb84e84a792ffaa1dd464603297e99f3eccb28f379794875daf985f2835376501d5&cur_album_id=1337276895993430016&scene=189#wechat_redirect
最后,
相关内容会陆续更新,希望文章对你有所帮助!