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

深入Spring Cloud LoadBalancer:策略全解析与缓存机制

目录

1. 什么是 LoadBalancer ?

2. 负载均衡策略的分类

2.1 常见的负载均衡策略

3. 为什么要学习 Spring Cloud Balancer ?

4. Spring Cloud LoadBalancer 内置的两种负载均衡策略

4.1 轮询负载均衡策略(默认的)

4.2 随机负载均衡策略

4.2.1 创建随机负载均衡策略

 4.2.2 设置随机负载均衡策略

5. Nacos 权重负载均衡器

5.1 创建 Nacos 负载均衡器

5.2 设置 Nacos 负载均衡器

6. 自定义负载均衡器

6.1 创建自定义负载均衡器

6.2 封装自定义负载均衡器

6.3 为服务设置自定义负载均衡策器

7.  Spring Cloud LoadBalancer 中的缓存机制

7.1 Spring Cloud LoadBalancer 中缓存机制的一些特性

7.2 关闭缓存


1. 什么是 LoadBalancer ?

LoadBalancer(负载均衡器)是一种用来分发网络或应用程序流量到多个服务器的技术。它可以防止任何单一服务的过载,通过分散负载来保持整个系统的平稳运行,保证系统的高可用性和可靠性。

2. 负载均衡策略的分类

负载均衡策略大体上分为两类:服务端的负载均衡和客户端的负载均衡

① 服务端负载均衡 (如 Nginx、F5)

请求先到达一个中介(如负载均衡器设备或者服务,例如Nginx),由这个中介根据配置的策略将请求分发到后端的多个服务器中。它对客户端是透明的,即客户端不需要知道有多少服务器以及它们的存在

② 客户端负载均衡 (如 Ribbon、Spring Cloud LoadBalancer)

请求的分配逻辑由客户端持有,客户端直接决定将请求发送到哪一个服务器。也就是说在客户端负载均衡中,客户端通常具备一份服务列表,它知道每个服务的健康状况,基于这些信息和负载均衡策略,客户端会选择一个最适合的服务去发送请求。

服务端负载均衡和客户端负载均衡策略有什么区别 ?

它俩的区别主要在灵活性和性能两方面(结合上面两幅图来理解):

1. 灵活性

  • 客户端负载均衡更加灵活,它可以针对每一个请求,每一个 service 做单独的负载均衡配置。

2. 性能

  • 客户端负载均衡性能相对来说更好一点,因为服务端负载均衡中,当请求来了之后,它得先去到服务端的负载均衡,然后服务端的负载均衡再将请求发送给对应的服务器,整个过程发送了两次请求,而客户端负载均衡只需要发送一次请求。
  • 其次,服务端负载均衡中,客户端的请求都先打到了中心节点上,这个流量是很大的,所以服务端的负载均衡器,它的压力相对来说就比较大,那么性能就不可能比客户端负载均衡高。
  • 反观客户端负载均衡,它就没有所谓的中心节点,它将集中的压力给释放了,因为客户端有成千上万个,它可以让每个客户端去调用自己的负载均衡器,而不是让成千上万个客户端去调用一个负载均衡器。

【扩充知识】 

如果将负载均衡器视为代理,那么服务端负载均衡可以视作是反向代理的一种形式,因为它接收客户端请求后再决定将其分配给哪一个服务器;而客户端负载均衡则可以看作具有正向代理的性质,因为客户端知道要联系的服务列表,并直接向选定的服务器发送请求。

  • 正向代理:正向代理类似于一个中间人,代表客户端去请求服务。客户端必须要配置代理,因此客户端是知道代理的存在的。正向代理隐藏了客户端的信息,服务器不知道真正的请求者是谁。

  • 反向代理:反向代理则是代表服务器接收客户端的请求。客户端通常不知道后面有多少服务器,也不需要知道。反向代理隐藏了服务端的信息,客户端只与反向代理交互,像Nginx这样的服务器就是一个反向代理的例子。

2.1 常见的负载均衡策略

常见的负载均衡策略有以下几种:

  1. 轮询:按顺序分配,每个服务器轮流接收一个连接。
  2. 随机选择:随机挑选服务器,分散负载。
  3. 最少连接:选择当前连接数最少的服务器。
  4. IP哈希:根据用户IP分配,相同IP的请求总是发给同一服务器。
  5. 加权轮询:类似轮询,但服务器根据权重获取更多或更少请求。
  6. 加权随机选择:权重高的服务器有更高几率被选中。
  7. 最短响应时间:响应时间短的服务器优先接收新请求。

3. 为什么要学习 Spring Cloud Balancer ?

因为 Ribbon 作为早期的客户端负载均衡工具,在 Spring Cloud 2020.0.0 版本之后已经被移除了,取而代之的是 Spring Cloud LoadBalancer,而且 Ribbon 也已经不再维护,所以它也是 Spring 官方推荐的负载均衡解决方案。

其他一些原因:

  1. 更好的兼容性:LoadBalancer就像一个全新的配件,它与Spring Cloud的其他组件搭配得更好。

  2. 支持响应式编程:现在编程界有一种新的编程方式叫做“响应式编程”,LoadBalancer能很好地支持这种现代编程风格。

  3. 易于使用和维护:LoadBalancer的设计易于拼装和修改,这对于开发者来说,维护和定制起来更加方便。

  4. 多功能:LoadBalancer有很多内置功能,比如自动帮你挑选服务器,就像购物网站帮你推荐商品一样聪明。

4. Spring Cloud LoadBalancer 内置的两种负载均衡策略

4.1 轮询负载均衡策略(默认的)

从它的源码实现可以看出来默认的负载均衡策略是轮询的策略。

IDEA 搜索它的配置类 LoadBalancerClientConfiguration:

进入到 RoundRobinLoadBalancer 这个类里边,定位到 getInstanceResponse 方法,就能看到轮询策略的关键代码:

private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + this.serviceId);}return new EmptyResponse();} else if (instances.size() == 1) {return new DefaultResponse((ServiceInstance)instances.get(0));} else {// 轮询策略的关键代码int pos = this.position.incrementAndGet() & Integer.MAX_VALUE;ServiceInstance instance = (ServiceInstance)instances.get(pos % instances.size());return new DefaultResponse(instance);}
}

理解关键代码:

int pos = this.position.incrementAndGet() & Integer.MAX_VALUE;
  • this.position.incrementAndGet() 方法等价于 "++随机数 "。这是一个原子操作,保证了每次调用都会得到一个唯一的递增数值。
  • & Integer.MAX_VALUE 这部分是一个位运算,它确保了如果 position 的值增加到超过 Integer.MAX_VALUE 时,不会产生负数。其一,在轮询算法中,如果计数器变成负数,那么取余操作可能会产生负的索引值,这是无效的; 其二,也可也保证在相同规则底下的公平性。
ServiceInstance instance = (ServiceInstance)instances.get(pos % instances.size()); // 进行轮询选择
  • instances 是一个包含所有服务实例的列表。
  • pos % instances.size() 计算的是 pos 除以 instances 列表大小的余数,这保证了不论 pos 增长到多大,这个表达式的结果都是在 0instances.size() - 1 的范围内,这样就可以循环地从服务实例列表中选择服务实例。

4.2 随机负载均衡策略

实现随机负载均衡策略的步骤:

① 创建随机负载均衡策略

② 设置随机负载均衡策略

接下来的操作都是基于这篇博客基础上去操作的,有需要的可以先去看看这篇博客,先把前置的代码准备好:https://blog.csdn.net/xaiobit_hl/article/details/134142521

4.2.1 创建随机负载均衡策略

这些写法都是相通的,可以仿照源码中的轮询策略的关键代码:

可以去源码中的LoadBalancerClientConfiguration中去定位到 reactorServiceInstanceLoadBalancer 方法,然后复制下来,修改几个关键地方即可。

public class RandomLoadBalancerConfig {// 随机的负载均衡策略@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class), name);}
}

 4.2.2 设置随机负载均衡策略

在 consumer 模块中的 service 接口上设置负载均衡策略:

@Service
@FeignClient("loadbalancer-service")
// 设置局部的负载均衡策略
@LoadBalancerClient(name = "loadbalancer-service",configuration = RandomLoadBalancerConfig.class)
public interface UserService {@RequestMapping("/user/getname")public String getName(@RequestParam("id") Integer id);
}

PS:有时候局部的负载均衡策略不会生效(版本问题),可以将其设为全局的负载均衡策略。

如何设置全局的负载均衡策略:(在启动类上加 @LoadBalancerClients 注解)

@SpringBootApplication
@EnableFeignClients  // 开启 OpenFeign
// 设置全局的负载均衡策略
@LoadBalancerClients(defaultConfiguration =RandomLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

这个时候,就是随机的负载均衡策略了,可以启动两个生产者和消费者,然后拿着消费者这边的端口去获取服务感受。

5. Nacos 权重负载均衡器

Nacos 中有两种负载均衡策略:权重负载均衡策略和 CMDB(地域就近访问)标签负载均衡策略

它默认的策略是权重。

在 Spring Cloud Balancer 配置为 Nacos 负载均衡器的步骤:

① 创建 Nacos 负载均衡器

② 设置 Nacos 负载均衡器

5.1 创建 Nacos 负载均衡器

配置 Nacos 负载均衡需要注入 NacosDiscoveryProperties 这个类,因为它需要使用到配置文件中的一些关键信息。

@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
public class NacosLoadBalancerConfig {@ResourceNacosDiscoveryProperties nacosDiscoveryProperties;@Beanpublic ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties);}
}

5.2 设置 Nacos 负载均衡器

@Service
@FeignClient("loadbalancer-service")
// 设置局部的负载均衡策略
@LoadBalancerClient(name = "loadbalancer-service",configuration = NacosLoadBalancerConfig.class)
public interface UserService {@RequestMapping("/user/getname")public String getName(@RequestParam("id") Integer id);
}

再测试之前,可以先将 Nacos 中一个生产者的权重给设置为 10,一个设置为 1,这样就能明显感受到 Nacos 权重的负载均衡策略了。

6. 自定义负载均衡器

自定义负载均衡策略需要 3 个步骤:

① 创建自定义负载均衡器

② 封装自定义负载均衡器

③ 为服务设置自定义负载均衡策器

6.1 创建自定义负载均衡器

这里也是可以参考源码的实现的,搜索 RandomLoadBalancer 这个类,模仿它的实现去创建自定义负载均衡器。

Ⅰ. 创建一个负载均衡类, 并让其实现 ReactorServiceInstanceLoadBalancer 接口;

Ⅱ. 复制 RandomLoadBalancer 的整个方法体,粘贴到自定义负载均衡类中,并修改构造方法名称

Ⅲ. 在关键方法 getInstanceResponse 中实现自定义负载均衡策略(以IP哈希负载均衡为例)

public class CustomLoadBalancer implements ReactorServiceInstanceLoadBalancer {private static final Log log = LogFactory.getLog(CustomLoadBalancer.class);private final String serviceId;private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;public CustomLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;}public Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = (ServiceInstanceListSupplier)this.serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);return supplier.get(request).next().map((serviceInstances) -> {return this.processInstanceResponse(supplier, serviceInstances);});}private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier, List<ServiceInstance> serviceInstances) {Response<ServiceInstance> serviceInstanceResponse = this.getInstanceResponse(serviceInstances);if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {((SelectedInstanceCallback)supplier).selectedServiceInstance((ServiceInstance)serviceInstanceResponse.getServer());}return serviceInstanceResponse;}private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + this.serviceId);}return new EmptyResponse();} else {// 自定义负载均衡策略// 获取 Request 对象ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String ipAddress = request.getRemoteAddr();System.out.println("用户 IP:" + ipAddress);int hash = ipAddress.hashCode();// IP 哈希负载均衡【关键代码】int index = hash % instances.size();// 得到服务实例的方法ServiceInstance instance = (ServiceInstance) instances.get(index);return new DefaultResponse(instance);}}
}

6.2 封装自定义负载均衡器

public class CustomLoadBalancerConfig {// IP 哈希负载均衡@Beanpublic ReactorLoadBalancer<ServiceInstance> customLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new CustomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class), name);}
}

6.3 为服务设置自定义负载均衡策器

@Service
@FeignClient("loadbalancer-service")
// 设置局部的负载均衡策略
@LoadBalancerClient(name = "loadbalancer-service",configuration = CustomLoadBalancerConfig.class)
public interface UserService {@RequestMapping("/user/getname")public String getName(@RequestParam("id") Integer id);
}

 PS:测试的时候发现自定义的负载均衡策略不生效怎么办 ?

① 把前边的 Nacos 的负载均衡器一整个注释掉(包括 @LoadBalancerClients注解),只提供一个类。

② 如果设置局部的负载均衡不生效,就去启动类上设置全局的负载均衡策略。

@SpringBootApplication
@EnableFeignClients  // 开启 OpenFeign
// 设置全局的负载均衡策略
@LoadBalancerClients(defaultConfiguration =CustomLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

7.  Spring Cloud LoadBalancer 中的缓存机制

Spring Cloud LoadBalancer 中获取服务实例有两种方式:

1. 实时获取:每次都从注册中心得到最新的健康实例(效果好,开销大)

2. 缓存服务列表:每次得到服务列表之后,缓存一段时间(既保证性能,也能保证一定的及时性)

Spring Cloud LoadBalancer 默认开启了缓存服务列表的功能。

测试 Spring Cloud LoadBalancer 的缓存机制:

1. 将前面设置负载均衡策略全部注释掉,使用默认的轮询测试(便于观察)

2. 准备两个服务

3. 将其中一个服务下线,下线的同时立马去获取服务,然后等大约 35s ,再去获取服务

【测试结果】 当我下线第一个服务的时候,立马去获取服务,这个时候还是两个服务轮询的获取,等过了 35s 左右,就只能获取到 64067 这个服务了。

7.1 Spring Cloud LoadBalancer 中缓存机制的一些特性

默认特性如下:

① 缓存的过期时间为 35s;

② 缓存保存个数为 256 个。

我们可以通过在配置文件中去设置这些特性:

spring:cloud:loadbalancer:cache:ttl: 35s  # 过期时间capacity: 1024  # 设置缓存个数

7.2 关闭缓存

关闭 Spring Cloud LoadBalancer 中的缓存可以通过以下配置文件来设置:

spring:cloud:loadbalancer:cache:enabled: false  # 关闭缓存

PS:尽管关闭缓存对于开发和测试很有用,但是在生产环境上,它的效率是要远低于开启缓存,所以在生产环境上始终都要开启缓存。

相关文章:

深入Spring Cloud LoadBalancer:策略全解析与缓存机制

目录 1. 什么是 LoadBalancer &#xff1f; 2. 负载均衡策略的分类 2.1 常见的负载均衡策略 3. 为什么要学习 Spring Cloud Balancer &#xff1f; 4. Spring Cloud LoadBalancer 内置的两种负载均衡策略 4.1 轮询负载均衡策略&#xff08;默认的&#xff09; 4.2 随机负…...

MySQL的高阶语句

前言 数据库是用来存储数据&#xff0c;更新&#xff0c;查询数据的工具&#xff0c;而查询数据是一个数据库最为核心的功能&#xff0c;数据库是用来承载信息&#xff0c;而信息是用来分析和查看的。所以掌握更为精细化的查询方式是很有必要的。本文将围绕数据的高级查询语句展…...

适合汽车音频系统的ADAU1977WBCPZ、ADAU1978WBCPZ、ADAU1979WBCPZ四通道 ADC,24-bit,音频

一、ADAU1977WBCPZ 集成诊断功能的四通道ADC&#xff0c;音频 24 b 192k IC&#xff0c;SPI 40LFCSP ADAU1977集成4个高性能模数转换器(ADC)&#xff0c;其直接耦合输入具有10 V rms性能。该ADC采用多位Σ-Δ架构&#xff0c;其连续时间前端能够实现低EMI性能。它可以直接连接…...

设计模式-状态模式 golang实现

一 什么是有限状态机 有限状态机&#xff0c;英⽂翻译是 Finite State Machine&#xff0c;缩写为 FSM&#xff0c;简称为状态机。 状态机不是指一台实际机器&#xff0c;而是指一个数学模型。说白了&#xff0c;一般就是指一张状态转换图。 已订单交易为例&#xff1a; 1.…...

通过docker快速部署RabbitMq

查询镜像&#xff1a; docker search rabbitmq拉去RabbitMq镜像&#xff1a; docker pull rabbitmq:management创建数据卷&#xff1a; docker volume create rabbitmq-home运行容器&#xff1a; docker run -id --namerabbitmq -v rabbitmq-home:/var/lib/rabbitmq -p 156…...

Spring Boot 配置文件中的中文读取出来是乱码,或者是问号

在调试阿里短信时候&#xff0c;遇到读取配置文件乱码导致标签名无法正常使用&#xff0c;而可能有两个原因导致这个问题&#xff0c;一个是配置文件编码方式不是UTF-8的&#xff0c;另一个是Spring http使用的编码不是UTF-8。 1、第一步&#xff0c;将配置文件的编码方式改为U…...

【系统架构设计】架构核心知识: 3.8 ADL和产品线

目录 一 ADL 二 产品线 1 产品线 2 过程模型 3 软件产品线的建立方式...

imagettftext(): Could not find/open font 解决办法

问题&#xff1a;Captcha验证码不能正常显示&#xff0c;是因为使用GD库imagettftext()函数时&#xff0c;报“Warning: imagettftext(): Could not find/open font in ”警告 。 网上的解决方法: 将font路径的相对路径 转成 绝对路径即可 $fontfile "./fonts/*.ttf&q…...

P1853 投资的最大效益(DP背包)

投资的最大效益 题目背景 约翰先生获得了一大笔遗产&#xff0c;他暂时还用不上这一笔钱&#xff0c;他决定进行投资以获得更大的效益。银行工作人员向他提供了多种债券&#xff0c;每一种债券都能在固定的投资后&#xff0c;提供稳定的年利息。当然&#xff0c;每一种债券的…...

LightDB23.4 支持普通表修改为list分区表

功能介绍 为了兼容Oracle数据库的功能&#xff0c;在LightDB23.4版本上支持修改普通表为List分区表。这个功能只在LightDB的Oracle兼容模式下生效。 使用示例 进入Oracle兼容模式的数据库 lightdboracle_test# show lightdb_dblevel_syntax_compatible_type ;lightdb_dblev…...

Java序列化和Json格式的转化

Java序列化和JSON格式的转换都是在不同格式之间实现对象的传输&#xff0c;并在数据节点之间方便地进行信息交换&#xff0c;其中主要区别在于它们的工作原理和应用场景。 Java序列化是将 Java 对象转换为字节流&#xff08;二进制格式的数据&#xff09;&#xff0c;以便在网…...

ElementUI之el-progress动态修改进度条里面文本颜色与进度条色块统一

1.效果&#xff1a; 2.实现方式 通过行内style样式动态给整个progress赋颜色 再在样式里给进度条文字单独设置颜色为默认继承父级颜色就ok啦 <el-progress class"custom-progress" stroke-linecap"square" :style"{color:item.color}" :colo…...

elementUI的el-menu组件做内部组件和外链区分

场景&#xff1a;左侧菜单栏的菜单项有内部组件切换&#xff0c;也会有点击后进入外链的情况&#xff0c;如何同时处理这种情况&#xff1f; 解决思路&#xff1a; 在路由配置中path代表组件切换路径或者外链配置el-menu-item显示菜单项时&#xff0c;使用动态路由形式&#…...

使用Ruby编写通用爬虫程序

目录 一、引言 二、环境准备 三、爬虫程序设计 1. 抓取网页内容 2. 解析HTML内容 3. 提取特定信息 4. 数据存储 四、优化和扩展 五、结语 一、引言 网络爬虫是一种自动抓取互联网信息的程序。它们按照一定的规则和算法&#xff0c;遍历网页并提取所需的信息。使用Rub…...

231108 C语言中是否可以函数内部动态申请内存,再传给外部变量?

如题。 是否可以返回一个指针&#xff0c;这个指针是函数内部动态申请内存的起始地址&#xff1f; 自然&#xff0c;内部动态申请内存在函数执行结束时是需要销毁的。那么是否可以在销毁前将指针赋值给函数返回值&#xff1f;当然&#xff0c;函数返回值是一个同类型指针。...

基于飞迪RTK/INS组合导航模组的里程计发布方法

文章目录 概要解算过程获取初始化点经纬度坐标系转UTM计算航向角发布odom坐标 完整代码 概要 这篇博客主要介绍&#xff0c;如何将GPS_fix、磁偏角转成odom信息。 PS:官方的驱动包中是自带odom信息&#xff0c;但是对于原点的定义尚未找到出处&#xff0c;故自己另外写了一套发…...

无mac电脑获取app的公钥的方法

在腾讯云或阿里云进行ios的app备案的时候&#xff0c;它要求输入app的公钥 但是他们并没有提供mac电脑的获取工具&#xff0c;需要我们使用mac电脑去获取app的公钥 假如我们没有mac电脑怎么办呢&#xff1f; 网上很多教程是通过java代码去获取的&#xff0c;太麻烦了&#x…...

【Mybatis源码】反射 – TypeParameterResolver

反射在Java编程开发中具有很重要的地位,能够使用反射机制创建实例、获取或设置字段的值、调用方法等,但如果字段、方法中出现泛型类型时,我们在使用反射进行解析时,往往不能解析到实际的类型,只能解析到泛型参数。 在Mybatis中使用TypeParameterResovler类提供了对Type的封…...

Drogon源码剖析

一、Drogon介绍 Drogon是一个基于C的跨平台HTTP应用程序框架&#xff0c;它支持Linux&#xff0c;也支持macOS、FreeBSD&#xff0c;OpenBSD&#xff0c;HaikuOS&#xff0c;和Windows。项目地址&#xff1a;https://github.com/drogonframework/drogon。 它的主要特点如下&a…...

maven 上传本地jar包到nexus

maven上传命令 mvn deploy:deploy-file -DgroupIdcom.microsoft.sqlserver -DartifactIdsqljdbc4 -Dversion4.0 -Dpackagingjar -DfileC:\java\top-sdk-java-1.0.1-lib\lib\bcprov-jdk16-1.46.jar -Durlhttp://ip:port/repository/maven-releases/ -DrepositoryIdsnapshot…...

聊一聊,今年参加软考高级的一些总结

先上结论&#xff0c;系统架构设计师考题难度不高&#xff0c;总之多读书&#xff0c;多刷题&#xff0c;多写博客&#xff0c;多总结&#xff0c;有一定工作经验的基本上都非常容易过。但是我估计自己考不过&#xff0c;主要是论文这块没写好&#xff0c;思路不清晰&#xff0…...

【寒武纪(4)】图像处理硬件加速,基于CNCVE

基本概念 1、handle 句柄标识不同任务 2、对于调用上&#xff0c;支持阻塞和非阻塞。使用bInstant标识。 3、查询query可以确认调用是否完成 4、及时刷新cache。CNCVE 硬件的唯一数据来源是DDR&#xff0c;防止CPU访问导致cache内存干扰&#xff0c;需要调用cnsysMacheOperate…...

有关python库

官方库 #1、导入某模块 import os #2、导入OS模块中的system方法 from os import system #3、导入某模块中的孙子模块中的xx方法&#xff0c;并重命名 from module.xx.xx import xx as rename #4、导入OS中的所有模块 #不用进行OS.method(),直接method&#xff08;&#xff0…...

java项目之电影网站(ssm框架)

项目简介 电影网站实现了以下功能&#xff1a; 登录模块用例中用户包括用户和管理员和二种角色&#xff0c;分别可以进行其对应的身份登录或取消登录&#xff0c;关闭系统。用户模块主要包括首页&#xff0c;电影信息&#xff0c;电影商城&#xff0c;社区交流&#xff0c;电…...

技术分享 | app自动化测试(Android)--触屏操作自动化

导入TouchAction Python 版本 from appium.webdriver.common.touch_action import TouchAction Java 版本 import io.appium.java_client.TouchAction; 常用的手势操作 press 按下 TouchAction 提供的常用的手势操作有如下操作&#xff1a; press 按下 release 释放 …...

Java连接数据库并查询表中的全部数据

1、导入相关jar包 这里创建简单的maven项目&#xff0c;我们导入相关的jar包 相关依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependenc…...

STM32存储左右互搏 SPI总线读写FLASH W25QXX

STM32存储左右互搏 SPI总线读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库操作W25Q各型号FLASH的例程。 W25QXX介绍 W25QX…...

【EI会议征稿】第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)

第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09; 2024 4th International Conference on Computer Network Security and Software Engineering 第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09;将于2024年2月…...

解决pip 安装 pyhash错误

1 pip 安装 pyhash错误 Collecting pyhash (from Calvin0.0.1) Using cached https://pypi.tuna.tsinghua.edu.cn/packages/f0/bf/4db9bed05d10824a17697f65063de19892ca2171a31a9c6854f9bbf55c02/pyhash-0.9.3.tar.gz (602 kB) Preparing metadata (setup.py) … error error:…...

解决 win11 vmware 中centos 网络不能访问外网

解决 win11 vmware 中centos 网络不能访问外网 1、进入win11 高级设置&#xff0c;找到centos 虚拟机使用的网卡 2、看网卡的其他属性 3、按照红圈部分&#xff0c;配置成一样的就行 4、进入到虚拟机配置中&#xff0c;配置成如图一样的NAT模式 5、再进入编辑 -》虚拟网络编辑…...