• 智牛股项目--02


    交易平台 - Day 2

    学习目标

    目标1: CAT链路监控简介与原理

    目标2: CAT搭建配置与使用

    目标3: Sentinel简介与原理

    目标4: Sentinel配置与使用

    第1章 CAT链路监控

    1. 目标

    • 了解CAT链路监控平台

    • 了解CAT链路监控机制与基本原理

    2. 分析

    • 背景

    • 简介

    • 优势

    • 功能报表

    • Google Dapper分布式跟踪系统理论

    • Dapper部署架构

    • 链路监控机制

    • CAT的架构设计

    3. 讲解

    3.1 背景

    从单体架构到微服务架构的演变, 一个业务请求往往会流转多个服务, 大型互联网产品服务架构尤为复杂,腾讯的抢红包服务, 阿里的交易支付服务, 可能就流转成百上千个服务节点, 面对众多服务, 如何监控管理? 服务请求一旦出现问题, 如何快速定位问题? 如何保障服务的高可用, 做到全面的监控与预警? 如何分析统计服务的运行状况? 看下链路监控产品如何解决这些问题。

    3.2 CAT简介

    • CAT 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。

    • CAT 作为服务端项目基础组件,提供了 Java, C/C++, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。

    • CAT 很大的优势是它是一个实时系统,CAT 大部分系统是分钟级统计,但是从数据生成到服务端处理结束是秒级别,秒级定义是48分钟40秒,基本上看到48分钟38秒数据,整体报表的统计粒度是分钟级;第二个优势,监控数据是全量统计,客户端预计算;链路数据是采样计算。

    3.3 CAT优势

    • 实时处理:信息的价值会随时间锐减,尤其是事故处理过程中。

    • 全量数据:全量采集指标数据,便于深度分析故障案例。

    • 高可用:故障的还原与问题定位,需要高可用监控来支撑。

    • 故障容忍:故障不影响业务正常运转、对业务透明。

    • 高吞吐:海量监控数据的收集,需要高吞吐能力做保证。

    • 可扩展:支持分布式、跨 IDC 部署,横向扩展的监控系统。

    • 报表丰富: 帮助管理人员从各个角度了解系统的整体状况。

    3.4 CAT报表

    • 报错统计报表

    • 业务统计报表

    • LOGVIEW统计

    • 可视化LOGVIEW

    • 应用类型报表

    报表名称报表用途
    Transaction实时报表一段代码的运行时间/次数/分布、比如URL/Cache/SQL执行次数和响应时间
    Event实时报表事件产生的次数/分布,比如出现一个异常
    Problem实时报表根据Transaction/Event数据分析出来的系统出现的异常,包括访问较慢的程序等
    Heartbeat实时报表JVM内部一些状态信息,Load/Memory/GC/Thread等
    Metric实时报表业务指标采集监控报表
    Matrix实时报表一个请求调用分布统计(一次请求中调用多少次SQL/RPC/Cache等),可评估应用设计的合理性
    ......

    3.5 Google Dapper论文

    3.6 Dapper Deployment

    3.7 链路监控工作机制

    在链路监控的里面,如果是同一个链路监控那么他的traceID一定是相同的,如果是不同的链路,那他的TraceID一定事不同的,在进行调用的时候,spanID则代表了当service1,调用到不同的service2时会出现不同的spanID在后续进行相关的PID的调用的时候,则会反应到一个服务的sid

     链路在进行相关的返回的时候会进行相关的,追踪微服务节点的调用情况

    3.8 CAT架构设计

    整体设计简单即是最好原则设计, 主要分为三个模块cat-client,cat-consumer,cat-home。

    • cat-client 提供给业务以及中间层埋点的底层sdk。

    • cat-consumer 用于实时分析从客户端的提供的数据。

    • cat-home 作为提供给用户的展示的控制端。

    客户端设计

    客户端设计是CAT系统设计中最为核心的一个环节,客户端要求是做到API简单、高可靠性能、无论在任何场景下客户端都不能影响各业务服务的性能(监控只是公司核心业务流程一个旁路环节)。

    服务端设计服务端单机cat-consumer的整体架构:

    当某个报表处理器处理来不及时候,比如Transaction报表处理比较慢,可以通过配置支持开启多个Transaction处理线程,并发消费消息。

    4. 总结

    • CAT功能作用, 特点优势

    • CAT的统计报表,功能作用

    • Google Dapper分布式链路监控理论基础, 部署结构。

    • 链路的监控机制, 如何运作, 如何跟踪。

    • CAT的架构设计,特征, 核心模块,处理流程。

    第2章 CAT安装使用

    1. 目标

    • 安装与配置CAT服务

    • CAT的接入使用, 查看链路跟踪信息

    2. 步骤

    • 完成CAT单机部署

    • 拓展CAT集群部署

    • 服务设计

    • 工程结构

    • CAT集成事项

    • 启动验证

    3. 实现

    3.1 CAT单机部署

    环境要求

    1. JDK1.8+

    2. Tomcat8+

    3. MySQL5.7+

    CAT启动配置

    <font color=red>不建议在Windows下部署, 设计上对window支持不好, 容易出各种问题。</font>

    1. 下载CAT源码, 如GIT方式过慢, 可用Download Zip 方式打包下载。

    2. 构建CAT服务war包可以导入IDEA工程进行编译, 或者直接用MAVEN进行编译:将MAVEN加入到系统PATH, 执行mvn命令:

      mvn clean install -Dmaven.test.skip=true 
    1. 创建数据库

      先创建CAT数据库, 采用utf8mb4字符集, 再导入{CAT_SRC}/script/目录下的CatApplication.sql脚本。

    2. 配置修改运行盘下的/data/appdatas/cat和/data/applogs/cat有读写权限, 如果程序是在E盘, 则需创建e:/data/appdatas/cat目录

    • 配置/data/appdatas/cat/client.xml (客户端使用)

      <?xml version="1.0" encoding="utf-8"?>
      <config mode="client">
          <servers>
              <server ip="127.0.0.1" port="2280" http-port="8080"/>
          </servers>
      </config>
    • 配置/data/appdatas/cat/datasources.xml (服务端使用)

      <?xml version="1.0" encoding="utf-8"?>  
      <data-sources>
      <data-source id="cat">
          <maximum-pool-size>3</maximum-pool-size>
          <connection-timeout>1s</connection-timeout>
          <idle-timeout>10m</idle-timeout>
          <statement-cache-size>1000</statement-cache-size>
          <properties>
              <driver>com.mysql.jdbc.Driver</driver>
              <url><![CDATA[jdbc:mysql://127.0.0.1:3306/cat]]></url>  <!-- 请替换为真实数据库URL及Port  -->
              <user>root</user>  <!-- 请替换为真实数据库用户名  -->
              <password>root</password>  <!-- 请替换为真实数据库密码  -->
              <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
          </properties>
      </data-source>
      </data-sources>
    1. TOMCAT配置

      修改tomcat conf 目录下 server.xml, 检查好端口没有被其他程序占用。

      <Connector port="8080" protocol="HTTP/1.1"
              URIEncoding="utf-8"    connectionTimeout="20000"
                  redirectPort="8443" />  <!-- 增加  URIEncoding="utf-8"  -->  

      如果内存不足, 需作调整(linux)

      CATALINA_OPTS="-Xms1024m -Xmx2048m -Xss1024K  -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m"
    2. 启动

    正常可以看到后台:

    正在上传…重新上传取消

    3.2 CAT集群部署

    课程演示, 不作详细介绍, 具体可参考官方文档: CAT集群部署

    3.3 服务设计

    正在上传…重新上传取消正在上传…重新上传取消设计四个服务:网关服务、订单服务、账户服务和库存服务, 三层调用关系监控,

    Gateway->Order->Account、Stock

    3.4 工程结构

    正在上传…重新上传取消正在上传…重新上传取消

    • cat-demo: 父级工程

    • cat-demo-account: 账户服务工程

    • cat-demo-gateway: 网关服务工程

    • cat-demo-order: 订单服务工程

    • cat-demo-stock: 库存服务工程

    3.5 CAT集成事项

    • cat-demo父级工程的POM依赖:引用最新版本cat组件:

        <dependencies>
            <!-- spring boot 依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- Nacos服务注册发现依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <!-- Spring Boot 监控组件依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!-- CAT 组件依赖-->
            <dependency>
                <groupId>com.dianping.cat</groupId>
                <artifactId>cat-client</artifactId>
                <version>3.0.0</version>
            </dependency>
        </dependencies>
    • 请求接收拦截器拦截所有经过服务的请求, 为前置拦截器, 支持URL正则匹配CatFilterConfigure 配置类:

    @Configuration
    public class CatFilterConfigure {
    ​
        @Bean
        public FilterRegistrationBean catFilter() {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            CatServletFilter filter = new CatServletFilter();
            registration.setFilter(filter);
            registration.addUrlPatterns("/*");
            registration.setName("cat-filter");
            registration.setOrder(1);
            return registration;
        }
    }

    CatServletFilter实现类:

    package com.itcast.cat.demo.gateway.catutils;
    ​
    import com.dianping.cat.Cat;
    import com.dianping.cat.CatConstants;
    import com.dianping.cat.message.Message;
    import com.dianping.cat.message.Transaction;
    ​
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    ​
    public class CatServletFilter implements Filter {
        
        private String[] urlPatterns = new String[0];
    ​
        /**
         * 初始化配置
         * @param filterConfig
         * @throws ServletException
         */
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            String patterns = filterConfig.getInitParameter("CatHttpModuleUrlPatterns");
            if (patterns != null) {
                patterns = patterns.trim();
                urlPatterns = patterns.split(",");
                for (int i = 0; i < urlPatterns.length; i++) {
                    urlPatterns[i] = urlPatterns[i].trim();
                }
            }
        }
    ​
        /**
         * 请求过滤处理
         * @param servletRequest
         * @param servletResponse
         * @param filterChain
         * @throws IOException
         * @throws ServletException
         */
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    ​
            HttpServletRequest request = (HttpServletRequest) servletRequest;
    ​
            String url = request.getRequestURL().toString();
            for (String urlPattern : urlPatterns) {
                if (url.startsWith(urlPattern)) {
                    url = urlPattern;
                }
            }
    ​
            // cat 上下文信息设置
            CatContext catContext = new CatContext();
            catContext.addProperty(Cat.Context.ROOT, request.getHeader(CatHttpConstants.CAT_HTTP_HEADER_ROOT_MESSAGE_ID));
            catContext.addProperty(Cat.Context.PARENT, request.getHeader(CatHttpConstants.CAT_HTTP_HEADER_PARENT_MESSAGE_ID));
            catContext.addProperty(Cat.Context.CHILD, request.getHeader(CatHttpConstants.CAT_HTTP_HEADER_CHILD_MESSAGE_ID));
            Cat.logRemoteCallServer(catContext);
            
            Transaction t = Cat.newTransaction(CatConstants.TYPE_URL, url);
    ​
            try {
                // cat日志记录
                Cat.logEvent("Service.method", request.getMethod(), Message.SUCCESS, request.getRequestURL().toString());
                Cat.logEvent("Service.client", request.getRemoteHost());
    ​
                filterChain.doFilter(servletRequest, servletResponse);
    ​
                t.setStatus(Transaction.SUCCESS);
            } catch (Exception ex) {
                t.setStatus(ex);
                Cat.logError(ex);
                throw ex;
            } finally {
                t.complete();
            }
        }
    ​
    }
    ​
    • RestTemplate请求拦截器

      请求传递拦截器, 保存CAT调用链信息, 跟踪记录发送至外部服务的请求。

      CatRestInterceptor

    @Component
    public class CatRestInterceptor implements ClientHttpRequestInterceptor {
    ​
        @Override
        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
                throws IOException {
    ​
            Transaction t = Cat.newTransaction(CatConstants.TYPE_CALL, request.getURI().toString());
    ​
            try {
                HttpHeaders headers = request.getHeaders();
    ​
                // 保存和传递CAT调用链上下文
                Context ctx = new CatContext();
                Cat.logRemoteCallClient(ctx);
                headers.add(CatHttpConstants.CAT_HTTP_HEADER_ROOT_MESSAGE_ID, ctx.getProperty(Context.ROOT));
                headers.add(CatHttpConstants.CAT_HTTP_HEADER_PARENT_MESSAGE_ID, ctx.getProperty(Context.PARENT));
                headers.add(CatHttpConstants.CAT_HTTP_HEADER_CHILD_MESSAGE_ID, ctx.getProperty(Context.CHILD));
    ​
                // 继续执行请求
                ClientHttpResponse response =  execution.execute(request, body);
                t.setStatus(Transaction.SUCCESS);
                return response;
            } catch (Exception e) {
                Cat.getProducer().logError(e);
                t.setStatus(e);
                throw e;
            } finally {
                t.complete();
            }
        }
    }

    注意, RestTemplate的初始化配置:

        @Bean
        RestTemplate restTemplate() {
    ​
            RestTemplate restTemplate = new RestTemplate();
    ​
            // 保存和传递调用链上下文
            restTemplate.setInterceptors(Collections.singletonList(new CatRestInterceptor()));
    ​
            return restTemplate;
        }
    • <font color=red>注意</font>

      • resources资源目录, 路径META-INF下, 必须创建app.properties, 内部只要配置app.name属性。

      • 3.0版本后, client的配置抽离, 写在/data/appdatas/cat目录下的client.xml文件

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd">
        <servers>
            <server ip="10.10.20.10" port="2280" http-port="8080" />
        </servers>
    </config>

    服务最好要在Linux下运行, 源码没有正确识别windows盘符, 会有问题。

    3.6 启动验证

    1. Nacos控制台

      四个服务正常启动注册。注意: 这里打包时候Nacos指向地址为宿主机的HOST地址

      正在上传…重新上传取消

    2. 访问Gateway服务, 本示例是部署在Linux机器上, 地址: http://10.10.20.10:8081/gateway

      正在上传…重新上传取消正在上传…重新上传取消所有服务均正常返回结果:

    gateway service ==> Calling order service[order success] ==> Calling Account Service [account success] ==> Calling Customer Service [stock success]
    ​
    1. CAT控制台

     

    CAT的LOGVIEW按层级完整的记录了四个服务的请求信息, 1至4分别对应Gateway、Order、Account和Stock服务。

    LOGVIEW主要包含请求时间, 服务地址, 请求客户端等主要信息, 也支持图形方式呈现:

     

    CAT 还有很多指标统计与报表展示, 能有效帮助我们监控管理整体微服务调用链路状态。

    4. 总结

    • CAT的单机部署, 虚拟机下, 注意绑定的IP, TOMCAT下注意采用UTF8编码, 防止乱码, 如本机内存有限, 可以将CAT占用内存调小些。

    • 了解整体服务结构设计, 接入CAT使用验证, 查看链路跟踪信息。

    • 掌握LOGVIEW的关键信息, 服务地址, 客户端信息, 请求耗时等。

    这个地方我使用的是Windows进行相关的搭建的,在进行相关的搭建的时候,需要主要相关的配置,需要给对应的SpringBootApplication VM配置指定的代码,并且是每一个都要配置如果不配置就会报错

    出现的错误是对应的类找不到这个地方需要判断指定的client.xml的指定的位置才可以

     

    -Dfile.encoding=UTF-8 -DCAT_HOME=F:/data/appdatas/cat/

     

    对应的nacos中监控的服务的状态

     对应的控制台的指示

     

     

    错误的调用链

     

     

     

     

    第3章 Sentinel介绍

    1. 目标

    • 了解Sentinel组件

    • 了解Sentinel的工作原理, 功能特性与处理机制。

    2. 分析

    • 背景介绍

    • Sentinel 历史

    • 流量控制

    • 熔断降级

    • 主要特性

    • 开源生态

    • 工作原理

    3. 讲解

    3.1 背景

    ​ 微服务架构设计由众多微服务组成,为保障高可用,通常会采用集群方式部署。由于服务自身原因或网络等其他问题,并不能保证100%可用性, 若单个服务出现问题, 会导致进入该服务的线程阻塞, 如果大量请求, 服务可能瘫痪, 服务与服务之间的依赖性, 故障会传播, 产生雪崩效应, 为解决和规避此问题, 业界提出熔断器模型, 衍生出了Sentinel,Hystrix和Resilience4j等组件。

    Sentinel地址

    3.2 Sentinel历史

    • 2012 年Sentinel推出, 主要功能作为流量控制组件。

    • 2013-2017 年,Sentinel 在阿里巴巴集团内部迅速推广使用,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。

    • 2018 年,Sentinel 开源。

    3.3 流量控制

    ​ 流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状。

     

    3.4 熔断降级

    与Hystrix熔断理念一致, 主要控制调用链中的不稳定资源, 针对这些不同场景进行限制, 避免影响整体系统的稳定性, 防止出现穿透、雪崩等灾难性问题。在熔断实现上, Sentinel与Hystrix存在较大差异:

    • Hystrix 是通过线程池隔离, 增加线程切换开销,侵入性较强, 且异步方式,不便主线程控制处理。

    • Sentinel 前置处理, 限制请求线程并发数量来控制, 这样避免线程切换开销,侵入性低。

    • Sentinel 还可以针对响应时间对资源进行降级, 当某个资源出现响应时间过长, 所有对该资源的访问都会被拒绝, 直到配置的指定时间窗口之后才重新恢复访问。

    3.5 主要特性视图

     

    3.6 开源生态

     

    3.7 工作原理

    框架设计

     

    设计说明

    在 Sentinel 里面,所有的资源都对应一个资源名称以及一个 Entry。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 API 显式创建;每一个 Entry 创建的时候,同时也会创建一系列功能插槽(slot chain)。这些插槽有不同的职责,例如:

    • NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;

    • ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;

    • StatisticSlot 则用于记录、统计不同纬度的 runtime 指标监控信息;

    • FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;

    • AuthoritySlot 则根据配置的黑白名单和调用来源信息,来做黑白名单控制;

    • DegradeSlot 则通过统计信息以及预设的规则,来做熔断降级;

    • SystemSlot 则通过系统的状态,例如 load1 等,来控制总的入口流量;

    扩展机制Sentinel 将 SlotChainBuilder 作为 SPI 接口进行扩展,使得 Slot Chain 具备了扩展的能力。您可以自行加入自定义的 slot 并编排 slot 间的顺序,从而可以给 Sentinel 添加自定义的功能。

     

    4. 总结

    • 了解Sentinel的基本知识与功能作用。

    • 了解Sentinel的功能特性, 相比其他熔断限流组件, 有哪些特点。

    • 了解Sentinel的工作原理, 请求处理流程, 帮助我们更好的配置与排查实际问题。

    第4章 Sentinel使用

    1. 目标

    • Sentinel的接入使用

    • 掌握Sentinel控制台的管理使用

    2. 步骤

    • Dashboard控制台安装使用

    • Sentinel降级配置演示

    • Sentinel限流配置演示

    3. 实现

    3.1 Dashboard控制台

    Sentinel 控制台包含功能:

    • 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。

    • 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。

    • 规则管理和推送:统一管理推送规则。

    • 鉴权 :生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。

    GitHub下载地址下载最新版本。

    启动命令, 配置启动端口:

    java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090  -jar sentinel-dashboard-1.6.2.jar

    访问地址:http://127.0.0.1:8090/#/dashboard

    默认登陆账号与密码都是sentinel,也可以通过启动参数修改:

    -Dsentinel.dashboard.auth.username=sentinel 
    -Dsentinel.dashboard.auth.password=123456
    

     

     

     

    3.2 降级演示

    1. 平均响应时间演示当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。如果接下来 1s 内持续进入 5 个请求(即 QPS >= 5),它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。

    • 引用RtDegradeDemo示例

     

    • 集成Dashboard控制台POM文件加入依赖:

            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-transport-simple-http</artifactId>
            </dependency>

    启动参数,指定Dashboard地址:

       -Dcsp.sentinel.dashboard.server=127.0.0.1:8090

    或代码中添加:

       System.setProperty("csp.sentinel.dashboard.server", "127.0.0.1:8090");

    规则代码:

       private static void initDegradeRule() {
            List<DegradeRule> rules = new ArrayList<DegradeRule>();
            DegradeRule rule = new DegradeRule();
            rule.setResource(KEY);
            // set threshold rt, 10 ms
            rule.setCount(10);
            rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
            rule.setTimeWindow(10);
            rules.add(rule);
            DegradeRuleManager.loadRules(rules);
        }
    • 结果演示

     

    1. 异常比例演示当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。ExceptionRatioDegradeDemo类

        private static void initDegradeRule() {
            List<DegradeRule> rules = new ArrayList<DegradeRule>();
            DegradeRule rule = new DegradeRule();
            rule.setResource(KEY);
            // set limit exception ratio to 0.1
            rule.setCount(0.1);
            rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
            rule.setTimeWindow(10);
            // rule.setMinRequestAmount(20);
            rules.add(rule);
            DegradeRuleManager.loadRules(rules);
        }

    规则时间窗设为10秒, 降级比例为千分之一。

     

    3.3 限流演示

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

    流量控制,进行高峰的限制,控制不好进行相关的控制,一般就是针对具体的QPS进行相关的控制,QPS的具体实现就可以进行相关的QPS的相关的控制,可以对具体的QPS进行控制

    1. QPS限流策略FlowQpsDemo类,控制策略QPS限制为20。

    2. 设置对应的QPS 不能超过20,当峰值超过20,就会进行限制操作,限流会按照指定的要求,稳定控制在20以内

        private static void initFlowQpsRule() {
            List<FlowRule> rules = new ArrayList<FlowRule>();
            FlowRule rule1 = new FlowRule();
            rule1.setResource(KEY);
            // set limit qps to 20
            rule1.setCount(20);
            rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
            rule1.setLimitApp("default");
            rules.add(rule1);
            FlowRuleManager.loadRules(rules);
        }
    

     

     

     

    1. 并发线程限流策略FlowThreadDemo类,限制并发线程访问数为20。

        private static void initFlowRule() {
            List<FlowRule> rules = new ArrayList<FlowRule>();
            FlowRule rule1 = new FlowRule();
            rule1.setResource("methodA");
            // set limit concurrent thread for 'methodA' to 20
            rule1.setCount(20);
            rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD);
            rule1.setLimitApp("default");
    ​
            rules.add(rule1);
            FlowRuleManager.loadRules(rules);
        }

    输出结果:

     

    控制台监控:

     

    进行异常限制的异常,当异常的数量限制 在一定的数量,当超过一定的数量的时候就要进行相关的限制的数量,当count进行异常抛出的时候,会控制 

     

    QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 

     

     

     

     

    TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

    TPS 是指对应的查询接口,例如当一个网页内有很多AJAX接口,就会有很多网页查询,

    QPS 就是网页中单个接口所耗费的时间,TPS,是指整个页面中数据渲染完所耗费的时间

    一个TPS 包含多个QPS ,但是一个QPS 不会包含多个TPS

    CPU 一般会有超线程的处理,一般CPU 在处理多个请求的时候,会造出来多个线程来处理对应的请求数字,QPS ,大于线程数,并发线程数,实际工作的线程,线程限流控制

    4. 总结

    • 掌握Dashboard控制台的安装使用, 应用服务的接入配置。

    • Sentinel的降级与限流功能配置使用, 理解相关控制策略。

  • 相关阅读:
    /bin/bash: Resource temporarily unavailable
    【C语言】【结构体的位段】位段的内存分配及注意事项
    Java Double valueOf(double d)方法具有什么功能呢?
    解决CubeIDE调试时函数找不到源
    logging日志的使用
    理“ Druid 元数据”之乱
    HBase-集群部署
    景联文科技入选量子位智库《中国AIGC数据标注产业全景报告》数据标注行业代表机构
    day17正则表达式作业
    Shopee买家通系统的功能及优势介绍
  • 原文地址:https://blog.csdn.net/zgz102928/article/details/124817349