第六章 Hystrix断路器详解+环境搭建

2023-11-08

目录

一、Hystrix的背景及介绍

 1、分布式系统面临的问题

2、解决方案

3、Hystrix介绍

4、Hystrix服务熔断

二、搭建项目基础环境

1. 创建  父工程及公共api 见 第三章

2. 创建 Eureka 服务 见 第三章

3. 创建 订单(order-service )服务

       3.1 修改pom文件如下     

       3.2 订单服务中创建接口 IOrderFeignService  

       3.3 订单服务中创建 OrderController

     3.4 配置订单服务的配置文件

       3.5 创建订单服务的主启动类

4 创建商品(product-service )服务集群

     4.1 创建商品(product-service )服务

       4.2 创建productServer服务的主启动类

       4.3、配置 productServer 配置文件

       4.4、创建 ProductController

     4.5 创建商品服务提供者集群

5、进行测试


一、Hystrix的背景及介绍

 1分布式系统面临的问题

       分布式系统面临的问题:服务雪崩

       复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。

       多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃。会出现服务雪崩。

       所谓的“雪崩效应”对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

       在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会出现因等待出现故障的依赖方响应而形成任务积压,线程资源无法释放,最终导致自身服务的瘫痪,进一步甚至出现故障的蔓延最终导致整个系统的瘫痪。如果这样的架构存在如此严重的隐患,那么相较传统架构就更加的不稳定,如下图。

2、解决方案

      解决灾难性雪崩效应的方式通常有:降级、隔离、熔断、请求缓存、请求合并。 为了解决上述 存在的问题,因此产生了断路器等一系列的服务保护机制。

       “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

3、Hystrix介绍

        Hystrix是一个用于处理分布式系统的延迟容错开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。Hystrix中实现了服务降级服务熔断线程隔离请求缓存、请求合并以及服务监控等强大功能。目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

4、Hystrix服务熔断

        当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。因此熔断机制是应对雪崩效应的一种微服务链路保护机制。

        当一定时间内,异常请求比例(请求超时、网络故障、服务异常等)达到阀值时,启动熔断器,熔断器一旦启动,则会停止调用具体服务逻辑,通过fallback快速返回托底数据,保证服务链的完整。

        在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand。

        熔断有自动恢复机制,如:当熔断器启动后,每隔5秒,尝试将新的请求发送给服务提供者,如果服务可正常执行并返回结果,则关闭熔断器,服务恢复。如果仍旧调用失败,则继续返回托底数据,熔断器持续开启状态。

服务降级的情况包括:程序异常、超时、服务熔断触发降级、线程池/信号量大满也会触发降级

服务降级、服务熔断、服务限流。

二、搭建项目基础环境

1. 创建  父工程及公共api 见 第三章

2. 创建 Eureka 服务 见 第三章

3. 创建 订单(order-service )服务

     订单服务中创建接口,接口中方法:findById( ),deleteOrderById( )

     订单服务中创建controller,controller中方法:buy() ,deleteOrderById( )

       3.1 修改pom文件如下     

       修改pom文件,增加 Hystix熔断器组件  依赖,修改如下:

<!--引入Hystix熔断器组件 开始-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--引入Hystix熔断器组件 结束-->

完整pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloudbase</artifactId>
        <groupId>com.hwadee.springcloud2022</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hwadee.springcloud</groupId>
    <artifactId>orderServer9000</artifactId>

    <dependencies>
        <!--引入Hystix熔断器组件 开始-->
        <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!--引入Hystix熔断器组件 结束-->
        <!--告诉微服务注册中心我是微服务的client端 Feign 需要和eureak整合-->
        <!-- Feign相关 开始 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- Feign相关 结束 -->
        <!--web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 管理公共api -->
        <dependency>
            <groupId>com.hwadee.springboot2022</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--Eureka Client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

</project>

       3.2 订单服务中创建接口 IOrderFeignService  

        在订单服务中的service目录中创建 调用远端服务的接口 IOrderFeignService  ,在接口上使用注解 @FeignClient("PRODUCT-SERVICE"),表示 controller 调用接口方法时候,使用负载均衡机制,进行寻找服务名为 "PRODUCT-SERVICE" 的远端服务,接口中的方法和controller中的方法写法类似。代码如下:

import com.hwadee.springcloud.entity.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Component // 让 spring 可以识别,不加也行,但是在注入的时候 IDEA 会报错,不会影响运行,但有条红线让自己不舒服
@FeignClient("PRODUCT-SERVICE")
public interface IOrderFeignService {
    @RequestMapping(value = "/product/buy/{id}")
    Product findOrderById(@PathVariable Long id);

    @RequestMapping(value = "/product/delete/{id}")
    Product deleteOrderById(@PathVariable Long id);
}

       3.3 订单服务中创建 OrderController

        在订单服务中创建 OrderController ,在 OrderController 中注入IOrderFeignService  接口,通过 IOrderFeignService 接口方法 调用远端服务,代码如下:

import com.hwadee.springcloud.entity.Product;
import com.hwadee.springcloud.service.IOrderFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    IOrderFeignService orderFeignService;

    @RequestMapping("/buy/{id}")
    public Product buy(@PathVariable Long id) {
        System.out.println("进入OrderController orderFeignService 准备调用远端接口");
        Product product = orderFeignService.findOrderById(id);
        return product;
    }

    @RequestMapping(value = "/delete/{id}")
    Product deleteOrderById(@PathVariable Long id){
        System.out.println("进入OrderController orderFeignService 准备调用远端接口");
        Product product = orderFeignService.deleteOrderById(id);
        return product;
    }

}

     3.4 配置订单服务的配置文件

      配置订单服务(order-service)中的配置文件application.yml,修改如下:

server:
  port: 9000
spring:
  application:
    name: order-service # 为当前订单服务命名为 order-service

# 配置eureka客户端信息
eureka:
  client:
    service-url:
      # 配置eureka客户端服务order-service的注册地址,与 eureka-server 中暴露地址要保持一致
      defaultZone: http://localhost:8000/eureka/
  instance:
    prefer-ip-address: true # 是否使用 IP 地址注册,默认 false
    # instance-id: order-service  # 实例 id,服务的唯一标识,会自动的找到order-service的ip和端口
    instance-id: ${spring.cloud.client.ip-address}:${server.port} # 如果想在控制页面看到服务地址与端口,可以将 instance-id 这样配置

       3.5 创建订单服务的主启动类

        创建订单服务的主启动类 OrderServerApplication ,并增加注解 @EnableFeignClients  来启动 openFeign 与注解 @EnableCircuitBreaker 启动Hystrix服务。代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient// 启动 eureka 客户端
@EnableFeignClients  // 启动 feign
public class OrderServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServerApplication.class, args);
    }
}

4 创建商品(product-service )服务集群

     4.1 创建商品(product-service )服务

      创建项目:productServer9001,引 入 web 启动器和 eureka 客户端,及熔断降级 Histrix 依赖,修改 pom 文件如下:

<!--引入Hystix熔断器组件 开始-->

<dependency>

     <groupId>org.springframework.cloud</groupId>

     <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>

</dependency>

<!--引入Hystix熔断器组件 结束-->

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>springcloudbase</artifactId>
    <groupId>com.hwadee.springcloud2022</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.hwadee.springcloud</groupId>
  <artifactId>productServer9001</artifactId>
  <version>0.0.1-SNAPSHOT</version>


  <dependencies>
     <!--引入Hystix熔断器组件 开始-->
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
     </dependency>
     <!--引入Hystix熔断器组件 结束-->

     <!--web依赖-->
     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
     </dependency>

    <!-- 管理公共api -->
    <dependency>
      <groupId>com.hwadee.springboot2022</groupId>
      <artifactId>springcloud-api</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <!--Eureka Client-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
  </dependencies>
</project>

       4.2 创建productServer服务的主启动类

        创建productServer服务的主启动类,并使用注解 @SpringBootApplication 和@EnableEurekaClient// 启动 eureka 客户端

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient// 启动 eureka 客户端
public class ProductServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductServerApplication.class, args);
    }
}

       4.3、配置 productServer 配置文件

       配置 productServer 配置文件 application.yml 信息:

server:
  port: 9001
spring:
  application:
    name: product-service # 为当前商品服务命名
eureka:
  client:
    service-url: # 配置服务注册地址,与 eureka-server 中暴露地址保持一致
      defaultZone: http://localhost:8000/eureka
  instance:
    prefer-ip-address: true  # 是否使用 IP 地址注册,默认 false
    # instance-id: product-service  # 实例 id,服务的唯一标识
    instance-id: ${spring.cloud.client.ip-address}:${server.port} # 如果想在控制页面看到服务地址与端口,可以将 instance-id 这样配置
    lease-renewal-interval-in-seconds: 5  # 发送心跳的间隔,单位秒,默认 30
    lease-expiration-duration-in-seconds: 10 # 续约到期时间,单位秒,默认90

       4.4、创建 ProductController

        创建ProductController,方法如下:

import com.hwadee.springcloud.entity.Product;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;

@RestController
@RequestMapping("/product")
public class ProductController {
    //方便后面讲负载均衡,查看ip,此处获取配置中的端口号和ip
    @Value("${server.port}")
    private String port;
    @Value("${spring.cloud.client.ip-address}")
    private String ip;

    @RequestMapping("/buy/{id}")
    public Product findById(@PathVariable Long id) {
        Product product = new Product();
        product.setId(id);
        // 后面需要测试负载均衡,所以返回 ip 地址及端口号
        product.setName("当前访问商品服务地址:" + ip + ":" + port+"  "+"查询商品订单,订单号:"+id);
        product.setPrice(new BigDecimal(10000.0));
        System.out.println(product);
        return product;
    }

    @RequestMapping(value = "/delete/{id}")
    Product deleteOrderById(@PathVariable Long id){
        Product product = new Product();
        product.setId(id);
        // 后面需要测试负载均衡,所以返回 ip 地址及端口号
        product.setName("当前访问商品服务地址:" + ip + ":" + port+"  "+"从购物车删除订单,订单号:"+id);
        product.setPrice(new BigDecimal(10000.0));
        System.out.println(product);
        return product;
    }

}

     4.5 创建商品服务提供者集群

      使用如下方式:不用创建项目复制多个项目。

5、进行测试

  •  首先启动注册中心服务:eurekaServer 主启动类 EurekaServerApplication
  • 其次启动订单服务:order-service 主启动类 OrderServerApplication
  • 启动商品服务productServer9001:product-servie 的主启动类 ProductServerApplication
  • 启动商品服务productServer9002:product-servie 的主启动类 ProductServerApplication
  • 启动商品服务productServer9003:product-servie 的主启动类 ProductServerApplication

   多次访问订单服务: http://localhost:9000/order/buy/1 查看返回的 ip 和 端口信息

三、 Hystrix的服务使用前的问题

1、 ProductController 中方法异常和超时

      在商品服务 ProductController 中的方法中增加异常和超时,ProductController 中方法修改如下:

package com.hwadee.springcloud.controller;
import com.hwadee.springcloud.entity.Product;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;

@RestController
@RequestMapping("/product")
public class ProductController {
    //方便后面讲负载均衡,查看ip,此处获取配置中的端口号和ip
    @Value("${server.port}")
    private String port;
    @Value("${spring.cloud.client.ip-address}")
    private String ip;

    @RequestMapping("/buy/{id}")
    public Product findById(@PathVariable Long id) {
        Product product = new Product();
        product.setId(id);
        // 后面需要测试负载均衡,所以返回 ip 地址及端口号
        product.setName("当前访问商品服务地址:" + ip + ":" + port+"  "+"查询商品订单,订单号:"+id);
        product.setPrice(new BigDecimal(10000.0));
        System.out.println(product);

        //测试超时熔断
        try {
            Thread.sleep(5000);
            //测试并发熔断
            //Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return product;
    }

    @RequestMapping(value = "/delete/{id}")
    public Product deleteOrderById(@PathVariable Long id){
        Product product = new Product();
        product.setId(id);
        // 后面需要测试负载均衡,所以返回 ip 地址及端口号
        product.setName("当前访问商品服务地址:" + ip + ":" + port+"  "+"从购物车删除订单,订单号:"+id);
        product.setPrice(new BigDecimal(10000.0));
        System.out.println(product);

        //测试异常熔断
        System.out.println(10/0);

        return product;
    }

}

2、访问查看效果

      访问 http://localhost:9000/order/buy/1

      访问 http://localhost:9000/order/delete/1

      订单服务中 OrderController 中 调用商品服务 ProductController 中方法时,ProductController 中方法出现异常和超时,访问浏览器的异常结果和订单服务中的内部异常如下:

3、问题分析

  在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会出现因等待出现故障的依赖方响应而形成任务积压,线程资源无法释放,最终导致自身服务的瘫痪,进一步甚至出现故障的蔓延最终导致整个系统的瘫痪。如果这样的架构存在如此严重的隐患,那么相较传统架构就更加的不稳定,如下图。

四、 商品服务 Hystrix的 局部降级

            见  第七章

五、 订单服务 Hystrix的 局部降级

            见  第八章

六、全局降级

           见  第九章

七、全局解耦

           见  第十章

第五章:Feign负载均衡详解

第七章:Hystrix断路器的详解-服务降级之局部降级

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第六章 Hystrix断路器详解+环境搭建 的相关文章

随机推荐

  • ubuntu常用命令(转载)

    ls 列出当前目录文件 不包括隐含文件 ls a 列出当前目录文件 包括隐含文件 ls l 列出当前目录下文件的详细信息 cd 回当前目录的上一级目录 cd 回上一次所在的目录 cd 或 cd 回当前用户的宿主目录 mkdir 目录名 创建
  • ide运行报错“Command line is too long”解决办法

    有时运行程序时 ide会报如下错 如何解决呢 其实提示已经告诉你解决办法了 点击图中的蓝色超链接 JAR MAINIFEST 或 CLASSPATH FILE 都能解决问题 这是因为命名的方法名太长了才会报这个错 方法2 如果没有弹窗 也可
  • 查看Linux下rpm文件安装到哪个路径

    命令 root localhost rpm qpl xxx rpm more
  • 用户数据报UDP

    UDP概述 UDP 只在 IP 的数据报服务之上增加了很少一点的功能 即端口的功能和差错检测的功能 UDP 的主要特点 UDP 是无连接的 不需要建立连接 直接发送数据 发送完以后也不需要释放连接 UDP 使用尽最大努力交付 即不保证可靠交
  • 使用 MATLAB 绘制爱心:帮助你成功表白

    作者简介 人工智能专业本科在读 喜欢计算机与编程 写博客记录自己的学习历程 个人主页 小嗷犬的个人主页 个人网站 小嗷犬的技术小站 个人信条 为天地立心 为生民立命 为往圣继绝学 为万世开太平 本文目录 MATLAB 绘制爱心 方法一 方法
  • C++中string的size与length的区别

    在C 的string类中 有两种函数 length和size 他们的作用都是返回字符串的长度 那么 问题来了 他们两者有什么区别 为了钻研 我们要先找到他们两者的源代码 让我们先找到length的源代码 首先 我们随便定义一个字符串 并调用
  • hualinux dj3 2.4:drf普通视图generics及例子

    目录 一 关于通用视图generics 1 1 基于类的视图 1 2 关于通用视图 1 2 1 介绍 1 2 2 属性 1 2 3 方法 1 2 4 Mixins 1 2 5 具体的通用视图 1 2 6 其它 二 drf通用视图generi
  • 内核调试手段

    1 内核调试配置选项 内核拥有多项用于调试的功能 但是这些功能会造成额外的输出并导致性能下降 因此 内核通常都是禁止掉调试功能 内核调试相关的配置项主要集中在内核配置菜单 Kernel hacking 中 在使用下面的调试手段时 先确保内核
  • 如何修改unity项目名称

    在Unity中 修改项目名称需要对一些文件和设置进行修改 以下是修改Unity项目名称的步骤 在Unity编辑器中 选择项目文件夹 Project 面板中的 Assets 然后点击右键 在弹出菜单中选择 Show in Explorer 在
  • 项目管理利器—maven

    一 简介 maven是优秀的项目管理和构建工具 能让我们更为方便的来管理和构建项目 从最基础的环境配置 到maven核心知识点的应用 使用maven来构建和管理Java项目 Maven是基于项目对象模型 POM 可以通过一小段描述信息来管理
  • JavaScript数组中筛选相同的元素组成新数组

    var college type 2 lastName 孙策 type 1 lastName 后裔 type 3 lastName 阿木木 type 3 lastName 亚索 type 1 lastName 剑魔 type 1 lastN
  • 写给我的2015—开启工作新旅程

    前沿 2015年的总结相比2014年来的晚了许多 原因一方面是今年呀的发现CSDN竟然没有了前两年写年终的活动 另一方面嘛还是自己太懒散了 一直恍恍惚惚的没有下手来总结 今天 在这小年夜里 ps 外面下完雪挺冷的 独自一个人坐在办公桌前 静
  • 实心球体内部电势计算公式_均匀带电球体中心点电势怎么求

    展开全部 公式 q 其中 为电势能 q为电荷量 为电势 即 q 均匀带电球内的电场分布和距离球心的距32313133353236313431303231363533e4b893e5b19e31333431363565离r成正比 解析 由于正
  • linux文件权限查看及修改-chmod ------入门的一些常识

    查看linux文件的权限 ls l 文件名称ULUitugULUitug查看linux文件夹的权限 ls ld 文件夹名称 所在目录 ULUitugULUitug修改文件及文件夹权限 ULUitugULUitugsudo chmod 代表类
  • 【软件工程】内聚

    概念 是指一个模块内部个成分之间相互关联程度的度量 也就是说 凝聚是对模块内各处理动作组合强度的一种度量 很显然 一个模块的内聚越大越好 偶然凝聚 一个模块内的各处理元素之间没有任何联系 只是偶然地被凑到一起 这种模块也称为巧合内聚 内聚程
  • MySQL数据库引擎InnoDB和MyISAM的区别?

    数据库引擎InnoDB和MyISAM的区别 1 MyISAM不支持事务 InnoDB支持事务 2 MyISAM支持全文索引 InnoDB在MySQL5 6之前不支持 3 MyISAM不支持外键 InnoDB支持外键 4 MyISAM只支持表
  • STM32之flash的读写

    本文内容 本实验主要介绍Flash地址空间的数据读取 一 创建STM32CUBEMX工程 芯片选择F103C8 配置定时器 打开外部时钟 配置时钟 配置PC13为output对应板子上的LED 设置堆栈大小为4K 导出 二 KEIL下的配置
  • Vue 3 第七章:computed计算属性

    文章目录 1 Vue3中的computed函数 1 1 什么是computed 1 2 如何定义computed 1 3 computed函数的使用场景 1 3 1 过滤和排序 1 3 1 数组计算 2 computed函数的原理 总结 1
  • getset_descriptor

    What is the dict dict attribute of a Python class up vote 43 down vote favorite 23 gt gt gt class A object pass gt gt gt
  • 第六章 Hystrix断路器详解+环境搭建

    目录 一 Hystrix的背景及介绍 1 分布式系统面临的问题 2 解决方案 3 Hystrix介绍 4 Hystrix服务熔断 二 搭建项目基础环境 1 创建 父工程及公共api 见 第三章 2 创建 Eureka 服务 见 第三章 3