6.SpringCloudAlibaba 整合 Sentinel

news2024/11/24 9:43:47

一、分布式系统遇到的问题

1 服务雪崩效应

在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100%是可用的。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致调用服务瘫痪。

由于服务与服务之间的依赖性,故障会进行传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 雪崩效应

在这里插入图片描述
雪崩发生的原因有可能,最常用的原因:程序Bug,大流量请求,硬件故障,缓存击穿。等等

  • 程序Bug: 比如说代码导致的死循环,这里的问题比较多,反正只要把服务拖死的都是 BUG。
  • 大流量请求:在秒杀和大促开始前,如果准备不充分,瞬间大量请求会造成服务提供者的不可用。
  • 硬件故障:可能为硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问。
  • 缓存击穿:一般发生在缓存应用重启, 缓存失效时高并发,所有缓存被清空时,以及短时间内大量缓存失效时。大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用。

我们无法完全杜绝雪崩源头的发生,只有做好足够的容错,保证在一个服务发生问 题,不会影响到其它服务的正常运行。也就是"雪落而不雪崩"。

二、常见容错方案

要防止雪崩的扩展,我们就要做好 服务的容错,容错说白了就是 保护自己 不被猪队友拖垮的一些措施,下面介绍下常见的服务容错思路和组件:

1、常见的容错思路

常见的容错思路有超时、限流、熔断、降级这几种,下面分别介绍一下。

  1. 超时:在上游服务调用下游服务的时候,上游服务设置一个最大响应时间,如果超过这个时间,下游未作出反应,上游服务就断开请求,释放掉线程。

  2. 限制请求核心服务提供者的流量,使大流量拦截在核心服务之外,这样可以更好的保证核心服务提供者不出问题,对于一些出问题的服务可以限制流量访问。

    • 计数器固定窗口算法
    • 计数器滑动窗口算法
    • 漏桶算法
    • 令牌桶算法
  3. 在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。

    这种牺牲局部,保全整体的措施就叫做熔断。

    服务熔断一般有三种状态:

    • 熔断关闭状态(Closed)

      服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制

    • 熔断开启状态(Open)

      后续对该服务接口的调用不再经给网络请求,直接执行本地的 fallback 方法。

    • 半熔断状态(Half-Open)

      尝试恢复服务调用,允许有限的流量调用该服务,并监控调用的成功率。如果成功率达到预期,说明服务可以恢复。进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断关闭状态。

      【现在世界中的断路器不知道大家是否了解;断路器实时监控电路的情况,如果发现电路电流异常,就会跳闸。从而防止电路被烧毁。
      软件世界的断路器可以这样理解:实时监测应用,如果发现在一定时间内失败次数 / 失败率达到一定阈值,就“跳闸”,断路器打开 ----- 此时,请求直接返回,而不去调用原本调用的逻辑。跳闸 一段时间后(比如10秒),断路器会进入 半开状态,这是一个瞬间的状态。此时允许一次请求调用其他服务,如果成功,则断路器关闭,应用正常调用;如果调用依然不成功,断路器继续回到 打开状态,过一段时间 再进行反复上面的重试。应用可以保护自己,而且避免浪费资源;而通过半开的设计,可实现应用的 “自我修复“。
      所以,当依赖的服务有大量超时时,再让新的请求去访问根本没有意义,只会无畏的消耗现有的资源。比如我们设置了超时时间为 (10秒),如果短时间内大量的请求在 超时时间内 没有得到响应,就意味着这个服务出现了问题,此时就没有必要让其他的请求去进行访问了,这个时候我们就应该使用断路器避免资源的浪费。】
      下面是具体的流程图
      在这里插入图片描述

  4. 降级
    所谓降级就是我们调用的服务异常超时等原因不能正常返回的情况下,我们返回一个缺省的值。

    【由于降级经常和熔断一起使用,所以就会有熔断降级的说法。】

2、常见的容错思路

  • Hystrix

    Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止 级联失败,从而提升系统的可用性与容错性。

  • Resilience4J

    Resilicence4J一款非常轻量、简单,并且文档非常清晰、丰富的熔断工具,这也是Hystrix官方推 荐的替代产品。不仅如此,Resilicence4j还原生支持Spring Boot 1.x/2.x,而且监控也支持和prometheus等多款主流产品进行整合。

  • Sentinel

    Sentinel 是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定。

下面是三个组件在各方面的对比:

SentinelHystrixresilience4j
隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于慢调用比例、异常比例、异常数基于异常比例基于异常比例、响应时间
实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)Ring Bit Buffer
动态规则配置支持近十种动态数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
单机限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
集群流控支持不支持不支持
流量整形支持预热模式与匀速排队控制效果不支持简单的 Rate Limiter 模式
系统自适应保护支持不支持不支持
热点识别/防护支持不支持不支持
多语言支持Java/Go/C++JavaJava
Service Mesh 支持支持 Envoy/Istio不支持加粗样式不支持
控制台提供开箱即用的控制台,可配置规则、实时监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统

三、sentinel基本操作

1.什么是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等应用容器。

2、基本概念

  • 资源

    资源就是Sentinel要保护的东西

    资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。

  • 规则

    规则就是用来定义如何进行保护资源的

    围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整

3、Sentinel 功能和设计理念

Sentinel的主要功能就是容错,主要体现为下面这三个:

3.1 流量控制(上游)

流量控制在网络传输中是一个常用的概念,它用于调整网络包的数据。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。

image.png

Sentinel作为一个调配器,可以根据需要把随机的请求调整成合适的形状。

3.2 熔断降级(下游)

当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败(或者其他处理方式),避免影响到其它的资源而导致级联故障。

image.png

image.png

四、整合sentinel

在官方文档中,定义的Sentinel进行资源保护的几个步骤:

  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效

抛出异常的方式定义资源:

Entry entry = null;
// 务必保证 finally 会被执行
try {
  // 资源名可使用任意有业务语义的字符串,注意数目不能太多(超过 1K),超出几千请作为参数传入而不要直接作为资源名
  // EntryType 代表流量类型(inbound/outbound),其中系统规则只对 IN 类型的埋点生效
  entry = SphU.entry("自定义资源名");
  // 被保护的业务逻辑
  // do something...
} catch (BlockException ex) {
  // 资源访问阻止,被限流或被降级
  // 进行相应的处理操作
} catch (Exception ex) {
  // 若需要配置降级规则,需要通过这种方式记录业务异常
  Tracer.traceEntry(ex, entry);
} finally {
  // 务必保证 exit,务必保证每个 entry 与 exit 配对
  if (entry != null) {
    entry.exit();
  }
}

4.1 基于api方式的实现

1.添加项目依赖

        <!--  引入 sentinel 直接引入 我们不用指定版本 根据父级项目的 cloudAlibab的依赖走  -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
        </dependency>

2.添加 CommonFlowRules 类 在里面添加限流规则

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Component
public class CommonFlowRules {

    /**
     * 配置 api形式的 资源
     */
    public static final String API_RESOURCE_NAME = "API-SOURCE";


    static {
        log.info("加载配置信息---------------------------");
        //定义规则列表
        List<FlowRule> rules = new ArrayList<>();
        //定义 api资源的 限流
        FlowRule apiRule = new FlowRule();
        //定义受保护的资源
        apiRule.setResource(API_RESOURCE_NAME);
        //设置流控规则 QPS
        apiRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //设置受保护的资源阈值
        apiRule.setCount(1);
        rules.add(apiRule);

        //将规则加载到  规则列表当中
        FlowRuleManager.loadRules(rules);
    }
}

3.添加 SentinelApiController 编写代码

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.Tracer;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.example.cloudsentinel.common.CommonFlowRules;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class SentinelApiController {


    @GetMapping("getInfo")
    public String getInfo() {
        Entry entry = null;
        // 务必保证 finally 会被执行
        try {
            // 资源名可使用任意有业务语义的字符串,注意数目不能太多(超过 1K),超出几千请作为参数传入而不要直接作为资源名
            // EntryType 代表流量类型(inbound/outbound),其中系统规则只对 IN 类型的埋点生效
            entry = SphU.entry(CommonFlowRules.API_RESOURCE_NAME);
            // 被保护的业务逻辑
            String str = "业务逻辑正常处理";
            log.info("=====" + str + "=====");
            return str;
        } catch (BlockException ex) {
            // 资源访问阻止,被限流或被降级
            // 进行相应的处理操作
            log.info("Block...!");
            return "业务被限流了!";
        } catch (Exception ex) {
            // 若需要配置降级规则,需要通过这种方式记录业务异常
            Tracer.traceEntry(ex, entry);
        } finally {
            // 务必保证 exit,务必保证每个 entry 与 exit 配对
            if (entry != null) {
                entry.exit();
            }
        }
        return null;
    }


}

缺点:

  • 业务侵入性很强,需要在controller中写入非业务代码.
  • 配置不灵活 若需要添加新的受保护资源 需要手动添加 init方法来添加流控规则

4.2 基于注解的方式来定义

@SentinelResource注解实现

在定义了资源点之后,我们可以通过Dashboard来设置限流和降级策略来对资源点进行保护。同时还能 通过@SentinelResource来指定出现异常时的处理策略。

@SentinelResource用于定义资源,并提供可选的异常处理和fallback 配置项。其主要参数如下:

属性作用
value资源名称
entryTypeentry类型,标记流量的方向,取值IN/OUT,默认是OUT
blockHandler处理BlockException的函数名称,函数要求:<br>1.必须是public<br/>2.返回类型 参数与原方法一致<br/>3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置blockHandlerClass,并指定blockHandlerClass里面的方法。
blockHandlerClass存放blockHandler的类,对应的处理函数必须static修饰。
fallback用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。函数要求:<br/>1.返回类型与原方法一致<br/>2.参数类型需要和原方法相匹配<br/>3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置fallbackClass ,并指定fallbackClass里面的方法。
fallbackClass存放fallback的类。对应的处理函数必须static修饰。
defaultFallback用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:<br/>1.返回类型与原方法一致<br/>2.方法参数列表为空,或者有一个Throwable类型的参数。<br/>3.默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置fallbackClass ,并指定 fallbackClass 里面的方法。
exceptionsToIgnore指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。
exceptionsToTrace需要trace的异常

1.添加项目依赖:

        <!-- 注解的形式引入  sentinel  我们不用指定版本 根据父级项目的 cloudAlibab的依赖走 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-annotation-aspectj</artifactId>
        </dependency>

2.添加SentinelAspectConfiguration 声明注解

import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置 切面(注解) 的支持
 */
@Configuration
public class SentinelAspectConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

3.在 CommonFlowRules 添加 注解的限流配置

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Component
public class CommonFlowRules {

    /**
     * 配置注解的 资源
     */
    public static final String ANNOTATION_RESOURCE_NAME = "testAspect";

    /**
     * 配置 api形式的 资源
     */
    public static final String API_RESOURCE_NAME = "API-SOURCE";


    static {
        log.info("加载配置信息---------------------------");
        //定义规则列表
        List<FlowRule> rules = new ArrayList<>();


        //定义 基于注解的配置
        FlowRule rule = new FlowRule();
        //定义受保护的资源
        rule.setResource(ANNOTATION_RESOURCE_NAME);
        //设置流控规则 QPS
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //设置受保护的资源阈值
        rule.setCount(1);
        rules.add(rule);


        //定义 api资源的 限流
        FlowRule apiRule = new FlowRule();
        //定义受保护的资源
        apiRule.setResource(API_RESOURCE_NAME);
        //设置流控规则 QPS
        apiRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //设置受保护的资源阈值
        apiRule.setCount(1);
        rules.add(apiRule);


        //将规则加载到  规则列表当中
        FlowRuleManager.loadRules(rules);
    }
}

4.添加SentinelAnnotationController 编写代码

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.example.cloudsentinel.common.CommonException;
import com.example.cloudsentinel.common.CommonFlowRules;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class SentinelAnnotationController {


    @GetMapping("/testAspect/{id}")
    @SentinelResource(value = CommonFlowRules.ANNOTATION_RESOURCE_NAME,
            fallback = "fallback", fallbackClass = CommonException.class,
            blockHandler = "handleException", blockHandlerClass = CommonException.class
    )
    public String testAspect(@PathVariable("id") Integer id) {
        if (Integer.compare(id, Integer.parseInt("0")) == -1) {
            throw new IllegalArgumentException("参数异常");
        }

        log.info("处理业务信息");
        return "测试注解方式限流正常";
    }


}

上面这两种方式,我们是基于代码的方式来控制业务的具体限流规则的,sentinel还支持页面的方式配置每个资源的限流规则,我们整合到我们的 SpringCloudAlibaba里面看一下:

4.3 图形化的方式整合

整合SpringBoot和SpringCloud官方文档传送地址

  • 如果要整合 sentinel图形化的话,代码中不可以出现自定义规则,如下面这个代码
// 当前代码会把 项目初始化时候 cloud-startet 里面的配置 给冲掉  会把旧的给 替换掉
 FlowRuleManager.loadRules(rules);

不然你的服务,就永远注册不到 sentinel的控制台上。

1. 添加项目依赖

        <!-- 引入支持图形化方式的依赖 我们不用指定版本 根据父级项目的 cloudAlibaba的依赖走  -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

2.配置文件添加sentinel地址

spring:
  application:
    name: sentinel-service
  cloud:
    nacos:
      discovery:
      	# 注册到 nacos的地址
        server-addr: localhost:8848
      config:
        # 配置中心的地址
        server-addr: localhost:8848
        file-extension: yaml
        namespace: 89b87df8-4e58-4363-a11a-ff1863b6f5fb
        group: DEFAULT_GROUP
    # sentinel的配置    
    sentinel:
      transport:
        port: 7810 #跟控制台交流的端口,随意指定一个未使用的端口即可
        dashboard: localhost:8080 # 指定控制台服务的地址

3.引入控制台

Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能。

第1步 下载jar包,解压到文件夹

Sentinel控制台下载地址

第2步 启动控制台

直接使用jar命令启动项目(控制台本身是一个SpringBoot项目)

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

把dashboard自己也当成一个资源加入到了dashboard中来进行监控,如果不想把dashboard自己加入控制台监控可以使用简单启动指令如下:

java -Dserver.port=8080 -jar sentinel-dashboard-1.8.6.jar

第4步: 访问控制台

用户可以通过如下参数进行配置:

-Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel;

-Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel;

-Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;

访问http://localhost:8080/#/login ,默认用户名密码: sentinel/sentinel

Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包,所以要确保客户端有访问量;
在这里插入图片描述
补充:了解控制台的使用原理

Sentinel的控制台其实就是一个SpringBoot编写的程序。我们需要将我们的微服务程序注册到控制台上, 即在微服务中指定控制台的地址, 并且还要开启一个跟控制台传递数据的端口, 控制台也可以通过此端口调用微服务中的监控程序获取微服务的各种信息。

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.11 socket地址 4.12 IP地址转换函数 4.13TCP通信流程 4.14socket函数

4.11 socket地址 socket地址其实是一个结构体&#xff0c;封装端口号和IP等信息。后面的socket相关的api中需要使用到这个socket地址。 客户端 -> 服务器&#xff08;IP, Port&#xff09; 通用 socket地址 socket 网络编程接口中表示 socket 地址的是结构体 sockaddr&am…

安装Vue(重点笔记)

目录 什么是Vue? 特点 Node.js安装 Vue安装 1、安装Vue.js 1.1&#xff09;安装失败解决 1.2&#xff09;安装成功 2、安装webpack模板 3、安装脚手架 4、安装vue-router 创建第一个Vue-cli应用程序 1、命令行(cmd) cd 到指定的目录 2. 创建第一个基于webpack模…

【C#】WinForm中如何获取一个控件相对于主界面的位置

文章目录 前言一、新建WinForm程序二、效果与代码总结 前言 使用button控件的 PointToScreen 方法和Form控件的 PointToClient 方法来获取button1相对于Form边界的位置。具体步骤如下&#xff1a; 获取button1在屏幕上的位置&#xff1a; Point button1ScreenPos button1.P…

【TensorRT】TensorRT的环境配置

本文主要记录TensorRT8.6的环境配置过程&#xff01; 官方文档&#xff1a;NVIDIA TensorRT - NVIDIA Docs TensorRT相关版本的文档&#xff1a; Documentation Archives :: NVIDIA Deep Learning TensorRT Documentation 一 、下载CUDA和cudann CUDA下载&#xff1a;CUDA T…

最近不知道写啥,打算整理点儿关于钱币的文章,也转载点儿别人的技术文章,毕竟,洒家还是干技术滴嘛...

最近开始整理之前陆陆续续买的乱七八糟的东西了&#xff0c;现在一堆东西还乱扔着呢~~ 先整理了一套大五帝钱还有下面这套清五帝。 清五帝钱一套: 27宝泉局顺治通宝&#xff0c;铁壳锈 27.5康熙通宝满汉同 26.5宝泉局雍正通宝 三离划 26&#xff08;卡&#xff09;宝云局乾隆通…

Vision Transformer综述 总篇

Vision Transformer综述 1. Transformer简介2. Transformer组成2.1 Self-AttentionMulti-Head Attention&#xff08;多头注意力&#xff09; 2.2 Transformer的其他关键概念2.2.1 Feed-Forward Network 前馈网络2.2.2 Residual Connection 残差连接2.2.3 解码器中的最后一层 3…

Go GC:了解便利背后的开销

1. 简介 当今&#xff0c;移动互联网和人工智能的快(越)速(来)发(越)展(卷)&#xff0c;对编程语言的高效性和便利性提出了更高的要求。Go作为一门高效、简洁、易于学习的编程语言&#xff0c;受到了越来越多开发者的青睐。 Go语言的垃圾回收机制&#xff08;Garbage Collectio…

client-go的Indexer三部曲之一:基本功能

关于《client-go的Indexer三部曲》系列 该系列是《client-go实战系列》的子系列文章&#xff0c;共三篇内容&#xff0c;分别从功能、性能、源码三个角度对client-go内部的Indexer组件进行说明&#xff0c;目标是与大家一同学习Indexer&#xff0c;并掌握如何在开发中通过Inde…

EBU5476 Microprocessor System Design 知识点总结_6 Serial Communication

Serial Communication 串口通信&#xff0c;一种发送消息的通信方式。 串&#xff0c;指的是发数据的方式&#xff1a;一位一位串行发&#xff0c;并行是可能有多路通道&#xff0c;每路同时发一个数据&#xff0c;多路同时到达。 串口通信有单工 Simplex&#xff0c;半双工…

基于SpringBoot+Vue的乐校园二手书交易管理系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

35. 应用监控【监控端点健康信息】

1、展示健康信息详情 开发者可以通过查看健康信息来获取应用的运行数据&#xff0c;进而提早发现应用问题&#xff0c;提早解决&#xff0c; 免造成损失。默认情况下开发者只能获取 status 信息&#xff08;见图 1 &#xff09;&#xff0c;这是因为 detail 信息默认不显示&…

【Java常见面试题】Spring篇

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线常见面试题 目录 1、简单介绍Spring 2、说说你对IOC的理解 3、说说你对AOP的理解 4、说说Bean的生命周期 5、说说循环依赖和三级缓存 6、说说Bean的几种…

DataV图表-排名轮播表自定义

DataV图表-排名轮播表自定义数据大屏可视化 场景&#xff1a;需要计算根据分数不同柱子的颜色不同 低于60分变成为橙色柱子 一开始使用的是 dv-scroll-ranking-board 这个不可以自定义颜色和属性 我们可以更改 dv-scroll-board 样式来实现 排名轮播表 安装 data-view npm ins…

如何使用Leangoo领歌管理敏捷缺陷

缺陷管理通常关注如下几个方面&#xff1a; 1. 缺陷的处理速度 2. 缺陷处理的状态 3. 缺陷的分布 4. 缺陷产生的原因 使用​​​​​​​Leangoo领歌敏捷工具​​​​​​​我们可以对缺陷进行可视化的管理&#xff0c;方便我们对缺陷的处理进展、负责人、当前状态、分布情…

『 MySQL篇 』:MySQL 锁机制介绍

目录 一. 概述 二. 全局锁 三 . 表级锁 三. 行级锁 一. 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据…

三菱FX5U通讯、定位、伺服32讲

三菱FX5U系列&#xff08;现在已经升级改成为MELSEC iQ-F系列&#xff09;PLC的CPU模块中内置了能够支持各种控制的优异功能&#xff0c;全系标配Ethernet端口、RS-485端口、SD存储卡槽。Ethernet端口可支持CC-Link IE现场网络Basic&#xff0c;因此能连接多种多样的设备。 第一…

eChart折线图动态特效和隔几秒高亮特效

示例&#xff1a; 说明&#xff1a; 因为现在公司经常要做大屏可视化特效&#xff0c;没办法&#xff0c;只能让图尽量动起来&#xff08;之前开会挨叼了&#xff0c;说俺们深圳做的&#xff0c;不能比西安那些人做的差。。。&#xff09; 主要代码&#xff1a; 折线图的滚呀滚…

基于Hexo和Butterfly创建个人技术博客,(7) 配置butterfly主题搭建博客网站主体UI框架

Butterfly官方网站&#xff0c;请 点击进入。 本文面向使用 butterfly theme 的用户, 主题安装方法可查看基于Hexo和Butterfly创建个人技术博客&#xff0c;(1) 初始化博客站点 这章内容。 一、概述 1、什么是theme? Hexo可以认为是一个基础框架&#xff0c;主要提供渲染和插…

平行云——开启通往元宇宙的通道

元宇宙是平行于真实世界的虚拟世界&#xff0c;是新一代互联网。具有真三维、可交互、可沉浸特性的XR&#xff0c;是构建元宇宙的终极数字媒体形态。如何打破XR终端设备与XR内容之间的紧耦合&#xff0c;实现任意平台、任意终端的线上访问&#xff0c;Cloud XR是其必由之路&…

Diffie-Hellman Key Agreement Protocol 资源管理错误漏洞(CVE-2002-20001)

详细描述: Diffie-Hellman Key Agreement Protocol是一种密钥协商协议。它最初在 Diffie 和 Hellman 关于公钥密码学的开创性论文中有所描述。该密钥协商协议允许 Alice 和 Bob 交换公钥值&#xff0c;并根据这些值和他们自己对应的私钥的知识&#xff0c;安全地计算共享密钥K…