当前位置: 首页 > news >正文

Spring Cloud Alibaba全家桶(七)——Sentinel控制台规则配置

前言

在这里插入图片描述

本文小新为大家带来 Sentinel控制台规则配置 相关知识,具体内容包括流控规则(包括:QPS流控规则并发线程数流控规则),BlockException统一异常处理流控模式(包括:直接流控模式关联流控模式链路流控模式预热流控效果),熔断降级规则(包括:熔断降级规则说明熔断策略),热点参数限流系统规则授权控制规则集群规则等进行详尽介绍~

不积跬步,无以至千里;不积小流,无以成江海。每天进步一点点,在成为强者的路上,小新与大家共同成长!

📌博主主页:小新要变强 的主页
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~
👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)

↩️本文上接:Spring Cloud Alibaba全家桶(六)——微服务组件Sentinel介绍与使用


目录

Sentinel控制台规则配置

  • 前言
  • 目录
  • 一、流控规则
    • 1️⃣QPS流控规则
    • 2️⃣并发线程数流控规则
  • 二、BlockException统一异常处理
  • 三、流控模式
    • 1️⃣直接流控模式
    • 2️⃣关联流控模式
    • 3️⃣链路流控模式
    • 4️⃣预热流控效果
  • 四、熔断降级规则
    • 1️⃣熔断降级规则说明
    • 2️⃣熔断策略
  • 五、热点参数限流
  • 六、系统规则
  • 七、授权控制规则
  • 八、集群规则
  • 后记

在这里插入图片描述

一、流控规则

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

在这里插入图片描述

在这里插入图片描述

同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果。

Field说明默认值
resource资源名,资源名是限流规则的作用对象
count限流阈值
grade限流阈值类型,QPS 模式(1)或并发线程数模式(0)QPS 模式
limitApp流控针对的调用来源default,代表不区分调用来源
strategy调用关系限流策略:直接、链路、关联根据资源本身(直接)
controlBehavior流控效果(直接拒绝/WarmUp/匀速+排队等待),不支持按调用关系限流直接拒绝
clusterMode是否集群限流

参考文档:https://github.com/alibaba/Sentinel/wiki/流量控制

1️⃣QPS流控规则

QPS(Query Per Second):每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。

进入簇点链路选择具体的访问的API,然后点击流控按钮。

在这里插入图片描述

测试:

在这里插入图片描述

2️⃣并发线程数流控规则

并发数控制用于保护业务线程池不被慢调用耗尽。例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗尽。为应对太多线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(线程池隔离)。这种隔离方案虽然隔离性比较好,但是代价就是线程数目太多,线程上下文切换的 overhead 比较大,特别是对低延时的调用有比较大的影响。

Sentinel 并发控制不负责创建和管理线程池,而是简单统计当前请求上下文的线程数目(正在执行的调用数目),如果超出阈值,新的请求会被立即拒绝,效果类似于信号量隔离。并发数控制通常在调用端进行配置。

在这里插入图片描述

可以利用jmeter测试:

在这里插入图片描述

二、BlockException统一异常处理

springwebmvc接口资源(BlockException异常统一处理)限流入口在HandlerInterceptor的实现类AbstractSentinelInterceptor的preHandle方法中,对异常的处理是BlockExceptionHandler的实现类,sentinel 1.7.1 引入了sentinel-spring-webmvc-adapter.jar 。

自定义BlockExceptionHandler 的实现类统一处理BlockException:

@Slf4j
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response,    BlockException e) throws Exception {log.info("BlockExceptionHandler BlockException================"+e.getRule());R r = null;if (e instanceof FlowException) {r = R.error(100,"接口限流了");} else if (e instanceof DegradeException) {r = R.error(101,"服务降级了");} else if (e instanceof ParamFlowException) {r = R.error(102,"热点参数限流了");} else if (e instanceof SystemBlockException) {r = R.error(103,"触发系统保护规则了");} else if (e instanceof AuthorityException) {r = R.error(104,"授权规则不通过");}//返回json数据response.setStatus(500);response.setCharacterEncoding("utf‐8");response.setContentType(MediaType.APPLICATION_JSON_VALUE);new ObjectMapper().writeValue(response.getWriter(), r);}
}

测试:

在这里插入图片描述

三、流控模式

基于调用关系的流量控制。调用关系包括调用方、被调用方;一个方法可能会调用其它方法,形成一个调用链路的层次关系。

1️⃣直接流控模式

资源(直接 )调用达到设置的阈值后直接被流控抛出异常。

在这里插入图片描述

2️⃣关联流控模式

当两(关联)个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。

在这里插入图片描述

3️⃣链路流控模式

根据(链路)调用链路入口限流。

下面中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。这棵树的根节点是一个名字为 getUser 的虚拟节点,调用链的入口都是这个虚节点的子节点。

一棵典型的调用树如下图所示:

getUser
/ \
/ \
/order/test1 /order/test2

上图中来自入口 /order/test1 和 /order/test2的请求都调用到了资源 getUser,Sentinel 允许只根据某个入口的统计信息对资源限流。

在这里插入图片描述

测试会发现链路规则不生效。

注意,高版本此功能直接使用不生效,如何解决?

  • 从1.6.3 版本开始,Sentinel Web filter默认收敛所有URL的入口context,因此链路限流不生效。
  • 1.7.0 版本开始(对应SCA的2.1.1.RELEASE),官方在CommonFilter 引入了WEB_CONTEXT_UNIFY 参数,用于控制是否收敛context。将其配置为 false 即可根据不同的URL 进行链路限流。
  • SCA 2.1.1.RELEASE之后的版本,可以通过配置spring.cloud.sentinel.web-context-unify=false即可关闭收敛。
spring.cloud.sentinel.web‐context‐unify: false

测试:

此场景拦截不到BlockException,对应@SentinelResource指定的资源必须在@SentinelResource注解中指定 blockHandler处理BlockException。

总结:

为了解决链路规则引入ComonFilter的方式,除了此处问题,还会导致更多的问题,不建议使用ComonFilter的方式。 流控链路模式的问题等待官方后续修复,或者使用AHAS。

4️⃣预热流控效果

(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。

🍀(1)Warm Up(激增流量 )

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

冷加载因子: codeFactor 默认是3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。通常冷启动的过程系统允许通过的 QPS 曲线如下图所示:

在这里插入图片描述

测试用例:

@RequestMapping("/test")
public String test() {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return "========test()========";
}

编辑流控规则:

在这里插入图片描述

jmeter测试:

在这里插入图片描述

查看实时监控,可以看到通过QPS存在缓慢增加的过程:

在这里插入图片描述

🍀(2)匀速排队(脉冲流量)

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。

该方式的作用如下图所示:

在这里插入图片描述

这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

注意: 匀速排队模式暂时不支持 QPS > 1000 的场景。

在这里插入图片描述

jemeter压测:

在这里插入图片描述

查看实时监控,可以看到通过QPS为5,体现了匀速排队效果。

在这里插入图片描述

四、熔断降级规则

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。

在这里插入图片描述

在这里插入图片描述

1️⃣熔断降级规则说明

熔断降级规则(DegradeRule)包含下面几个重要的属性:

Field说明默认值
resource资源名,即规则的作用对象
grade熔断策略,支持慢调用比例/异常比例/异常数策略慢调用比例
count慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
timeWindow熔断时长,单位为 s
minRequestAmount熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)5
statIntervalMs统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)1000 ms
slowRatioThreshold慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

2️⃣熔断策略

🍀(1)慢调用比例

慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF­OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

在这里插入图片描述

测试用例:

@RequestMapping("/test")
public String test() {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return "========test()========";
}

jemeter压测/test接口,保证每秒请求数超过配置的最小请求数:

在这里插入图片描述

查看实时监控,可以看到断路器熔断效果:

在这里插入图片描述

此时浏览器访问会出现服务降级结果:

在这里插入图片描述

🍀(2)异常比例

异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF­OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% ­ 100%。

测试用例:

@RequestMapping("/test2")
public String test2() {atomicInteger.getAndIncrement();if (atomicInteger.get() % 2 == 0){//模拟异常和异常比率int i = 1/0;}return "========test2()========";
}

配置降级规则:

在这里插入图片描述

查看实时监控,可以看到断路器熔断效果:

在这里插入图片描述

🍀(3)异常数

异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF­OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

注意:异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效。

配置降级规则:

在这里插入图片描述

jemeter测试:

在这里插入图片描述

查看实时监控,可以看到断路器熔断效果:

在这里插入图片描述

整合openfeign进行降级:

在这里插入图片描述

引入依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring‐cloud‐starter‐alibaba‐sentinel</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>

application.yml:

#对Feign的支持
feign:sentinel:enabled: true # 添加feign对sentinel的支持

openfegin接口:

@FeignClient(value = "nacos‐payment‐provider",fallback =ConsumerFallBackService.class )
public interface ConsumerService {@GetMapping(value = "/paymentSQL/{id}")public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id);
}

openfegin的fallback实现类:

@Component
public class ConsumerFallBackService implements ConsumerService {@Overridepublic CommonResult<Payment> paymentSQL(Long id) {return new CommonResult<Payment>("500","进入兜底方法‐‐‐ConsumerFallBackService",null);}
}

五、热点参数限流

热点参数限流 热点识别流控何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的数据,并对其访问进行限制。比如:

在这里插入图片描述

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

在这里插入图片描述

注意:

  1. 热点规则需要使用@SentinelResource(“resourceName”)注解,否则不生效
  2. 参数必须是7种基本数据类型才会生效

测试用例:

@RequestMapping("/info/{id}")
@SentinelResource(value = "userinfo",blockHandlerClass = CommonBlockHandler.class,blockHandler = "handleException2",fallbackClass = CommonFallback.class,fallback = "fallback")
public R info(@PathVariable("id") Integer id){UserEntity user = userService.getById(id);return R.ok().put("user", user);
}

单机阈值: 针对所有参数的值进行设置的一个公共的阈值

  1. 假设当前 参数 大部分的值都是热点流量, 单机阈值就是针对热点流量进行设置, 额外针对普通流量进行参数值流控
  2. 假设当前 参数 大部分的值都是普通流量, 单机阈值就是针对普通流量进行设置, 额外针对热点流量进行参数值流控

配置热点参数规则:

注意: 资源名必须是@SentinelResource(value=“资源名”)中 配置的资源名,热点规则依赖于注解。

在这里插入图片描述

具体到参数值限流,配置参数值为3,限流阈值为1。

在这里插入图片描述

测试:

http://localhost:8800/user/info/1 限流的阈值为3 ;
http://localhost:8800/user/info/3 限流的阈值为1。

![在这里插入图片描述](https://img-blog.csdnimg.cn/ec667e76c7844353a0dc7322d2368f90.png#pic_center 400x)

六、系统规则

在这里插入图片描述

Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

  • 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 达到阈值即触发系统保护。

编写系统规则:

在这里插入图片描述

jemeter配置:

在这里插入图片描述

测试结果:

在这里插入图片描述

七、授权控制规则

很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

来源访问控制规则(AuthorityRule)非常简单,主要有以下配置项:

  • resource:资源名,即限流规则的作用对象。
  • limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB。
  • strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。

配置授权规则:

在这里插入图片描述

第一步:实现com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser接口,在parseOrigin方法中区分来源,并交给spring管理注意:如果引入CommonFilter,此处会多出一个:

在这里插入图片描述

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;/**
* @author Fox
*/
@Component
public class MyRequestOriginParser implements RequestOriginParser {/*** 通过request获取来源标识,交给授权规则进行匹配* @param request* @return*/@Overridepublic String parseOrigin(HttpServletRequest request) {// 标识字段名称可以自定义String origin = request.getParameter("serviceName");// if (StringUtil.isBlank(origin)){// throw new IllegalArgumentException("serviceName参数未指定");// }return origin;}
}

测试:origin是order的请求不通过。

在这里插入图片描述
在这里插入图片描述

八、集群规则

为什么要使用集群流控呢?假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50,但机器数可能很多(比如有 100 台)。这时候我们很自然地就想到,找一个 server 来专门来统计总的调用量,其它的实例都与这台 server 通信来判断是否可以调用。这就是最基础的集群流控的方式。

另外集群流控还可以解决流量不均匀导致总体限流效果不佳的问题。假设集群中有 10 台机器,我们给每台机器设置单机限流阈值为 10 QPS,理想情况下整个集群的限流阈值就为 100 QPS。不过实际情况下流量到每台机器可能会不均匀,会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机维度去限制的话会无法精确地限制总体流量。而集群流控可以精确地控制整个集群的调用总量,结合单机限流兜底,可以更好地发挥流量控制的效果。

https://github.com/alibaba/Sentinel/wiki/集群流控

集群流控中共有两种身份:

  • Token Client:集群流控客户端,用于向所属 Token Server 通信请求token。集群限流服务端会返回给客户端结果,决定是否限流。
  • Token Server:即集群流控服务端,处理来自 Token Client的请求,根据配置的集群规则判断是否应该发放token(是否允许通过)。

Sentinel 集群流控支持限流规则和热点规则两种规则,并支持两种形式的阈值计算方式:

  • 集群总体模式:即限制整个集群内的某个资源的总体 qps 不超过此阈值。
  • 单机均摊模式:单机均摊模式下配置的阈值等同于单机能够承受的限额,token server 会根据连接数来计算总的阈值(比如独立模式下有 3个 client 连接到了 token server,然后配的单机均摊阈值为 10,则计算出的集群总量就为30),按照计算出的总的阈值来进行限制。这种方式根据当前的连接数实时计算总的阈值,对于机器经常进行变更的环境非常适合。

Sentinel 集群限流服务端有两种启动方式:

  • 独立模式(Alone),即作为独立的 token server 进程启动,独立部署,隔离性好,但是需要额外的部署操作。独立模式适合作为Global Rate Limiter 给集群提供流控服务。

在这里插入图片描述

  • 嵌入模式(Embedded),即作为内置的 token server与服务在同一进程中启动。在此模式下,集群中各个实例都是对等的,token server 和 client可以随时进行转变,因此无需单独部署,灵活性比较好。但是隔离性不佳,需要限制 token server 的总QPS,防止影响应用本身。嵌入模式适合某个应用集群内部的流控。

在这里插入图片描述

云上版本 AHAS Sentinel 提供开箱即用的全自动托管集群流控能力,无需手动指定/分配 token server 以及管理连接状态,同时支持分钟小时级别流控、大流量低延时场景流控场景,同时支持 Istio/Envoy 场景的 Mesh 流控能力。


后记

在这里插入图片描述

👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~

相关文章:

Spring Cloud Alibaba全家桶(七)——Sentinel控制台规则配置

前言 本文小新为大家带来 Sentinel控制台规则配置 相关知识&#xff0c;具体内容包括流控规则&#xff08;包括&#xff1a;QPS流控规则&#xff0c;并发线程数流控规则&#xff09;&#xff0c;BlockException统一异常处理&#xff0c;流控模式&#xff08;包括&#xff1a;直…...

mysql-installer安装教程(详细图文)

目录 1.安装 2.配置系统环境变量 3.配置初始化my.ini文件 4.MySQL彻底删除 5.Navicat 安装 1.安装 先去官网下载需要的msi&#xff0c;在这放出官网下载地址下载地址 这里我具体以8.0.28 为安装例子&#xff0c;除了最新版安装界面有些变动以往的都是差不多的。 过去的版本…...

微服务架构第一阶段(nacos,gateWay,RPC)

最近在学习完 springcloud 微服务架构之后&#xff0c;自己用了之前的一个项目计划拆分成微服务的项目&#xff0c;第一阶段要求整合 nacos&#xff0c;RPC以及gateWay&#xff0c;首先来看一下几个技术组件的概念 RPC RPC 框架 —— 远程过程调用协议RPC&#xff08;Remote …...

【Azure 架构师学习笔记】-Azure Data Factory (5)-Managed VNet

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器 前言 PaaS服务默认都经过公网传输&#xff0c; 这对很多企业而言并不安全&#xff0c;那么就需要对其进行安全改…...

ActiveMQ(三)

协议配置 ActiveMQ 支持的协议有 TCP 、 UDP、NIO、SSL、HTTP(S) 、VM 这是activemq 的activemq.xml 中配置文件设置协议的地方 <transportConnector name"openwire" uri"tcp://0.0.0.0:61616?maximumCon nections1000&amp;wireFormat.maxFrameSiz…...

区块链多方计算 人工智能学习笔记

区块链&#xff1a;让数据不被篡改&#xff0c;但需要复制数据给每一块&#xff0c;造成数据泄露 多方计算 &#xff1a; 让数据用途可控。数控可用但不可见。 人工智能&#xff1a;数据更难造假 主讲人简介&#xff1a; 徐葳&#xff0c;宾夕法尼亚大学学士&#xff08;在清华…...

基于opencv的边缘检测方法

1、梯度运算 用OpenCV的形态变换&#xff08; 膨胀、腐蚀、开运算和闭运算&#xff09;函数morphologyEx 梯度运算即膨胀结果-腐蚀结果&#xff1a; 【注意】对于二值图像来说&#xff0c;必须是前景图像为白色&#xff0c;背景为黑色&#xff0c;否则需要进行反二值化处理 …...

视频封装格式篇(TS)

本篇介绍下TS的封装格式。 1.什么是TS&#xff1f; TS&#xff08;Transport Stream&#xff0c;传输流&#xff09;&#xff0c;一种常见的视频封装格式&#xff0c;是基于MPEG-2的封装格式&#xff08;所以也叫MPEG-TS&#xff09;&#xff0c;后缀为.ts。 2.TS的分层结构 …...

静态路由+DHCP实验(四路由器八PC)

一.200.1.1.0/24子网划分 1.划分八个子网 2.选用前5个&#xff0c;第五个子网再划分4个子网作为骨干 二.规划路由 三.配置&#xff08;下一跳&#xff09; 1.先依次实现四个路由器之间全网可通 2.为路由器配置地址池&#xff0c;使用全局模式获取dhcp&#xff0c;指定网关…...

数据挖掘(作业汇总)

目录 环境配置 实验1 数据 作业2 环境配置 实验开始前先配置环境 以实验室2023安装的版本为例&#xff1a; 1、安装anaconda&#xff1a;&#xff08;anaconda自带Python,安装了anaconda就不用再安装Python了&#xff09; 下载并安装 Anaconda3-2022.10-Windows-x86_64.ex…...

基于微信小程序的图书馆选座系统源码

开发环境及工具&#xff1a; 大等于jdk1.8&#xff0c;大于mysql5.5&#xff0c;idea&#xff08;eclipse&#xff09;&#xff0c;微信开发者工具 技术说明&#xff1a; springboot mybatis 小程序 代码注释齐全&#xff0c;没有多余代码&#xff0c;适合学习&#xff08;…...

K8S 三种探针 readinessProbe、livenessProbe和startupProbe

一、POD状态 Pod 常见的状态 Pending&#xff1a;挂起&#xff0c;我们在请求创建pod时&#xff0c;条件不满足&#xff0c;调度没有完成&#xff0c;没有任何一个节点能满足调度条件。已经创建了但是没有适合它运行的节点叫做挂起&#xff0c;这其中也包含集群为容器创建网络…...

Android 设置背景颜色透明度

前言 本章是对设计给出的颜色做透明度的处理 原因 一般情况下我们是不需要做处理的&#xff0c;那为什么又需要我们做透明度呢&#xff0c;原因就是咱们的设计小哥哥、小姐姐们没有自己做处理&#xff0c;如果处理了的话&#xff0c;我们直接使用设计标注的AHEX颜色就行&a…...

聚类算法层次聚类

###cluster.py #导入相应的包 import scipy import scipy.cluster.hierarchy as sch from scipy.cluster.vq import vq,kmeans,whiten import numpy as np import matplotlib.pylab as plt #生成待聚类的数据点,这里生成了20个点,每个点4维: pointsscipy.randn(20,4) #加一…...

js 数据类型

1.概念 数据类型指的是可以在程序中存储和操作的值的类型&#xff0c;每种编程语言都有其支持的数据类型&#xff0c;不同的数据类型用来存储不同的数据&#xff0c;例如文本、数值、图像等。 JavaScript 是一种动态类型的语言&#xff0c;在定义变量时不需要提前指定变量的类…...

多级评论单表结构设计

这里的多级&#xff0c;本质上其实也就二级&#xff0c;例如微博的评论&#xff0c; 一级评论&#xff1a; 对微博的评论 二级评论&#xff1a; 对微博下的评论的回复评论 &#xff0c;这里包括二种 1. 回复的是一级评论&#xff0c; 2, 回复的是二级评论 效果如下 表数据 查…...

Mac M1通过VMWare Fusion安装Centos7记录(镜像和网络有大坑)

以前用linux系统基本都在我的服务器上或者是在win上进行&#xff0c;从没有在M1上进行创建&#xff0c;因此走了一些坑吧&#xff0c;这里会列出我的详细安装步骤。 下载镜像 镜像的下载网站&#xff1a;https://www.centos.org/download/ 在该网站中&#xff0c;不管是Every…...

女生适合当程序员吗?

在这个节日里&#xff0c;让我们来讨论一个比较热门的话题吧。女生到底适不适合当程序员&#xff1f; 在开启这个话题前&#xff0c;我们先来认识一位伟大的女性吧。 阿达洛芙莱斯&#xff08;Augusta Ada King&#xff09;是著名英国诗人拜伦之女&#xff0c;她本职是一位数…...

昇腾AI机器人发布,12家企业、5家高校签约,昇腾AI开发者创享日全国巡展沈阳首站成功举办

“创未来&#xff0c;享非凡”昇腾AI开发者创享日2023年全国巡回首站活动成功举办&#xff0c;本次活动由辽宁省科技厅指导&#xff0c;由沈阳市科技局、浑南区人民政府、沈阳高新区管理委员会、华为技术有限公司共同主办&#xff0c;沈阳昇腾人工智能生态创新中心承办&#xf…...

anaconda如何改变虚拟环境安装路径

1、查看anaconda的环境配置&#xff08;对应结果如下图所示&#xff09; conda config --show 或者 conda info 查看虚拟环境安装位置的结果如上图所示 2、修改配置语法 conda config --add key value #添加语法 conda config --remove key value #删除语法 其中&#xff0…...

根据卫星运动矢量计算轨道六根数

前言 STK软件在给定六根数时&#xff0c;可求得卫星位置和速度矢量&#xff0c;但有时我们通过星历参数得到卫星的位置和速度矢量&#xff0c;希望能够反演得出卫星轨道的六根数。从而方便对该卫星轨道进行仿真模拟。 计算过程 给定卫星在J2000坐标系下的的位置矢量r和速度矢…...

关于微信小程序安装npm的过程,从下载到小程序内部安装完成

1.先从官网下载nodejs 网站为Node.js (nodejs.org)&#xff0c;选择左边第一个2 然后一直next&#xff0c;选默认就行 选择自己喜欢的路径我的是D:\nodejs-v18.12.1 3 下载完成后&#xff0c;先在安装文件夹中新建两个文件夹 node_cache node_global 4 配置一下环境变量&…...

IO-操作系统

用户态和内核态 现代操作系统&#xff0c;为了保护系统的安全&#xff0c;都会划分出内核空间和用户空间&#xff0c;或者我们经常说的内核态和用户态。简单来说&#xff0c;就是划分为内核态和用户态两个等级&#xff0c;运行在用户态的进程大都是一些应用程序&#xff0c;能够…...

Downie 4 4.6.12 MAC上最好的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的站点&…...

unity 玩家移动时idle和run动画频繁切换

项目场景&#xff1a; unity 控制玩家移动 问题描述 idle和run动画频繁切换 void Movement(){ xVelocity Input.GetAxisRaw("Horizontal"); anim.SetFloat("speed",Mathf.Abs(rb.velocity.x));//跑动动画 if(xVelocity !0){ transform.localScal…...

小程序 table组件

最近有在小程序中用table的需求&#xff0c;但是没有找到有符合要求的组件&#xff0c;所以自己弄了一个&#xff0c;能满足基本需求。 组件下载:https://download.csdn.net/download/weixin_67585820/85047405 引入 "usingComponents": {"table": "…...

利用摄影测量进行地形建模的介绍

一、前言 从一个地方到另一个地方的地球表面由连续和突然的海拔变化组成&#xff0c;个人和社会都必须应对这些变化。 水从高山和丘陵向下流&#xff0c;从溪流流入河流&#xff0c;形成三角洲&#xff0c;最终汇入大海。 三维 (3D) 地面信息的获取和表示一直是与行星表面相关的…...

中文代码138

邢唷?? > ? ? ? ? ? ? ?R o o t E n t r y ? F 喹8N"a? ? S u m m a r y I n f …...

JQuery用法

JQuery 优点 : &#xff08;1&#xff09;提供了强大的功能函数 &#xff08;2&#xff09;解决浏览器兼容性问题 &#xff08;3&#xff09;实现丰富的 UI 和插件 &#xff08;4&#xff09;纠正错误的脚本知识… 1、Jquery对象 $ 符号在 jQuery 中代表对 jQuery 对象的引用,…...

Python采集热门城市景点数据+简单制作数据可视化图

人生苦短&#xff0c;我用python 真的好想出去玩啊&#xff01;&#xff01;&#xff01; 春游啊这是&#xff01;&#xff01;&#xff01; 万物复苏的好季节&#xff01;&#xff01;&#xff01; python 安装包资料:点击此处跳转文末名片获取 一、模块使用&#xff1a; …...

用心做的网站/班级优化大师官方免费下载

Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMapCollection接口Collection是最基本的集合接口&#xff0c;一个Collection代表一组Object&#xff0c;即Collection的元素(Elements)。Java SDK不提供直接继承自Col…...

dwcs2018怎么做动态网站/seo网络优化师招聘

题目链接&#xff1a;http://codeforces.com/problemset/problem/475/B 题目的意思是&#xff0c;给你n条水平固定流向&#xff0c;和m条竖直固定流向的街道&#xff0c;他们互相交叉在一起。。问任意交叉点能不能互相到达。。如下图&#xff1a; 在这里&#xff0c;我们知道&…...

boblog还是wordpress/2022年新闻热点摘抄

python charge defects toolkit(pycdt)是一个python包&#xff0c;旨在充电缺陷建模更简单&#xff0c;高吞吐量就绪&#xff0c;而且还可访问给那些没有必要背景的研究人员。PYCDT可以处理周期条件下的热力学计算及误差修正带电缺陷的边界条件密度泛函计算半导体和绝缘体。它还…...

网站建设公司怎么做业务/自己开网店怎么运营

表示物体时静态的&#xff0c;多用于静止不动的物体&#xff0c;此外static有多种&#xff0c;有的用于烘焙&#xff0c;有的用于遮挡剔除 物理效果是rigidbody组件&#xff0c;和这个没关系,用transform.Translate 无法移动&#xff0c;因为已经把他当做静止物体了...

企业网站托管方案/手机流畅优化软件

第三节函数的极限 在上一节我们学习数列的极限&#xff0c;数列x n 可以看作自变量为n的函数&#xff1a;xf(n),n∈N &#xff0c;所以&#xff0c;数列x n 的极限为a&#xff0c;就是f(n)无限接近于某一个确定的数a&#xff0c;把数列极限概念中的函数为f(n)而自变量的变化过…...

佛山网站建设网站制作公司哪家好/关键词有哪些

提回来4个月&#xff0c;关于导航的问题曾经纠结过很久&#xff1a;弄个一体机吧&#xff0c;贵&#xff0c;安装还麻烦&#xff0c;新地图也麻烦(其实主要是贵。。。)&#xff0c;家里装宽带电信送华为C8812跟华为C8650&#xff0c;一直都是拿这两个手机当导航用&am…...