深入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 常见的负载均衡策略
常见的负载均衡策略有以下几种:
- 轮询:按顺序分配,每个服务器轮流接收一个连接。
- 随机选择:随机挑选服务器,分散负载。
- 最少连接:选择当前连接数最少的服务器。
- IP哈希:根据用户IP分配,相同IP的请求总是发给同一服务器。
- 加权轮询:类似轮询,但服务器根据权重获取更多或更少请求。
- 加权随机选择:权重高的服务器有更高几率被选中。
- 最短响应时间:响应时间短的服务器优先接收新请求。
3. 为什么要学习 Spring Cloud Balancer ?
因为 Ribbon 作为早期的客户端负载均衡工具,在 Spring Cloud 2020.0.0 版本之后已经被移除了,取而代之的是 Spring Cloud LoadBalancer,而且 Ribbon 也已经不再维护,所以它也是 Spring 官方推荐的负载均衡解决方案。
其他一些原因:
更好的兼容性:LoadBalancer就像一个全新的配件,它与Spring Cloud的其他组件搭配得更好。
支持响应式编程:现在编程界有一种新的编程方式叫做“响应式编程”,LoadBalancer能很好地支持这种现代编程风格。
易于使用和维护:LoadBalancer的设计易于拼装和修改,这对于开发者来说,维护和定制起来更加方便。
多功能: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
增长到多大,这个表达式的结果都是在0
到instances.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 ? 2. 负载均衡策略的分类 2.1 常见的负载均衡策略 3. 为什么要学习 Spring Cloud Balancer ? 4. Spring Cloud LoadBalancer 内置的两种负载均衡策略 4.1 轮询负载均衡策略(默认的) 4.2 随机负…...

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

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

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

通过docker快速部署RabbitMq
查询镜像: docker search rabbitmq拉去RabbitMq镜像: docker pull rabbitmq:management创建数据卷: docker volume create rabbitmq-home运行容器: docker run -id --namerabbitmq -v rabbitmq-home:/var/lib/rabbitmq -p 156…...
Spring Boot 配置文件中的中文读取出来是乱码,或者是问号
在调试阿里短信时候,遇到读取配置文件乱码导致标签名无法正常使用,而可能有两个原因导致这个问题,一个是配置文件编码方式不是UTF-8的,另一个是Spring http使用的编码不是UTF-8。 1、第一步,将配置文件的编码方式改为U…...
【系统架构设计】架构核心知识: 3.8 ADL和产品线
目录 一 ADL 二 产品线 1 产品线 2 过程模型 3 软件产品线的建立方式...

imagettftext(): Could not find/open font 解决办法
问题:Captcha验证码不能正常显示,是因为使用GD库imagettftext()函数时,报“Warning: imagettftext(): Could not find/open font in ”警告 。 网上的解决方法: 将font路径的相对路径 转成 绝对路径即可 $fontfile "./fonts/*.ttf&q…...
P1853 投资的最大效益(DP背包)
投资的最大效益 题目背景 约翰先生获得了一大笔遗产,他暂时还用不上这一笔钱,他决定进行投资以获得更大的效益。银行工作人员向他提供了多种债券,每一种债券都能在固定的投资后,提供稳定的年利息。当然,每一种债券的…...
LightDB23.4 支持普通表修改为list分区表
功能介绍 为了兼容Oracle数据库的功能,在LightDB23.4版本上支持修改普通表为List分区表。这个功能只在LightDB的Oracle兼容模式下生效。 使用示例 进入Oracle兼容模式的数据库 lightdboracle_test# show lightdb_dblevel_syntax_compatible_type ;lightdb_dblev…...
Java序列化和Json格式的转化
Java序列化和JSON格式的转换都是在不同格式之间实现对象的传输,并在数据节点之间方便地进行信息交换,其中主要区别在于它们的工作原理和应用场景。 Java序列化是将 Java 对象转换为字节流(二进制格式的数据),以便在网…...

ElementUI之el-progress动态修改进度条里面文本颜色与进度条色块统一
1.效果: 2.实现方式 通过行内style样式动态给整个progress赋颜色 再在样式里给进度条文字单独设置颜色为默认继承父级颜色就ok啦 <el-progress class"custom-progress" stroke-linecap"square" :style"{color:item.color}" :colo…...
elementUI的el-menu组件做内部组件和外链区分
场景:左侧菜单栏的菜单项有内部组件切换,也会有点击后进入外链的情况,如何同时处理这种情况? 解决思路: 在路由配置中path代表组件切换路径或者外链配置el-menu-item显示菜单项时,使用动态路由形式&#…...

使用Ruby编写通用爬虫程序
目录 一、引言 二、环境准备 三、爬虫程序设计 1. 抓取网页内容 2. 解析HTML内容 3. 提取特定信息 4. 数据存储 四、优化和扩展 五、结语 一、引言 网络爬虫是一种自动抓取互联网信息的程序。它们按照一定的规则和算法,遍历网页并提取所需的信息。使用Rub…...
231108 C语言中是否可以函数内部动态申请内存,再传给外部变量?
如题。 是否可以返回一个指针,这个指针是函数内部动态申请内存的起始地址? 自然,内部动态申请内存在函数执行结束时是需要销毁的。那么是否可以在销毁前将指针赋值给函数返回值?当然,函数返回值是一个同类型指针。...
基于飞迪RTK/INS组合导航模组的里程计发布方法
文章目录 概要解算过程获取初始化点经纬度坐标系转UTM计算航向角发布odom坐标 完整代码 概要 这篇博客主要介绍,如何将GPS_fix、磁偏角转成odom信息。 PS:官方的驱动包中是自带odom信息,但是对于原点的定义尚未找到出处,故自己另外写了一套发…...
无mac电脑获取app的公钥的方法
在腾讯云或阿里云进行ios的app备案的时候,它要求输入app的公钥 但是他们并没有提供mac电脑的获取工具,需要我们使用mac电脑去获取app的公钥 假如我们没有mac电脑怎么办呢? 网上很多教程是通过java代码去获取的,太麻烦了&#x…...
【Mybatis源码】反射 – TypeParameterResolver
反射在Java编程开发中具有很重要的地位,能够使用反射机制创建实例、获取或设置字段的值、调用方法等,但如果字段、方法中出现泛型类型时,我们在使用反射进行解析时,往往不能解析到实际的类型,只能解析到泛型参数。 在Mybatis中使用TypeParameterResovler类提供了对Type的封…...
Drogon源码剖析
一、Drogon介绍 Drogon是一个基于C的跨平台HTTP应用程序框架,它支持Linux,也支持macOS、FreeBSD,OpenBSD,HaikuOS,和Windows。项目地址: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…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...