SpringCloud学习6(Spring Cloud Alibaba)断路器Sentinel熔断降级

文章目录

  • 服务熔断降级Sentinel
    • 高并发请求模拟(这里我们使用contiperf来进行测试)
      • 修改tomcat配置最大线程数
      • 引入测试依赖
      • 编写测试代码
  • 服务雪崩
    • 服务雪崩的容错方案(隔离、超时、限流、熔断、降级)
      • 隔离机制:
      • 超时机制:
      • 限流机制:
      • 熔断机制:
      • 降级机制:
    • 常见的容错组件
      • Sentinel
        • Sentinel特征
        • Sentinel俩大部分
  • 项目集成Sentinel与Sentinel控制面板
    • 项目集成Sentinel
      • 引入依赖
      • 增加配置
    • 安装Sentinel控制台
      • 下载
      • 启动
      • 访问:地址[localhost:8080]()(默认用户/密码:sentinel/sentinel)
  • Sentinel功能使用
    • 流控规则限制
      • 流控维度
      • Sentinel规则种类
      • Sentinel控制实现原理AOP(热插拔、责任链模式)
      • 流控模式
        • 关联流控模式
        • 链路流控模式
          • 案例
      • 流控效果
    • 熔断降级规则
      • 慢调用比例
      • 异常比例
      • 异常数
    • 热点规则(注意加上注解 @SentinelResource)
    • 授权规则
    • 系统规则
  • 自定义Sentinel返回值
  • @SentinelResource 使用了解
  • Feign集成Sentinel走降级
    • 在配置文件开启支持
    • 编写降级容错类
    • 为feign客户端配置降级容错类

SpringCloud、SpringCloudAlibaba、SpringBoot版本选择。为了避免各种千奇百怪的bug,我们还是采用官方推荐的毕业版本。
在这里插入图片描述

服务熔断降级Sentinel

高并发请求模拟(这里我们使用contiperf来进行测试)

修改tomcat配置最大线程数

server:
  port: 8882
#  为了模拟高并发请求,将tomcat最大并发数修改为10
  tomcat:
    threads:
      max: 10

引入测试依赖

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.7</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.databene</groupId>
    <artifactId>contiperf</artifactId>
    <version>2.1.0</version>
    <scope>test</scope>
</dependency>

编写测试代码

@RequestMapping("/thread")
public String thread() throws InterruptedException {
    TimeUnit.SECONDS.sleep(2);
    return "Cloud2OrderApp  thread";
}
public class ContiPerfTest {
    @Rule
    public ContiPerfRule i = new ContiPerfRule();
	// invocations 并发数     threads 线程数
    @Test
    @PerfTest(invocations = 100, threads = 200)
//    @Required(max = 100000, average = 250, totalTime = 100000)
    public void test1() throws Exception {
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject("http://localhost:8882/thread", String.class);
        System.out.println(result);
    }
}

这里同时我们在浏览器去请求该地址,响应会变得很慢
测试结论:此时会发现由于thread接口囤积大量请求,导致index方法访问出现问题,这就是服务雪崩的雏形。

服务雪崩

当一个接口高频访问耗费完资源会影响到其他接口的正常访问,这个场景扩展到不同的微服务会导致服务雪崩
由于服务与服务之间的依赖性,故障会传播,对整个微服务系统早长城灾难性的严重后果,这就是故障的雪崩效应。
在这里插入图片描述
雪崩发生的原因是多样的,可能是设计的容量不合理,或者是高并发下某一个方法相应很慢,或者某台机器的资源消耗殆尽。我们无法完全杜绝雪崩源头的发生,只有做好足够的容错机制,保证在一个服务发生问题,不会影响其他服务的正常运作。

服务雪崩的容错方案(隔离、超时、限流、熔断、降级)

要防止雪崩扩散,就要做好服务的容错机制。
常见的容错思路:隔离、超时、限流、熔断、降级

隔离机制:

在这里插入图片描述

超时机制:

上有服务调用下游服务的时候,设置一个最大响应时间,如果超时,下游未做出响应则自动断开请求,释放线程。

在这里插入图片描述

限流机制:

限制系统输入输出流量以达到保护系统目的。为了保证系统稳定运行,一旦达到阈值,就需要限流采取措施来完成限流目的。
在这里插入图片描述

熔断机制:

当下游服务因为访问压力过大而响应变慢或者失败,上游服务为保证系统整体可用,暂时切断对下游服务调用。牺牲局部来保证整体可用性。
在这里插入图片描述熔断一般有三种状态:

  • 熔断关闭状态(Close):服务没有故障时,断路器的状态,对调用方不做任何限制
  • 熔断开启状态(Open):后续对该服务接口调用不再经过网络,直接执行本地fallback方法
  • 半熔断状态(Half-Open):尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,说明服务已经恢复,进入熔断关闭状态。如果成功率仍然很低,则重新进入熔断开启状态。

降级机制:

降级就是给服务提供一个最低的兜底方案,一旦服务无法正常调用,则使用该兜底方案。
在这里插入图片描述

常见的容错组件

Hystrix:Netflix开源的延迟容错库。隔离访问远程系统、服务,防止级联失败,提高系统可用性与容错性。
Resilience4J:轻量、简单、文档清晰、丰富的熔断工具。Hystrix官方推荐替代方案。支持SpringBoot1/2,支持Prometheus监控。
Sentinel:alibaba开源断路器实现。稳定。分布式系统的流量防卫兵。

Sentinel

一套用于服务容错的综合性解决方案。以流量为切入点,从流量控制、熔断降级、系统负载保护等多维度来保护系统稳定性。

Sentinel特征

  • 丰富的应用场景:秒杀、消息削峰、集群流量控制、实时熔断下游不可用应用等
  • 完备的实时监控:可以看到应用的单台机器秒级数据,500台以下规模的集群汇总运行情况。
  • 广泛的开源生态:开箱即用的与其他开源库整合模块。引入依赖即可使用。

Sentinel俩大部分

  • 核心库(Client):不依赖任何框架,可以运行于所有Java运行时环境。同时对Dubbo/SpringCloud等框架有较好支持。
  • 控制台(Dashboard):基于SpringBoot开发,打包可以直接运行,无需tomcat容器。

项目集成Sentinel与Sentinel控制面板

项目集成Sentinel

引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
</dependency>

增加配置

spring:
  cloud:
    sentinel:
      transport:
        port: 8719  # 与控制台交流的端口,随意指定一个未使用的端口即可
        dashboard: localhost:8080 	# 指定控制台服务的地址

安装Sentinel控制台

下载

下载安装包:https://github.com/alibaba/Sentinel/releases/tag

sentinel-dashboard-2.0.0-alpha-preview.jar :https://github.com/alibaba/Sentinel/releases/tag/2.0.0-alpha

启动

# 直接使用java -jar命令启动项目(控制台本身是一个SpringBoot项目)
# -Dserver.port=8080 指定端口。
# -Dcsp.sentinel.dashboard.server=localhost:8080 指定控制台地址和端口,会自动向该地址发送心跳包。地址格式为:hostIp:port  配置成localhost:8080即监控自己
# -Dproject.name=sentinel-dashboard  指定Sentinel控制台程序显示名称
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

访问:地址localhost:8080(默认用户/密码:sentinel/sentinel)

如果出不来这个监控项,要多访问几次项目
在这里插入图片描述

Sentinel功能使用

流控规则限制

资源名称:唯一名称,默认是请求路径,可以自定义
针对来源:针对哪个微服务进行限流,默认default不区分,全部限制
是否集群:
阈值类型/单机阈值:

  • QPS(每秒请求数):当调用你接口QPS达到阈值,进行限流
  • 线程数:当调用接口线程数达到阈值,进行限流

在这里插入图片描述
多访问几次就会被流控在这里插入图片描述

流控维度

Sentinel规则种类

流控规则、降级规则、热点规则、系统规则、授权规则

Sentinel控制实现原理AOP(热插拔、责任链模式)

流量控制的原理:监控应用流量的QPS或并发线程数等指标,当达到指定阈值时对流量进行控制,以避免被瞬时流量高峰冲垮,从而保证应用的高可用。
在这里插入图片描述在这里插入图片描述

流控模式

  • 直接(默认):当接口达到限流条件时,开启限流
  • 关联:当关联的资源达到限流条件时,开启限流(适合做应用让步)
  • 链路:当从某个接口过来的资源达到限流条件时,开启限流

关联流控模式

数据库读写操作相互影响。如果写操作过多,会造成读的性能下降。
或者比如下单接口后调用支付接口,如果下单访问过多占用支付接口性能。
在这里插入图片描述

链路流控模式

链路流控模式是指,当某个接口过来的资源达到限流条件时,开启限流。

案例
  1. 在配置文件中关闭sentinel的web-context-unify
spring:
  cloud:
    sentinel:
      transport:
      web-context-unify: false

在这里插入图片描述

流控效果

  • 快速失败(默认):直接失败,抛出异常,不做任何额外处理,是最简单的结果。
  • WarmUp:从开始阈值到最大QPS会有一个缓冲阶段,一开始的阈值是最大QPS的1/3,然后慢慢增长,知道最大阈值,适用于突然增大的流量转换为缓慢增长的场景
  • 排队等待:让请求以均匀的速度通过,单机阈值以每秒通过数量,其余的排队等待,会让设置一个超时时间,当请求超过时间还未处理则会被丢弃。

熔断降级规则

  • 慢调用比例:响应时间超长的请求数比例
  • 异常比例:请求异常比例
  • 异常数:请求异常数量

慢调用比例

下面配置表示在1秒内超过5个请求,且这些请求中的响应时间大于最大RT时间的10%就触发熔断。在接下来的10秒内都不调用真实方法处理。直接走降级方法。在这里插入图片描述

异常比例

下面配置表示在1秒内有超过1个请求的10%就触发熔断,熔断时间间隔5秒。
在这里插入图片描述

异常数

下面配置表示1秒内5个请求中,有三次异常就触发熔断。熔断间隔时间5秒。
在这里插入图片描述

热点规则(注意加上注解 @SentinelResource)

热点是指经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的top n条数据,并推起进行访问控制。
如:统计一段时间内最常购买的商品ID并进行限制。对一段时间内频繁访问的用户ID进行限制。防止刷赞等。

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数
在这里插入图片描述

授权规则

很多时候,需要根据调用来源来判断你请求是否允许放行,这时候可以使用sentinel的来源访问控制(黑白名单)功能。来源访问控制根据资源的请求(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时可以通过,若配置黑名单,则请求来源位于黑名单时不通过,其余可以通过。
在这里插入图片描述

系统规则

  • Load自适应(仅对Linux/Unix机器有效):系统load1作为启发指标,进行自适应系统保护,当系统load1超过设定的阈值,且系统当前并发线程数超过估算的系统容量才会触发系统保护(BBR阶段)。
    系统容量由系统的maxQPS * minRT估算。设定参考值一般是CPU cores * 2.5.
  • CPU usage:当系统cpu使用率超过阈值就触发保护。(取值0.0-1.0)比较灵敏。
  • 平均RT:当单台机器上所有入口流量的平均RT达到阈值就触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值就触发系统保护。
  • 入口QPS:当单台机器上所有入口流量的QPS达到阈值就触发系统保护。
    在这里插入图片描述

自定义Sentinel返回值

当前面设定规则没有满足,可以自定义异常返回。

  • FlowException :限流异常
  • DegradeException :降级异常
  • ParamFlowException : 参数限流异常
  • AuthorityException : 授权异常
  • SystemBlockException : 系统负载异常
package com.hx.sentinel.error;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang.CharSet;
import org.apache.http.Consts;
import org.apache.http.entity.ContentType;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.Charset;

/**
 * @author Huathy
 * @date 2023-04-04 23:58
 * @description
 */
@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        Result result = null;
        if (e instanceof FlowException) {
            result = new Result(500101, "接口限流");
        } else if (e instanceof DegradeException) {
            result = new Result(500102, "接口降级");
        } else if (e instanceof ParamFlowException) {
            result = new Result(500101, "接口参数限流");
        } else if (e instanceof AuthorityException) {
            result = new Result(500101, "授权异常");
        } else if (e instanceof SystemBlockException) {
            result = new Result(500101, "系统负载异常");
        } else {
            result = new Result(500101, e.getMessage());
        }
        response.setCharacterEncoding(Consts.UTF_8.name());
        response.setContentType(ContentType.APPLICATION_JSON.getMimeType());
        response.getWriter().write(JSON.toJSONString(result));
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    class Result {
        int code;
        String msg;
    }
}

@SentinelResource 使用了解

用于定义资源,并提供可选的异常处理和fallback配置项。
在这里插入图片描述

@RestController
public class AnnoController {
    // 需求:当触发流控规则后,默认向抛出异常。
    // 此时业务需要在抛出异常前,进行额外业务处理。或返回默认参数
    @RequestMapping("/anno1")
    @SentinelResource(value = "/anno1", blockHandler = "anno1BlockHandler", fallback = "anno1Fallback")
    public Map<String, Object> anno1(String pm) {
        if(pm == null || "".equals("")){
            throw new RuntimeException("参数为空!");
        }
        Map<String, Object> res = new HashMap<>();
        res.put("code", 200);
        res.put("msg", "请求成功");
        res.put("param", pm);
        return res;
    }

    /**
     * 当触发流控规则之后,立即触发该方法。
     * 需要注意该handler方法的参数列表要与原方法一致,并在最后加上异常参数BlockException ex
     */
    public Map<String, Object> anno1BlockHandler(String param, BlockException e) {
        System.out.println("anno1 流控触发");
        Map<String, Object> res = new HashMap<>();
        res.put("code", 403);
        res.put("msg", "触发流控默认返回方法");
        res.put("param", param);
        res.put("exception", e);
        return res;
    }

    /**
     * 当anno1方法执行报错的时候,立即触发该方法
     * @param param
     * @param e
     * @return
     */
    public Map<String, Object> anno1Fallback(String param, Throwable e) {
        Map<String, Object> res = new HashMap<>();
        res.put("code", 500);
        res.put("msg", "处理出错,默认返回");
        res.put("param", param);
        res.put("exception", e);
        return res;
    }
}

Feign集成Sentinel走降级

在配置文件开启支持

feign:
  sentinel:
    enabled: true

编写降级容错类

@Component
public class ProductFallService implements ProductService {
    @Override
    public String index() {
        return "熔断降级了!";
    }
}

为feign客户端配置降级容错类

@FeignClient(value = "cloud2-product-server", fallback = ProductFallService.class)
public interface ProductService {
    @GetMapping("/")
    String index();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/8164.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Baumer工业相机堡盟工业相机如何设置网口的IP地址(工业相机连接的网口设置IP地址步骤)

Baumer工业相机堡盟工业相机如何设置网口的IP地址&#xff08;工业相机连接的网口设置IP地址步骤&#xff09;Baumer工业相机Baumer工业相机设置网络端口IP地址匹配设置网络端口IP地址和工业相机IP地址匹配第一次打开CameraExplorer软件确认问题为IP地址不匹配问题打开网络连接…

C++ - 继承 | 菱形继承

之前的文章中我们简要的讲述了C中继承部分的知识&#xff0c;但是还没有完全的讲完&#xff0c;在本文中将会讲到菱形继承的问题。 复杂的菱形继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承。 多继承&#xff1a;一个子类有两个或以上直接父类时…

最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,看看你差了多少...

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况&#xff0c;但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况&#xff0c;非技术线(如产品、运营、…

Android基础四大组件之Activity的启动过程源码解析

前言 Activity是Android中一个很重要的概念&#xff0c;堪称四大组件之首&#xff0c;关于Activity有很多内容&#xff0c;比如生命周期和启动Flags&#xff0c;这二者想要说清楚&#xff0c;恐怕又要写两篇长文&#xff0c;更何况分析它们的源码呢。不过本文的侧重点不是它们…

面试官:你可以用 for of 遍历 Object 吗?

本文以 用 for of遍历 Object 为引 来聊聊 迭代器模式。 什么是迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露该对象的内部表示。 ——《设计模式&#xff1a;可复用面向对象软件的基础》 可以说迭代器模式就是为了遍历存在的。提…

HTML5 <body> 标签

HTML <body> 标签 实例 一个简单的 HTML 文档&#xff0c;包含尽可能少的必需的标签&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>文档标题</title> </head><body> 文档内容…

单例设计模式解读

目录 单例设计模式介绍 单例设计模式八种方式 饿汉式&#xff08;静态常量&#xff09; 饿汉式&#xff08;静态代码块&#xff09; 懒汉式(线程不安全) 懒汉式(线程安全&#xff0c;同步方法) 懒汉式(线程安全&#xff0c;同步代码块) 懒汉式(线程安全&#xff0c;同步…

libcurl库的安装及使用说明

目录 一 libcurl库安装 ① 下载网址 ② libcurl库安装步骤 ③ libcurl等第三方库的通用编译方法 二 调用libcurl编程访问百度主页 ① 代码说明 ② 编译说明 ③ 执行说明 三 libcurl的使用说明 ① curl相关函数简介 ② curl_easy_setopt函数部分选项介绍 ③…

【AUTOSAR】【Can通信】CanSM

目录 一、概述 二、限制说明 三、功能说明 3.1 基础需求 3.2 CAN网络的状态机 3.3 错误分类 3.3.1 开发错误 3.3.2 运行错误 3.3.3 拓展生产错误 3.4 ECU在线主动/被动模式 四、API接口 4.1 API定义 4.2 调度接口 一、概述 该文档描述了AUTOSAR基本软件模块CAN状态…

2023年第十四届蓝桥杯Java_大学B组真题

Java_B组试题 A: 阶乘求和试题 B: 幸运数字试题 C: 数组分割试题 D: 矩形总面积试题 E: 蜗牛试题 F: 合并区域试题 G: 买二赠一试题 H: 合并石子试题 I: 最大开支试题 J: 魔法阵【考生须知】 考试开始后&#xff0c;选手首先下载题目&#xff0c;并使用考场现场公布的解压密码解…

编译技术-词法理论

一、文法的种类 1.1 分类定义 Chomsky 文法定义&#xff1a; G(V,Vt,P,Z)G (V, V_t, P, Z)G(V,Vt​,P,Z)VVV&#xff1a;符号集合VtV_tVt​&#xff1a;终结符号集合PPP &#xff1a;有穷规则集合ZZZ&#xff1a;是被符号&#xff0c;不能是终结符 关于不同文法的区别 类型…

【多线程与高并发(锁)】1、锁的概念、分类和状态

1、锁的概念 java当中的锁、是在多线程环境下为保证共享资源健康、线程安全的一种手段。 线程操作某个共享资源之前&#xff0c;先对资源加一层锁&#xff0c;保证操作期间没有其他线程访问资源&#xff0c;当操作完成后&#xff0c;再释放锁。 2、锁的分类 Java中的锁按照…

ChatGPT对我们的影响-ChatGPT能给我们带来什么

ChatGPT日常应用 ChatGPT是一种应用广泛的自然语言处理算法&#xff0c;其可以应用于多种日常场景。以下是一些ChatGPT的日常应用&#xff1a; 聊天机器人&#xff1a;ChatGPT可用于构建聊天机器人&#xff0c;通过与用户进行自然语言交互来提供个性化的服务和支持。 新闻稿和…

MyBatis零基础入门实践

MyBatis一、MyBatis简介1、MyBatis历史2、MyBatis特性3、MyBatis下载4、和其它持久化层技术对比二、搭建MyBatis1、开发环境2、创建maven工程3、创建MyBatis的核心配置文件4、创建mapper接口5、创建MyBatis的映射文件6、通过junit测试功能7、加入log4j日志功能三、核心配置文件…

代码随想录算法训练营第五十天 | 123. 买卖股票的最佳时机 III、188. 买卖股票的最佳时机 IV

123. 买卖股票的最佳时机 III 关键在于至多买卖两次&#xff0c;这意味着可以买卖一次&#xff0c;可以买卖两次&#xff0c;也可以不买卖。 动规五部曲&#xff1a; 1、确定dp数组以及下标的含义 一天一共就有五个状态&#xff0c; 没有股票第一次持有股票第一次不持有股…

SPI协议

SPI协议 物理层 信号线 SCK(Serial Clock)&#xff1a;时钟线 MOSI(Master Output&#xff0c; Slave Input )&#xff1a;主设备输出&#xff0c;从设备输入 MISO(Master Input,&#xff0c; Slave Output)&#xff1a;主设备输入&#xff0c;从设备输出 SSN&#xff08;…

API 测试 | 了解 API 接口测试 | API 接口测试指南

什么是 API&#xff1f; API 是一个缩写&#xff0c;它代表了一个 pplication P AGC 软件覆盖整个房间。API 是用于构建软件应用程序的一组例程&#xff0c;协议和工具。API 指定一个软件程序应如何与其他软件程序进行交互。 例行程序&#xff1a;执行特定任务的程序。例程也…

Redux的基本使用详解(从入门到入土)

Redux的基本使用过程详解 学习文档 中文文档: http://www.redux.org.cn/ 英文文档: https://redux.js.org/ Github: https://github.com/reactjs/redux 一&#xff0c;redux是什么 1&#xff0c;介紹&#xff1a; redux是一个专门用于做状态管理的JS库(不是react插件库)。它…

程序员讨厌的“笔试题”,还有存在的必要性吗?

面试&#xff0c;是我们拿到offer的必经之地&#xff0c;在面试中我们会遇到各种“刁难”&#xff0c;而让程序员最为排斥的&#xff0c;非“笔试题”莫属。 △ 截图来源脉脉&#xff0c;如侵删 为什么程序员越来越排斥做面试题呢&#xff1f;我们先来看看网友们的说法&#x…

【Vue2从入门到精通】深入浅出,带你彻底搞懂Vue2组件通信的9种方式

文章目录Vue组件间通信分类1.props / $emit1.1 父组件向子组件传值1.2 子组件向父组件传值2.$parent / $children3.ref / $refs3.1 ref作用于组件3.2 ref作用于Html标签3.3 $nextTick()4.EventBus &#xff08;$emit / $on&#xff09;4.1 初始化4.2 发送事件4.3 接收事件4.4 移…
最新文章