SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级

源码地址:GitHub·点这里||GitEE·点这里

一、基本简介

1、概念描述

Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。包括核心的独立类库,监控台,丰富的使用场景验证。(这似乎是阿里开源组件的一贯作风,极其有特点,且特点很规律)

基本特性图:

补刀一句:这种图很多人可能不在意,但是一般官方给这个图就是该中间件的基本使用思路,与核心功能点。

2、基础性概念

  • 资源管理

资源是Sentinel组件中的核心概念之一。应用服务器上脚本,静态页面,API接口,文件图片等都可以理解为资源,对于Java开发者而言,API接口就是这里资源的概念。

  • 规则配置

Sentinel组件通过流控规则的配置,来指定允许该资源(API接口)通过的请求次数,IP黑白名单,应用服务等。

  • 测试效果

QPS:每秒查询率,是一台服务器每秒能够处理的查询次数。

TPS:每秒处理事务数,事务处理整体倾向于整个过程。

二、框架环境整合

这里的环境主要整合Nacos注册中心,Feign服务,Sentinel哨兵,和Sentinel控制台。

1、基本依赖

这里的依赖需要参考官方文档,不同的环境使用不同的依赖,这里主要适配SpringCloud环境,所以使用如下包即可。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

2、控制台面板

这里直接从GitHub下载一个控制台服务包即可,也可以自己下载源码,按照需求修改后自行打包。

java -jar sentinel-dashboard-1.7.1.jar

下载并启动控制台服务。

3、服务配置

这里主要是把用到的两个服务9001和9002连接到监控台。

spring:
  application:
    name: node09-nacos-9001
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
    sentinel:
      transport:
        port: 9001
        dashboard: localhost:8080

最下面四行文件是哨兵控制台的主要配置,注意刚启动之后控制台是看不到连接的,有资源被触发之后才能看到。(附一张首页效果图)

三、流量控制

1、基本描述

流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

2、限流规则

限流规则主要由下面几个因素组成。

  • resource:资源名,即限流规则的作用对象,对于Java服务端开发而言就是执行的方法;
  • count: 限流阈值,单位时间内能按照规则通过的请求量;
  • grade: 限流阈值类型,QPS 或并发线程数 ;
  • limitApp: 流控限制的指定应用来源,若为default则不区分调用来源;
  • strategy: 调用关系限流策略,直连,链路等;
  • controlBehavior: 流量控制效果,直接拒绝、Warm Up、匀速排队;

3、基本案例

  • 硬编码

配置规则

public class FlowRuleConfig {

    public static void initFlowQpsRule(String resourceName) {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule(resourceName);
        // 修改这里参数,查看效果
        rule.setCount(100);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setLimitApp("default");
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

该规则参考上面的限流因素,不难理解。

使用方式

@RequestMapping(value = "/web/getOrder",method = RequestMethod.GET)
public String getOrder (@RequestParam("id") Integer id){
    FlowRuleConfig.initFlowQpsRule("getOrder");
    Entry entry = null;
    try {
        // 定义资源,埋点
        entry = SphU.entry("getOrder");
        // 保护的业务逻辑
        return "Order=" + id ;
    } catch (Exception e){
        e.printStackTrace();
    } finally {
        if (entry != null){entry.exit();}
    }
    return "Order Error" ;
}

测试的时候修改规则中count值,测试效果明显。

  • 编码简化

SphU.entry中可以设置处理类型,限流阈值。

@RequestMapping(value = "/web/getState",method = RequestMethod.GET)
public String getState (@RequestParam("id") Integer id){
    Entry entry = null;
    try {
        entry = SphU.entry("getOrder",EntryType.IN,2);
        return "state=" + id;
    }
    catch (BlockException e){
        e.printStackTrace();
    } finally {
        if (entry != null){entry.exit();}
    }
    return "State Error" ;
}

不过这种模式依旧是代码入侵严重,不太符合现在编程的大趋势。Sentinel支持通过@SentinelResource注解定义资源并配置。

4、测试效果

请求上述的两个测试接口,之后看控制台中9001服务的簇点链路。

可以基于控制台实时配置资源的:流控、降级、热点、授权等核心功能,服务重启之后配置也会重置。

四、服务熔断降级

1、注解详解

核心注解SentinelResource

用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource 注解包含以下属性:

  • value

资源名称,核心概念不能为空;

  • entryType

entry 类型,可选项默认为 EntryType.OUT;

  • blockHandler

对应处理BlockException的函数名称,可选项。blockHandler函数访问范围需要是public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException。blockHandler函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass为对应的类的Class对象,注意对应的函数必须为 static 函数,否则无法解析。

  • fallback

fallback函数名称,可选项,用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:返回值类型必须与原函数返回值类型一致;方法参数列表需要和原函数一致,或者可以额外多一个;

注意:这里可以这样理解blockHandler和fallback,fallback处理业务逻辑的异常,服务降级,blockHandler处理sentinel组件控制的阻断异常。

2、使用案例

9001接口服务

@Service
public class FlowServiceImpl implements FlowService {
    @Resource
    private JdbcTemplate jdbcTemplate ;
    @SentinelResource(value = "getPhone",blockHandler = "exceptionHandler", fallback = "fallback")
    @Override
    public String getPhone(Integer id) {
        String sql = "select phone from d_phone WHERE id="+id ;
        Integer.parseInt("hand") ;
        return jdbcTemplate.queryForList(sql,String.class).get(0) ;
    }
    // 降级处理
    public String fallback(Integer id) {
        return "服务降级,id="+id ;
    }
    // 异常处理
    public String exceptionHandler(Integer id,BlockException be) {
        be.printStackTrace();
        return "服务抛异常,id="+id ;
    }
}

9002请求服务

@RequestMapping(value = "/web/getJdbc",method = RequestMethod.GET)
public String getJdbc () {
    return msgFeign.getJdbc() ;
}

3、效果测试

通过控制台配置9001的限流规则,然后刷接口看效果。

注意阻断异常和业务异常的返参区别。

4、对比Hystrix组件

Hystrix的核心点在于以隔离和熔断为主的容错机制,超时或被熔断的调用将会快速失败,并可以提供 fallback 机制;

Sentinel核心点在于流量控制多样化,熔断降级服务,系统负载保护,实时监控和控制台;

补刀一句:对于流量控制类的组件,大部分场景是使用限流,服务降级这两块核心功能。

五、源代码地址

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-cloud-base
GitEE地址:知了一笑
https://gitee.com/cicadasmile/spring-cloud-base

微服务系列组件

Eureka组件之服务注册与发现

Ribbon和Feign组件实现负载均衡

Hystrix组件实现服务熔断

Turbine组件,实现微服务集群监控

Zuul组件,实现路由网关控制

Config组件,实现配置统一管理

Zipkin组件,实现请求链路追踪

组件总结,与Dubbo框架、Boot框架对比

阿里开源组件Nacos,服务和配置管理

分库分表模式下,数据库扩容方案描述

分库分表模式,数据库扩容方案实现

原文地址:https://www.cnblogs.com/cicada-smile/p/12544279.html

时间: 2024-08-02 15:53:31

SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级的相关文章

Dubbo学习系列之十(Sentinel之限流与降级)

各位看官,先提个问题,如果让你设计一套秒杀系统,核心要点是啥???我认为有三点:缓存.限流和分离.想当年12306大面积崩溃,还有如今的微博整体宕机情况,感觉就是限流降级没做好,"用有限的资源响应过量请求"——这就是限流降级的核心.限流降级组件,当今开源界应该是Hystrix最为出名,这也得益于SpringCloud的流行,当然,挑战者总是有的,于是Sentinel横空出世,正因实际生产使用中似乎并不多见,所以才有必要拿来一用,不然就脱离了此系列文章的主旨了,就是要见些不一样的风景!

微服务架构下组件管理规范

软件开发行业,经过一个或多个项目之后,企业都会沉淀出许多非常优秀的组件,这些优秀的组件能够为今后其他的项目提供便利的基础.总体而言,企业的沉淀的组件大致可分为三类:程序类组件.数据类组件.配置类组件. 程序类组件:程序类组件是最常见的组件,包括常见的java.go.python等代码,经过构建之后,用于可独立部署或使用的介质,如:日志工具类.日期工具类.字符串工具类.邮件发送工具类等: 数据类组件:在应用的变更过程中,一般都会涉及到数据库的变更,包括数据库的备份与恢复,数据表的备份与恢复,以及按

鹰眼跟踪、限流降级,EDAS的微服务解决之道

本文主要从服务化的起源开始讲起,围绕EDAS介绍这些年来,随着阿里庞大的电商技术平台流量和并发不断攀升过程中,中间件的微服务技术面临的一系列挑战及解决方法.同时,也会向读者介绍历次双十一背后,EDAS服务化技术的演进历程. 服务化的起源 微服务的解决之道 海量微服务的挑战 关于作者 以下为精彩内容整理: 服务化的起源 阿里巴巴前期技术现状 当时阿里巴巴技术团队规模有500人左右,整个技术网站使用单一War应用,基于传统应用开发架构,业务每年翻倍增长. 我们面临着非常多的问题: 上百人维护一个核心

Spring Cloud微服务Sentinel+Apollo限流、熔断实战

在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实项目实践过程,这中间被不少网络Demo示例级别水文误导过,为了以正视听特将实践过程加以总结,希望能够帮到有类似需要的朋友! 一.Sentinel概述 在基于Spring Cloud构建的微服务体系中,服务之间的调用链路会随着系统的演进变得越来越长,这无疑会增加了整个系统的不可靠因素.在并发流量比较高

Android窗口管理服务WindowManagerService显示Activity组件的启动窗口(Starting Window)的过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8577789 在Android系统中,Activity组件在启动之后,并且在它的窗口显示出来之前,可以显示一个启动窗口.这个启动窗口可以看作是 Activity组件的预览窗口,是由WindowManagerService服务统一管理的,即由WindowManagerService服务负责 启动和结束.在本文中,我们就详细分析WindowManag

配置管理 ACM 在高可用服务 AHAS 流控降级组件中的应用场景

应用配置管理(Application Configuration Management,简称 ACM)是一款应用配置中心产品.基于ACM您可以在微服务.DevOps.大数据等场景下极大地减轻配置管理的工作量,同时保证配置的安全合规.ACM 有着丰富的使用场景,本文将介绍其在 AHAS 流控降级 中的应用. 什么是 AHAS 流控降级AHAS 流控降级 是面向分布式服务架构的专业流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统保护等多个维度帮助您保障服务的稳定性,同时提供强大的聚合监控

Android窗口管理服务WindowManagerService对窗口的组织方式分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8498908 我们知道,在Android系统中,Activity是以堆栈的形式组织在ActivityManagerService服务中的.与 Activity类似,Android系统中的窗口也是以堆栈的形式组织在WindowManagerService服务中的,其中,Z轴位置较低的窗口 位于Z轴位置较高的窗口的下面.在本文中,我们就详细分析Win

Spring Cloud Alibaba | Sentinel: 服务限流基础篇

目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定义资源 2.4 注解方式定义资源 2.5 异步调用支持 3. 规则的种类 3.1 流量控制规则 (FlowRule) 3.2 熔断降级规则 (DegradeRule) 3.3 系统保护规则 (SystemRule) 3.4 访问控制规则 (AuthorityRule) Spring Cloud Al

Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例

这一节我们通过一个简单的实例,学习Sentinel的基本应用. 一.Sentinel 限流核心概念 在学习Sentinel的具体应用之前,我们先来了解一下Sentinel中两个核心的概念,资源和规则. 资源 资源 是 Sentinel 中的核心概念之一.既然是限流,或者系统保护,那么是针对什么做限流?保护的是什么?就是我们所说的资源. 其实 Sentinel 对资源的定义,和并发编程中 Synchronized的使用很类似,这里的资源,可以是服务里的方法,也可以是一段代码. 规则 定义了资源之后