【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

参考文献


---------------------------------------------------------------------------------------------------------------------------------

一、内容

【2.3】Java微服务:sentinel服务哨兵_第1张图片


二、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.3】Java微服务:sentinel服务哨兵_第2张图片

2)下载jar包

【2.3】Java微服务:sentinel服务哨兵_第3张图片

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

【2.3】Java微服务:sentinel服务哨兵_第4张图片

执行命令(注意版本要改为自己的,可以使用tab键补全):

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

【2.3】Java微服务:sentinel服务哨兵_第5张图片

【2.3】Java微服务:sentinel服务哨兵_第6张图片


 七.  客户端接入控制台

1. 添加依赖

1)父工程中添加【2.3】Java微服务:sentinel服务哨兵_第7张图片

            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2.2.5.RELEASE
            

2)子工程中添加

【2.3】Java微服务:sentinel服务哨兵_第8张图片

 

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-sentinel
        

3)添加配置文件 

【2.3】Java微服务:sentinel服务哨兵_第9张图片

    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080

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

然后刷新控制台就有显示了 

【2.3】Java微服务:sentinel服务哨兵_第10张图片


2. 定义资源

 ps:资源属性

Field 说明 默认值
resource 资源名,资源名是限流规则的作用对象
count 限流阈值
grade 限流阈值类型,QPS 模式(1)或并发线程数模式(0) QPS 模式
limitApp 流控针对的调用来源 default,代表不区分调用来源
strategy 调用关系限流策略:直接、链路、关联 根据资源本身(直接)
controlBehavior 流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流 直接拒绝
clusterMode 是否集群限流
重启服务后,刷新控制台就有显示资源了

【2.3】Java微服务:sentinel服务哨兵_第11张图片


3. 定义规则

1)流量控制规则

(不推荐和这一样在控制台进行设置,这里的设置重启服务后会消失,推荐使用动态规则)

【2.3】Java微服务:sentinel服务哨兵_第12张图片

请求超过设置,触发限流方法(上文的method1)

【2.3】Java微服务:sentinel服务哨兵_第13张图片

【2.3】Java微服务:sentinel服务哨兵_第14张图片

2)熔断降级规则

熔断降级规则是远程调用奔溃了,就会调用熔断降级触发方法(上文的method2)

【2.3】Java微服务:sentinel服务哨兵_第15张图片

3)热点参数规则

热点参数规则是一种更细粒度的流控规则,它允许将规则具体到参数上

【2.3】Java微服务:sentinel服务哨兵_第16张图片

4)授权规则

    根据调用来源来判断该次请求是否被允许,这时可以调用Sentinel的来源访问控制的功能。来源访问根据资源的请求来源(origin)限制资源是否通过。

设置禁止访问的来源:

【2.3】Java微服务:sentinel服务哨兵_第17张图片添加配置类:

/**
 * 自定义来源处理规则
 */
@Component
public class MyRequestOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        return httpServletRequest.getParameter("userName");
    }
}

【2.3】Java微服务:sentinel服务哨兵_第18张图片

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 达到阈值即触发系统保护。

【2.3】Java微服务:sentinel服务哨兵_第19张图片

6)动态规则扩展

1. 支持

Sentinel 目前支持以下数据源扩展:

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

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

在yml文件中进行配置

      datasource:
        ds1:
          file:
            file: classpath:flowRule.json
            data-type: json
            rule-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. 增加流控进行测试

【2.3】Java微服务:sentinel服务哨兵_第20张图片

 

 


九. OpenFeign支持

1. 添加依赖



    org.springframework.cloud
    spring-cloud-starter-openfeign



    com.alibaba.cloud
    spring-cloud-starter-alibaba-sentinel

2. 开启Sentinel

yml文件中添加两处地方:

# feign 开启 sentinel 支持
feign:
  sentinel:
    enabled:true

  cloud:
    sentinel:
      transport:
        port:8719
        dashboard:localhost:8080

创建异常注解

/**
 * 服务熔断降级处理可以捕获异常
 */
@Component
publicclass ProductServiceFallbackFactory implements FallbackFactory {

    // 获取日志,在需要捕获异常的方法中进行处理
    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<>());
            }
        };
    }

}

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

@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


 最后,

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

你可能感兴趣的:(微服务,知识分享,sentinel)