SpringCloud-Alibaba-Sentinel-分布式系统的流量防卫兵与流量监控-入门

x33g5p2x  于2021-12-18 转载在 其他  
字(3.9k)|赞(0)|评价(0)|浏览(351)

前言:
Sentinel:分布式系统的流量防卫兵

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 分为两个部分:

核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
重点来 他是一个jar包,所以就操作比较简单 Java -jar…就可以,操作简单
这些Sentinel给的介绍,官网地址:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
他和第一版 cloud的SpringCloud-Hystrix熔断器服务降级做对比的话 首先不从代码上讲,SpringCloud-Hystrix的监控需要单独一个符才可以做,而Sentinel他一单独的一个项目运行的,在代码上也简化了不少了 我为什么这么说呢,因为Sentinel都是可视化配置配合注解 完成,服务降级,限流等
想用Sentinel首相可定去官网下载Sentinel的jar包
下载地址:https://github.com/alibaba/Sentinel/releases/tag/v1.8.0
这最新的版本

这都不用说说了把拉倒底点击下载

运行Sentinel

前提 jdk 1.8
端口是:8080 检查一下8080端口是否被占用 被占用起不来
从目下打开cmd窗口

Java -jar sentinel-dashboard-1.8.0.jar

启动成功访问Sentinel界面
账号:sentinel
密码:sentinel

登陆成功:

现在启动完成 ,结合项目使用

案例:
pom:
两个依赖 一个是sentinel 做持久化的 就是数据库 一个是sentinel

<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

yml
port: 8719 如果端口被占用 就从8719+1开始 一直找到那个端口没被占用为止

server:
  port: 8092
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719

management:
  endpoints:
    web:
      exposure:
        include: '*'

启动类:

package com.tang.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class SentinelService8092 {

    public static void main(String[] args) {
        SpringApplication.run(SentinelService8092.class,args);
    }
}

测试类写个方法就可以
Sentinel是 懒加载机制所以呢 需要访问一下接口即可
再去访问Sentinel 就有数据了

Sentinel流控监测
资源名:唯一名称请求路径

针对来源:Sentinel可以针对调用者进行限流,填写微服务的名 默认default(不区分来源)
阀值类型/单机阀值:QPS(每秒请求的数量)当前调用api的QPS达到阀值的 时候进行限流
进程数当调用该api的线程达到了阀值的时候限流

流控模式:
直接:是 api达到了限流的条件时直接限流
关联:当关联的资源达到阀值的时候就限流自己
链路:只记录指定链路的流量
流控效果:
快速失败:直接抛异常
wan Up:根据codeFactor(冷加载因子默认3)的值 从阀值/codeFactor,进过预热时长才打到设置的QPS阀值

排队等待:均速排队,让请求以均速通过,阀值类型必须是QPS否则无效

来测试一下 QPS

QPS单机阀值是1代表的是一秒一次

如果点的过快的话直接抛异常

线程的阀值是·1的话 值允许一个线程进去如果在进一个就会抛异常、
Blocked by Sentinel (flow limiting)

关联
QPS阀值是1 意思是 当/select/test1访问达到了阀值 /select/test的这个接口就会被限流

根据调用链路入口限流:链路限流
NodeSelectorSlot 中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。这棵树的根节点是一个名字为 machine-root 的虚拟节点,调用链的入口都是这个虚节点的子节点。

一棵典型的调用树如下图所示:

machine-root
                /       \
               /         \
         Entrance1     Entrance2
            /             \
           /               \
  DefaultNode(nodeA)   DefaultNode(nodeA)

上图中来自入口 Entrance1 和 Entrance2 的请求都调用到了资源 NodeA,Sentinel 允许只根据某个入口的统计信息对资源限流。比如我们可以设置 strategy 为 RuleConstant.STRATEGY_CHAIN,同时设置 refResource 为 Entrance1 来表示只有从入口 Entrance1 的调用才会记录到 NodeA 的限流统计当中,而不关心经 Entrance2 到来的调用。

调用链的入口(上下文)是通过 API 方法 ContextUtil.enter(contextName) 定义的,其中 contextName 即对应调用链路入口名称。详情可以参考 ContextUtil 文档。

3.3 具有关系的资源流量控制:关联流量控制
当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。

Warm Up:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处理低水平的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加

到阈值的上限,给系统一个预热的时间,避免冷系统被压垮

意思WarmUp吗,默认是3阀值预热时间超过10秒才能到达我能的我的想要的效果一秒10个请求

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。详细文档可以参考 流量控制 - 匀速器模式,具体的例子可以参见 PaceFlowDemo。

相关文章