(六)Spring Cloud Alibaba Sentinel(含案例源码、案例解析及软件)

2023-11-20

案例源码gitee地址:https://gitee.com/BanSheng/spring-cloud-alibaba-examples/tree/master/sentinel-example-client

Spring Cloud Alibaba Sentinel


一、Sentinel 简介

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

Sentinel 具有以下特征:

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


二、Sentinel 控制台安装

Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。本节将详细记录何如通过 Sentinel 控制台控制 Sentinel 客户端的各种行为。Sentinel 控制台的功能主要包括:流量控制、降级控制、热点配置、系统规则和授权规则等。

2.1  下载 Sentinel

访问:https://github.com/alibaba/Sentinel/releases

找到:1.7.1 版本:

 

点击 sentinel-dashboard-1.7.1.jar 完成下载:

提示:

直接在 github 下载,速度非常的慢,百度网盘下载:

链接:https://pan.baidu.com/s/1qyIkkw0nKt1znR0e4dDWxQ  提取码:2f9q

2.2  启动 sentinel-dashboard

将下载好的 sentinel-dashboard-1.7.1.jar 复制到安装软件的目录里面。

使用:

java -jar sentinel-dashboard-1.7.1.jar

来启动一个 sentinel-dashboard 的实例。

启动成功后:

我们可以通过浏览器访问:

http://localhost:8080/

其中,用户名:sentinel

密码: sentinel

更多可用的启动参数配置:

java -D 参数名=参数值 -jar xx.jar
java -jar xx.jar --参数名=参数值

 

 

 

  • -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 分钟;
  • -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口。


三、搭建客户端

刚才我们搭建了 sentinel-dashboard,我们还需要搭建一个客户端,用于测试 sentinel 的各种功能。

我们将搭建如图所示的 Maven 项目结构:

3.1  使用 IDEA  创建子模块

选择 Maven 项目:

点击 Next:

Parent:选择 spring-cloud-alibaba-examples

Name:命名为 sentinel-example-client

其他的项保持默认值即可。

点击 Finish完成创建。

3.2  添加依赖

修改 sentinel-example-client 里面的 pom.xml 文件:

添加以下的内容:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
	</dependency>
</dependencies>

有 2 个依赖:

  • spring-cloud-starter-alibaba-sentinel 这是 springcloud 和 sentinel 集成的项目
  • spring-boot-starter-web 开启 web 最基础的依赖

添加 spring boot 的打包插件:

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

这样,我们的项目打包好了后,可以使用 java -jar 来直接运行了。

3.3  完整的 pom.xml

<?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>spring-cloud-alibaba-examples</artifactId>
		<groupId>com.bjsxt</groupId>
		<version>1.0</version>
	</parent>
	<modelVersion>4.0.0</modelVersion>
	<artifactId>sentinel-example-client</artifactId>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

3.4  添加一个配置文件

命名为:

修改该配置文件,添加以下的配置:

server:
  port: 8085
spring:
  application:
    name: sentinel-client
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719

其中:

  • spring.cloud.sentinel.transport.dashboard 指定了 sentinel 控制台的 ip 和端口地址;
  • spring.cloud.sentinel.transport.port 代表sentinel 客户端和控制台通信的端口,默认为8719,如果这个端口已经被占用,那么 sentinel 会自动从 8719 开始依次+1 扫描,直到找到未被占用的端口。

3.5  添加一个启动类

名称为:com.bjsxt.SentinelClientApplication

添加如下的代码:

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

3.6  添加一个 Controller

名称为:controller.TestController

在 TestContrller 里面添加如下接口:

@RestController
public classTestController {
	@GetMapping("/hello")
	public ResponseEntity<String> hello(){
		return ResponseEntity.ok("hello,sentinel") ;
	}
}

3.7  启动项目

在浏览器访问:

http://localhost:8080/#/dashboard/home

出现:

发现并没有任何的功能。

此时,我们访问一下我们写的 hello 接口:

http://localhost:8085/hello

多访问几次。

再次访问:

http://localhost:8080/#/dashboard/home

控制台已经显示正常了。

并且,在簇点链路中可以看到刚刚那笔请求,我们可以对它进行流控、降级、授权、热点等

配置(控制台是懒加载的,如果没有任何请求,那么控制台也不会有任何内容)。

四、流控规则

流量的控制规则。

在簇点链路列表中,点击/hello 后面的流控按钮:

出现:

  • 资源名:标识资源的唯一名称,默认为请求路径,也可以在客户端中使用@SentinelResource 配置;
  • 针 对 来 源 : Sentinel 可 以 针 对 服 务 调 用 者 进 行 限 流 , 填 写 微 服 务 名 称即spring.application.name,默认为 default,不区分来源;
  • 阈值类型、单机阈值:
  1. QPS(Queries-per-second,每秒钟的请求数量):当调用该 api 的 QPS 达到阈值的时候,进行限流;
  2. 线程数:当调用该 api 的线程数达到阈值的时候,进行限流。
  3. 是否集群:默认不集群;
  • 流控模式:
  1. 直接:当 api 调用达到限流条件的时,直接限流;
  2. 关联:当关联的资源请求达到阈值的时候,限流自己;
  3. 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,则进行限流)。
  •  流控效果:
  1. 快速失败:直接失败;
  2. Warm Up:根据 codeFactor(冷加载因子,默认值为 3)的值,从阈值/codeFactor,经过预热时长,才达到设置的 QPS 阈值;
  3. 排队等待:匀速排队,让请求匀速通过,阈值类型必须设置为 QPS,否则无效。

4.1 QPS  直接失败

演示下 QPS直接失败设置及效果。点击簇点链路列表中/hello 请求后面的流控按钮:

上面设置的效果是,1 秒钟内请求/hello 资源的次数达到 2 次以上的时候,进行限流。

点击新增完成该规则的设置。

现在,在浏览器访问:

http://localhost:8085/hello

当手速快点的时候(1 秒超过 2 次),页面返回 Blocked by Sentinel (flow limiting)。并且响应码为 429。

4.2  线程数直接失败

4.2.1 添加接口

在 TestController 里面新建一个接口。

/**
* 线程直接失败
* @return
* @throwsInterruptedException
*/
@GetMapping("/thread")
public ResponseEntity<String> threadMode() throws InterruptedException {
	TimeUnit.SECONDS.sleep(1);
	return ResponseEntity.ok("hello,sentinel!") ;
}

其中,我们添加了:

TimeUnit.SECONDS.sleep(1);

让线程睡 1s ,这样,更容易触发规则。

重启项目。

访问我们添加的 thread 的接口:

http://localhost:8085/thread

发现,页面需要等待 1s 左右才会响应,这是线程 sleep 的效果。

4.2.2 新增流控规则

点击新增,完成创建。

4.2.3 测试该规则

浏览器快速的访问:

http://localhost:8085/thread

4.3  关联

访问某个接口达到一定的流控规则后,开始限制本接口。

4.3.1 在 TestController 里面添加 api 接口

@GetMapping("/test1")
public ResponseEntity<String> test1(){
       return ResponseEntity.ok("hello,test1") ;
}
@GetMapping("/test2")
public ResponseEntity<String> test2(){
       return ResponseEntity.ok("hello,test2") ;
}

重启项目,正常的访问 test1,test2 测试:

4.3.2 添加规则

我们想让 test1 关联 test2,也就是说,访问 test2 接口达到某种规则后,开始限流 test1 。

上述流控规则表示:当 1 秒内访问/test2 的次数大于 2 的时候,限流/test1。

4.3.3 测试规则

我们使用打开 2 个网页,密集访问/test2,然后我们手动浏览器请求/test1,看看效果。

访问 test1:

发现已经开始限流了。

 

4.4  链路

程序的调用可以看成为一条链路。当触发链路的某条规则后,该链路被限流。

上图从 API 出发,可以发现有 2 条链路,分别为:

Link1-->hello-->other

Link2-->hello-->other

2 条链路在调用上,限流规则互补影响。

4.4.1 添加一个 Service

名称为:(service.TestService)

代码为:

@Service
public class TestService {
   public String hello(){
       return "hello" ;
   }
}

4.4.2 添加接口

@Autowired
private TestService testService ;
@GetMapping("/link1")
public ResponseEntity<String> link1(){
	return ResponseEntity.ok(String.format("link1,调用 test,结果为%s",testService.hello())) ;
}
@GetMapping("/link2")
public ResponseEntity<String> lin2(){
	return ResponseEntity.ok(
	String.format("link2,调用test,结果为%s",testService.hello())) ;
}

4.4.3 声明资源

我们现在把 TestService 里面的 hello 方法变成一个资源:

注意:

@SentinelResource("hello")将该方法标识为一个sentinel 资源,名称为hello。

然后重启测试:

4.4.4 添加链路规则

点击簇点链路:

此时我们给 hello 该资源限流:

在入口资源,我们使用的是 link1,点击新增,完成对规则的添加。

 

上述配置的意思是,当通过/link1 访问 hello 的时候,QPS 大于 2 则进行限流;

言外之意就是/link 访问 hello 请求并不受影响。

4.4.5 测试该规则

打开 link1 ,link2 接口。

快速访问 link1,再访问 link2:

访问测试 n 次,发现还是不能成功。难受!

具体的错误:

4.5  预热 Warm Up

流控效果除了直接失败外,我们也可以选择预热 Warm Up。

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

sentinel 客户端的默认冷加载因子 coldFactor 为 3,即请求 QPS 从 threshold / 3 开始,经预
热时长逐渐升至设定的 QPS 阈值。

比如:

我们给 hello 资源设置该规则。

上面的配置意思是:对于/hello 资源,一开始的 QPS 阈值为 3,经过 10 秒后,QPS 阈值达到 10。

新增完成后:

快速访问/hello

http://localhost:8085/hello

查看:

过程类似于下图:

前期在预热环境,突然的高 QPS 会导致系统直接拒绝访问,慢慢地,开始大量的介绍新的请求。

最快的手速点刷新,一开始会常看到 Blocked by Sentinel (flow limiting)的提示,10 秒后几乎不再出现(因为你的手速很难达到 1秒 10 下)。

4.6  排队等待

排队等待方式不会拒绝请求,而是严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过。

在 TestController里面添加接口:

private static Logger logger = LoggerFactory. getLogger( TestController.class ) ;
@GetMapping ( "/queue" )
public ResponseEntity < String > queue (){
	logger.info ( "开始处理请求" ) ;
	return ResponseEntity. ok( "ok" ) ;
}

重启项目并且访问 queue 接口:

给 queue 添加一个限流规则:

点击新增完成创建。

快速访问 queue 接口,观察后台的打印:

上述配置的含义是,访问/queue 请求每秒钟最多只能 1 次,超过的请求排队等待,等待超过 2000 毫秒则超时。新增该规则后,多次快速访问 localhost:8081/test1,sentinel 客户端控

制台日志打印如下:

五、降级规则

 

Sentinel 除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

当访问系统失败超过一定的次数后,对该接口进行熔断的操作。

我们可以发现,降级策略分为 3种:

  • RT,平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 5 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出 此 阈 值 的 都 会 算 作 4900 ms , 若 需 要 变 更 此 上 限 可 以 通 过 启 动 配 置 项-Dcsp.sentinel.statistic.max.rt=xxx 来配置。
  • 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
  • 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

5.1 RT

当 1s 内持续进入 5 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)

5.1.1 添加测试接口

@GetMapping ( "/rt" )
public ResponseEntity < String > rt () throws InterruptedException {
	TimeUnit. SECONDS .sleep ( 1 ) ;
	return ResponseEntity. ok( "ok" ) ;
}

5.1.2 添加降级的规则

在 1s 内,进入 5 个请求,若相应时间都超过 500ms ,则在接下来的 3s ,都执行熔断的机制。

5.1.3 测试

打开 Apache jmeter 。

文中所用jmeter百度网盘下载地址:

链接:https://pan.baidu.com/s/1o94QaFopjyNJC2YsDcdAAw 提取码:gw82

添加一个线程组:

1 s 10 个线程同时发请求。

添加一个取样器:

添加我们要测试的接口:

启动测试:

查看结果:

 

 

5.2  异常比例

当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,在接下来的时间窗口内,程序都会快速失败。

5.2.1 添加接口

@GetMapping ( "/exception" )
public ResponseEntity < String > exception () throws InterruptedException {
	throw new RuntimeException ( "就是不想成功!" ) ;
}

5.2.2 添加降级规则

上面的配置含义是:如果/exception 的 QPS 大于 5,并且每秒钟的请求异常比例大于 0.5的话,那么在未来的 3秒钟(时间窗口)内,sentinel 断路器打开,该 api 接口不可用。

也就是说,如果一秒内有 10 个请求进来,超过 5 个以上都出错,那么会触发熔断,1
秒钟内这个接口不可用。

5.2.3 测试

打开 Jmeter,修改请求的地址:

开始测试。

在浏览器打开:

http://localhost:8086/exception

直接被熔断,停止 jemter,等待 3s,在此访问:

5.3  异常数

当策略为异常数时表示:当指定时间窗口内,请求异常数大于等于某个值时,触发降级。继续使用上面的接口测试。

5.3.1 添加规则

上面的规则表示:在 60 秒内,访问/exception 请求异常的次数大于等于 5,则触发降级。

5.3.2 测试该规则

可以看到,当第 5次访问的时候成功触发了降级。


六、热点规则

 

热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的数据,并对其访问进行限制。

6.1  添加一个接口

@GetMapping ( "/buy" )
@SentinelResource("buy")
public ResponseEntity < String > buy ( String prodName,Integer prodCount ){
	return ResponseEntity. ok( "买" + prodCount+ "份" + prodName ) ;
}

6.2  添加热点的规则

对这个资源添加热点规则:

上面的配置含义是:对 buy 资源添加热点规则,当第 0 个参数的值为华为的时候 QPS阈值为 3,否则为1。此外,如果第 0 个参数不传,那么这笔请求不受该热点规则限制。

6.3  测试效果

不是华为:

买 1次后,里面限流。

是华为:同时买 3次,才限流。


七、系统规则

系统规则则是针对整个系统设置限流规则,并不针对某个资源,设置页面如下:

阈值类型包含以下五种:

  • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps minRt估算得出。设定参考值一般是 CPU cores 2.5。
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

 


八、授权规则

 

授权规则用于配置资源的黑白名单:

上述配置表示:只有 appA 和appB 才能访问test1 资源。

案例源码gitee地址:https://gitee.com/BanSheng/spring-cloud-alibaba-examples/tree/master/sentinel-example-client

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

(六)Spring Cloud Alibaba Sentinel(含案例源码、案例解析及软件) 的相关文章

  • UE编辑器下简单把 excel格式的表格转换为wiki支持的表格

    觉得 wiki下 mediawiki 导入excel和word表格好麻烦 微软自带的offic插件wiki转换工具一直都安装不上 为了更新wiki内容只能手动来做了后来总结了以下手动方法 1 复制编辑好的Excel表格到记事本 用ue打开
  • 关于构造函数

    使用构造函数 两种使用构造函数的初始化方式 Stock food Stock World 250 1 25 等价于 Stock garment Furry 50 2 5 将构造函数与new一起使用 new可以调用构造函数 Stock pst
  • 利用input上传图片以及文件视频音频等

    这里说的input指的就是我们常用的
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • 一个超级棒的VUE流程设计器--easy-flow开箱即用

    今天小编推荐一款流程设计器easy flow easy flow基于VUE ElementUI JsPlumb的流程设计器 通过 vuedraggable 插件来实现节点拖拽 功能介绍 支持拖拽添加节点 点击线进行设置条件 支持给定数据加载
  • JSON介绍及代码示例

    了解json JSON是什么 JSON是JavaScript Object Notation的缩写 它是一种数据交换格式 在JSON出现之前 大家一直用XML来传递数据 因为XML是一种纯文本格式 所以它适合在网络上交换数据 XML本身不算
  • MFC ListControl

    1 ListControl的基本创建 基本设置 m ListCtrl DeleteAllItems m ListCtrl InsertColumn 0 T NBA m ListCtrl InsertColumn 1 T Final Cham
  • office2010 卸载出现“安装程序找不到ProPlus.ww\ProPsWW.cab 请浏览正确的安装源的错”解决方法

    笔者在换电脑后想卸载office2010安装office2016 但是卸载的过程中遇到了上述问题就记录一下自己的解决方案 1 强制删除officeX对应的文件夹 然后使用toolkit工具清理即可 笔者是通过这种方法解决的 2 应该也可以使
  • C++STL之deque容器

    概述 上一篇我们讲过queue容器 它是一个单向的队列 只能从尾部插入 头部删除 而本节讲的deque容器 它是一个双向的队列 在头尾均可以调用插入与删除 并且支持迭代器和迭代器随机访问 这是它与queue的最大区别 实际上 deque容器
  • c++读取文件

    include
  • 7z命令行加密文件夹和文件名

    因为有时候需要将非常机密的东西上传到网盘 毕竟网盘也不一定安全 而每次都鼠标点添加密码很麻烦 然后就用命令行脚本弄快 电脑安装7zip 在你要压缩的文件夹打开命令行 7z a r pABC12345 mhe on test 7z a 添加f
  • 5 款最棒的 Vue 移动端 UI 组件库 - 特别针对国内使用场景推荐

    本文完整版 最棒的 Vue 移动端 UI 组件库 特别针对国内使用场景推荐 Vue 移动端 UI 组件库推荐 Vant 3 有赞移动 UI 组件库 支持 Vue 3 微信小程序 支付宝小程序 Cube UI 滴滴出行移动端 UI 库 质量可
  • 关于直流电源纹波和噪声的测量的分析和介绍

    电源纹波和噪声的定义PARD periodicand random deviation 1 电源纹波 Power Ripple 直流电压 电流中 叠加在直流稳定量上的交流分量 用电压和电流的均方根值 mVrms mArms 或峰峰值 mVp
  • 优秀LOGO的六大特质

    1 识别性 大多数的设计师认为 识别性是最容易在艺术设计和商业设计上发生冲突的地方 很多设计师都抱怨客户没有审美 喜欢平庸的LOGO设计 而一些客户认为设计师缺乏对公司和产品的理解 不懂营销 归根到底 无论设计师的设计多么创新 多么独特 始
  • 【word】错误!文档中没有指定样式的文字。 1

    问题 给文档中的图片插入题注时 报错 错误 文档中没有指定样式的文字 1 解决办法 光标定位到错误信息上 单击右键 选择 编辑域 在弹出的 域 对话框中 左侧的 域名 列表中选择 StyleRef 在右侧的 样式名 列表中选择 列表段落
  • Fabric private data入门实战

    Hyperledger Fabric private data是1 2版本引入的新特性 fabric private data是利用旁支数据库 SideDB 来保存若干个通道成员之间的私有数据 从而在通道之上又提供了一层更灵活的数据保护机制
  • VSCode中配置命令行参数

    VSCode中配置命令行参数 在跑程序调试的时候 可以直接使用脚本运行程序 这个时候调试代码只能用pdb 我觉得不太习惯 而且感觉不是很好 所以想这能不能将运行程序的脚本中的命令直接配置到vscode上 就有了这篇记录 正常vscode D
  • DHCP配置实战

    1 DHCP简介 DHCP dynamic host configuration protocol 动态的主机配置协议 基于TCP P的网络 DHCP减少了重新配置计算机IP地址的工作量 在TCP P网络中 IP地址的规划与分配是一件重要而
  • Java手写广度优先搜索和案例拓展

    Java手写广度优先搜索和案例拓展 手写必要性 手写实现广度优先搜索算法主要有以下几个必要性 理解算法原理 通过手写实现广度优先搜索算法 能够深入理解算法的原理和运行机制 这有助于我们更好地理解广度优先搜索的核心思想和优势 并能应用于解决其

随机推荐

  • pa皮安级电流检测电路

    1 芯片 ad8602 lmc6062 2 电路
  • Eclipse中targetlm2e-wtplweb-resources\META-1(Click for details)解决办法

    targetlm2e wtplweb resources META 1 Click for details 系统找不到指定的路径 解决办法 最近总是发现我的eclipse里面的maven项目总是报错误时不时地出现 然后我自己更新一下mave
  • Qt学习(三)—— lambda表达式

    lambda表达式 lambda 表达式是 C 11 新增的新特性 用于定义并创建匿名的函数对象 在 Qt 中配合信号一起使用 使用lambda表达式的好处在于不用定义槽函数 也不用指定信号接收者 为了使用 lambda 表达式 需要在项目
  • Flutter - okToast封装

    demo 地址 https github com iotjin jh flutter demo 使用版本 加载框 https pub flutter io cn packages oktoast readme tab oktoast 2 3
  • 【70】爬楼梯问题求解

    题目描述 思路分析 当阶数为 1 时 解法为 1 当阶数为 2 时 解法为 2 当阶数为 3 时 解法为 3 当阶数为 4 时 解法为 5 很明显可以分析出 一下公式 代码实现 递归法 class Solution public int c
  • MATLAB实现遗传算法求解n维变量函数的最小值问题

    一 问题简述 本文以遗传算法求解30维变量函数的最小值问题举例 式中 且 二 遗传算法概述 遗传算法 genetic algorithm GA 是一种仿效生物界中 物竞天择 适者生存 演化法则的进化算法 将问题参数编码为染色体 利用迭代的方
  • cv2.minAreaRect()

    功能 求出在点集下的最小面积矩形 输入 格式 points array shape n 1 2 解释 其中points是点集 数据类型为ndarray array x1 y1 x2 y2 xn yn 输出 格式 rect tuple x y
  • Centos7 安装 postgreSQL

    谷明科技 专注于大数据和人工智能领域的创新者 PostgreSQL 介绍 PostgreSQL 是一个开源且强大的关系型数据库 且具有多平台扩展能力 不同于传统的关系型数据库 例如mysql sqlserver等 PostgreSQL使用S
  • this调用本类的其他构造器

    Student类 package Java project 1 public class Student private String name private String schoolName public Student public
  • javascript的函数中this指向判断

    前言 最近在写 React 项目 然后补习了下 es6 的 class 发现 实例方法被赋值后 this 指向 undefined 这里对 this 指向作一次总结 一 通过 函数的 调用方式 来判断 this 指向 1 函数名 通过 函数
  • Zero-ETL、大模型和数据工程的未来

    编者按 本文探讨了数据工程领域的未来趋势和挑战 以及其不断变化 甚至经常出现 重塑 的特点 在数据工程领域 大数据的性能 容量提升总是有一定的上限 每一次进步都会带来一定的技术提升 从而提高上限 但是很快我们就能到达这个上限 直到下一次技术
  • 【Bugfix】flutter GetX 使用 Obx 监听 GetxController 时,页面退出 GetxController 无法销毁

    背景 我的页面数据全来自 GetxController 每次进入时需要重置数据 但 GetX 似乎把 GetxController 保留了 下次在进入页面直接复用了之前的数据 导致数据混乱 尝试 一下调用均不能销毁 GetxControll
  • 设置windos电脑开机自动启动chrome浏览器,并且打开指定网页

    需求 web项目设置windos电脑开机自动启动chrome浏览器 打开指定网页地址 并设置为全屏显示 解决 使用windos的bat脚本 设置为开机自启动 代码如下 echo off cd d dp0 title Chrome taskl
  • Unity中UI组件

    一 Canvers 画布组件 Canvers下面是添加Button和Image组件 Rect Transform 1 Position 坐标位置 2 Width Height 高宽尺寸 3 Anchors 锚点 4 Pivot中心点 即UI
  • VRRP和DHCP配置

    1 VRRP术语 2 VRRP工作过程 3 DHCP的优势 4 DHCP的工作原理 1 VRRP术语 VRRP 也即虚拟路由器冗余协议 利用VRRP 一组路由器 同一个LAN中的接口 协同工作 但只有一个处于Master状态 处于该状态的路
  • 7-3 删除字符 (30 分)

    这位更是重量级 输入一个字符串 str 再输入要删除字符 c 大小写不区分 将字符串 str 中出现的所有字符 c 删除 提示 去掉两端的空格 输入格式 在第一行中输入一行字符 在第二行输入待删除的字符 输出格式 在一行中输出删除后的字符串
  • java中String作为参数传递终极解决

    今天我遇到一个问题就是string的传值问题 它虽然是一个引用数据类型 但是却和基本数据类型一样无法被改变 我看到网上的很多解释都很离谱 比如说很多解释说String要看成和Integer一样的包装类 看成 是char 的包装类 所以和其一
  • 快速开始一个 CakePHP project 的 基础/步骤

    请参考 CakePhP cookbook4 0 好的这就是本文和全部与核心 你可以跳出去了 好 正经一点 回来 1 下载xampp php集成环境 2 下载cakephp 框架 查看cookbook中的installation a 若用的x
  • 引进包类

    使用Support Library 支持库 Using the Support Library 负责人 River 完成时间 7月18日 原文链接 http developer android com training basics fra
  • (六)Spring Cloud Alibaba Sentinel(含案例源码、案例解析及软件)

    案例源码gitee地址 https gitee com BanSheng spring cloud alibaba examples tree master sentinel example client Spring Cloud Alib