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

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。

🍎个人主页:Meteors.的博客

💞当前专栏:Java微服务

✨特色专栏: 知识分享

🥭本文内容:【2.3】Java微服务:sentinel服务哨兵

📚 ** ps ** : 阅读这篇文章如果有问题或者疑惑,欢迎各位在评论区提问或指出!

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

目录

一、内容

二、Sentinel介绍

1.背景

[2. 介绍](#2. 介绍)

[3. 特性](#3. 特性)

[三. Sentinel的历史](#三. Sentinel的历史)

[四. Sentinel与Hystrix的对比](#四. Sentinel与Hystrix的对比)

[五. Sentinel核心](#五. Sentinel核心)

六、Sentinel控制台

[1. 介绍](#1. 介绍)

[2. 功能](#2. 功能)

[3. 文档](#3. 文档)

[4. 控制台安装](#4. 控制台安装)

1)进入下载页面

2)下载jar包

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

[七. 客户端接入控制台](#七. 客户端接入控制台)

[1. 添加依赖](#1. 添加依赖)

1)父工程中添加​编辑

2)子工程中添加

3)添加配置文件

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

[2. 定义资源](#2. 定义资源)

ps:资源属性

[3. 定义规则](#3. 定义规则)

1)流量控制规则

2)熔断降级规则

3)热点参数规则

4)授权规则

5)系统保护规则

6)动态规则扩展

[1. 支持](#1. 支持)

[2. 本地文件中设置方式Demo](#2. 本地文件中设置方式Demo)

[八. RestTemplate支持](#八. RestTemplate支持)

[1. 配置异常类](#1. 配置异常类)

[2. RestTemplate的声明位置加上注解](#2. RestTemplate的声明位置加上注解)

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

[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. 文档

控制台 · 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)添加配置文件

java 复制代码
    sentinel:
      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文件中进行配置

java 复制代码
      datasource:
        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
java 复制代码
  cloud:
    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


最后,

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

相关推荐
转测试啦转测试啦4 天前
Redis哨兵(sentinel)
redis·sentinel·php
wclass-zhengge5 天前
SpringCloud篇(服务保护 - Sentinel)
spring·spring cloud·sentinel
cui_win9 天前
Redis高可用-Sentinel(哨兵)
redis·bootstrap·sentinel
FIN技术铺10 天前
Redis集群模式之Redis Sentinel vs. Redis Cluster
数据库·redis·sentinel
cyt涛12 天前
Sentinel — 微服务保护
微服务·架构·sentinel·限流·熔断·降级·隔离
ketil2714 天前
Redis - 哨兵(Sentinel)
数据库·redis·sentinel
阿伟*rui15 天前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
茶馆大橘15 天前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
Shenqi Lotus16 天前
Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)
redis·sentinel·cluster·failover·sharding·自动分片·水平拆分
Genius Kim16 天前
SpringCloud Sentinel 服务治理详解
spring cloud·sentinel·php