【2.3】Java微服务:sentinel服务哨兵

 ✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:Java微服务
✨特色专栏: 知识分享
🥭本文内容:【2.3】Java微服务:sentinel服务哨兵
📚 ** ps **  : 阅读这篇文章如果有问题或者疑惑,欢迎各位在评论区提问或指出!

----------------------------------------------------------  目录  --------------------------------------------------------------

 

目录

一、内容

二、Sentinel介绍

1.背景

2. 介绍

3. 特性

三. Sentinel的历史

四. Sentinel与Hystrix的对比

五. Sentinel核心

六、Sentinel控制台

1. 介绍

2. 功能

3. 文档

4. 控制台安装

1)进入下载页面

2)下载jar包

3)将jar包移动到合适目录并启动

 七.  客户端接入控制台

1. 添加依赖

1)父工程中添加​编辑

2)子工程中添加

3)添加配置文件 

4)重启服务并发送一次请求

2. 定义资源

 ps:资源属性

3. 定义规则

1)流量控制规则

2)熔断降级规则

3)热点参数规则

4)授权规则

5)系统保护规则

6)动态规则扩展

1. 支持

2. 本地文件中设置方式Demo

八. RestTemplate支持

1. 配置异常类

2. RestTemplate的声明位置加上注解

3.注释掉之前在方法上的声明

 4. 增加流控进行测试

九. OpenFeign支持

1. 添加依赖

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的对比

SentinelHystrix
隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离
熔断降级策略基于响应时间、异常比率、异常数基于异常比率
实时指标实现滑动窗口(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. 文档

控制台 · alibaba/Sentinel Wiki · GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - 控制台 · alibaba/Sentinel Wikihttps://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0


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)添加配置文件 

    sentinel:transport:port: 8719dashboard: 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)限制资源是否通过。

设置禁止访问的来源:

添加配置类:

/*** 自定义来源处理规则*/
@Component
public class MyRequestOriginParser implements RequestOriginParser {@Overridepublic 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 目前支持以下数据源扩展:

  • Pull-based: 动态文件数据源、Consul, Eureka
  • Push-based: ZooKeeper, Redis, Nacos, Apollo, etcd

2. 本地文件中设置方式Demo

在yml文件中进行配置

      datasource:ds1:file:file: classpath:flowRule.jsondata-type: jsonrule-type: flow

增加并配置JSON文件

 重启项目后,调用接口


八. RestTemplate支持

    Spring Cloud Alibaba Sentinel 支持对 RestTemplate 调用的服务进行服务保护。需要在构造 RestTemplate Bean 时添加 @SentinelRestTemplate 注解。

1. 配置异常类


/*** 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的声明位置加上注解

    @SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class,fallback = "fallback", fallbackClass = ExceptionUtil.class)

3.注释掉之前在方法上的声明

 4. 增加流控进行测试

 


九. OpenFeign支持

1. 添加依赖

<!-- 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文件中添加两处地方:

# feign 开启 sentinel 支持
feign:sentinel:enabled:true
cloud:sentinel:transport:port:8719dashboard:localhost:8080

创建异常注解

/*** 服务熔断降级处理可以捕获异常*/
@Component
publicclass ProductServiceFallbackFactory implements FallbackFactory<ProductService> {// 获取日志,在需要捕获异常的方法中进行处理Logger logger = LoggerFactory.getLogger(ProductServiceFallbackFactory.class);@Overridepublic ProductService create(Throwable throwable) {returnnew ProductService() {@Overridepublic Product selectProductById(Integer id) {return new new Order(333L, 333L, "333", 333, 3L, new ArrayList<>());}};}}

服务接口类中添加注解即可

@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


 最后,

        相关内容会陆续更新,希望文章对你有所帮助!

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

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

相关文章

【android】mac mini m2安装android studio

文章目录 一、环境搭建1.1 安装路径1.2 mac arm1.3 安装android studio 二、安装sdk三、更新sdk3.1 关闭代理3.2 重新更新sdk 四、更新api五、项目创建六、gradle安装七、avd八、问题&#xff1a;build tools缺失九、编译运行小结 一、环境搭建 1.1 安装路径 windows&#xf…

【MOOC】北京理工大学Python网络爬虫与信息提取慕课答案-综合挑出了一些很难评的慕课测验题

1 Requests库中的get()方法最常用&#xff0c;下面哪个说法正确&#xff1f;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬…

【MySQL】基础知识(一)

MySQL基础知识&#xff08;一&#xff09; 文章目录 MySQL基础知识&#xff08;一&#xff09;00 MySQL安装01 数据库介绍1.1 什么是数据库1.2数据库分类 02 SQL分类03 数据库操作3.1显示数据库3.2创建数据库3.3选中数据库3.4删除数据库 04 常用数据类型4.1数值类型4.2字符串类…

Jenkins 修改默认管理员帐号

1、新增一个新的超级管理员用户&#xff0c;并验证能正常登录 2、进入 Jenkins 用户管理目录&#xff1a; /data/software/jenkins/users 3、修改超级管理文件夹的名称为其他名称&#xff0c;如&#xff1a;mv admin_*** ifadm_*** 4、重启Jenkins容器

湖南科技学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

湖南科技学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

深入探索C++模板:从基础到高级应用

目录 一、 泛型编程 1.1 为什么需要泛型编程&#xff1f; 二、模板 2.1 概念 2.2 函数模板 2.2.1 概念 2.2.2 语法 2.2.3 示例 2.2.4 模板实例化 隐式实例化 显示实例化 2.2.5 模板参数的匹配原则 2.3 类模板 2.3.1 概念 2.3.2 语法 2.3.3 示例 2.3.4 注意事项…

算法的时间复杂度和空间复杂度

目录 前言&#xff1a; ✨什么是数据结构&#xff1f; ✨ 什么是算法&#xff1f; ✨数据结构和算法的重要性 &#x1f351;算法的时间复杂度和空间复杂度 算法效率 &#x1f389;时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 &#x1f389;空间复杂度 前言&#xf…

【机器学习】对 MLOps 的友好的介绍(MLOps1)

一、说明 我对 MLOps 感兴趣已经有一段时间了。我第一次从机器学习工程师那里了解到它&#xff0c;由于我当时还是一名博士生&#xff0c;我并不知道它的存在。然而&#xff0c;我的好奇心被激起了&#xff0c;我开始了解它。回想起来&#xff0c;我很后悔没有早点了解它&#…

Asynq: 基于Redis实现的Go生态分布式任务队列和异步处理库

Asynq[1]是一个Go实现的分布式任务队列和异步处理库&#xff0c;基于redis&#xff0c;类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker 同时提供一个WebUI asynqmon[5]&#xff0c;可以源码形式安装或使用Docker image, 还可以和Prometheus…

最新成果展示:GaN基Micro-LED热学模型数据库的开发及应用

由于GaN基Micro-LED表面积-体积比增加&#xff0c;其在热学方面的性质有别于大尺寸的LED&#xff0c;如缺陷复合导致的热效应将在发光区域中产生诸多“热”点&#xff0c;导致发光波长不均匀&#xff0c;这将影响后期显示系统的成像稳定性。针对上述问题&#xff0c;天津赛米卡…

Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP

一对一音视频通话使用场景 一对一音视频通话都需要稳定、清晰和流畅&#xff0c;以确保良好的用户体验&#xff0c;常用的使用场景如下&#xff1a; 社交应用&#xff1a;社交应用是一种常见的使用场景&#xff0c;用户可以通过音视频通话进行面对面的交流&#xff1b;在线教…

Linux基础开发工具之Linux自动项目构建工具的使用

目录 前言 1.make/makefile 1.1 依赖关系/依赖方法 2.原理 3.项目清理 4.make的执行问题 5.相关简单的符号介绍 总结 前言 之前给大家介绍了我们在开发过程中所需要使用到的编辑器vim&#xff0c;以及编译器gcc/g的使用&#xff0c;但是我相信大家在使用过程会发现我们在…