SpringCloud 负载均衡 spring-cloud-starter-loadbalancer
简述
spring-cloud-starter-loadbalancer 是 Spring Cloud 中的一个组件,它提供了客户端负载均衡的功能。在 Spring Cloud 的早期版本中,Netflix Ribbon 被广泛用作客户端负载均衡器,但随着时间推移和 Netflix Ribbon 进入维护模式,Spring Cloud 社区开始转向更灵活、更易于维护的替代方案。
spring-cloud-starter-loadbalancer 是基于 Spring 5 的 WebClient 构建的,并使用了 Reactor(Spring 5 的反应式编程模型的核心库)来实现异步非阻塞的负载均衡请求。它与 Spring Cloud 的服务发现和配置结合得非常好,可以很容易地与 Eureka、Consul、Nacos 等服务发现组件一起使用。
当将 spring-cloud-starter-loadbalancer 添加到Spring Boot 应用程序中时,可以使用 WebClient.Builder 的 loadBalancer 方法来创建一个具有负载均衡功能的 WebClient 实例。这个 WebClient 实例会自动从服务发现中获取服务实例列表,并使用内置的负载均衡算法(如轮询、随机等)来选择一个服务实例来发送请求。
例如,如果正在使用 Eureka 作为服务发现,并且想要发送一个 GET 请求到名为 “my-service” 的服务,可以这样做:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient; @Service
public class MyServiceClient { @Autowired private WebClient.Builder webClientBuilder; @Bean @LoadBalanced public WebClient.Builder loadBalancedWebClientBuilder() { return WebClient.builder(); } public String getSomethingFromMyService() { // 注意这里我们直接使用了 "my-service" 作为 URI,而不是具体的服务实例地址 return webClientBuilder.build() .get() .uri("http://my-service/some-endpoint") .retrieve() .bodyToMono(String.class) .block(); // 注意:block() 方法会阻塞当前线程,通常只在非反应式上下文中使用 }
}
主要特点
- 基于 WebClient:与 Spring 5 的 WebClient 紧密集成,提供了反应式(Reactive)的 HTTP 客户端功能。
- 服务发现集成:与 Spring Cloud 的服务发现组件(如 Eureka、Consul、Nacos 等)集成,可以自动获取服务实例列表。
- 内置负载均衡算法:提供了内置的负载均衡算法,如轮询(Round Robin)、随机(Random)等。
- 反应式编程:支持反应式编程模型,允许非阻塞的 I/O 操作和异步处理。
- 灵活性:与 Ribbon 相比,提供了更多的灵活性和扩展性,可以更容易地定制负载均衡行为。
- 与 Spring Cloud Gateway 集成:与 Spring Cloud Gateway 紧密集成,为其提供了负载均衡功能。
使用
- 添加依赖:在 Maven 或 Gradle 项目中添加 spring-cloud-starter-loadbalancer 依赖。
<!-- SpringCloud Loadbalancer --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
- 配置 WebClient:使用 @LoadBalanced 注解来标记一个 WebClient.Builder Bean,以便将其配置为支持负载均衡。
- 发送请求:通过 WebClient 发送请求时,使用服务名称(而不是具体的服务实例地址)作为 URI 的主机部分。
- 自定义负载均衡算法:如果需要,可以自定义负载均衡算法,并通过配置或编程方式将其应用到 WebClient 上。
注意事项
- 阻塞调用:虽然 WebClient 是反应式的,但在某些情况下(如与同步代码交互时),可能需要使用 block() 方法来阻塞当前线程并等待响应。但应尽量避免在反应式上下文中使用 block()。
- 配置:负载均衡器的行为可以通过配置进行定制,包括选择负载均衡算法、设置超时时间等。
- 服务发现:确保应用程序已经正确配置了服务发现组件(如 Eureka、Consul 等),以便 spring-cloud-starter-loadbalancer 能够获取服务实例列表。
- 版本兼容性:注意 spring-cloud-starter-loadbalancer 与其他 Spring Cloud 组件的版本兼容性,确保它们能够协同工作。
负载均衡算法
1. 轮询负载均衡策略(Round Robin)
- 描述:这是默认的负载均衡策略,它会按照顺序依次将请求发送到服务实例列表中的每个服务实例。
- 特点:
- 简单易实现。
- 每个服务实例接收到的请求数量大致相等(在理想情况下)。
- 不考虑服务实例的当前负载状态或性能。
2. 随机负载均衡策略(Random)
- 描述:该策略会随机选择一个服务实例来发送请求。
- 特点:
- 在多次请求中,每个服务实例都有可能被选中。
- 与轮询策略相比,它增加了随机性,但每个服务实例接收到的请求数量可能不均等。
- 同样不考虑服务实例的当前负载状态或性能。
3. 自定义负载均衡策略
- 描述:除了内置的负载均衡策略外,spring-cloud-starter-loadbalancer 还支持自定义负载均衡策略。
- 特点:
- 开发者可以根据实际需求实现自己的负载均衡算法。
- 可以考虑服务实例的当前负载状态、性能、地理位置等多种因素来做出决策。
- 提供了更高的灵活性和定制性。
4. Nacos 权重负载均衡器
- 描述:当与 Nacos 服务发现组件一起使用时,可以使用 Nacos 提供的权重负载均衡器。
- 特点:
- 服务实例可以配置权重值,权重值越高的实例接收到的请求越多。
- 权重值可以根据服务实例的性能、资源使用情况等因素进行动态调整。
- 提供了更细粒度的控制,可以根据实际需求进行灵活配置。
5. 自定义算法
通过实现自定义的 ReactorLoadBalancer 来定义自己的负载均衡算法。
- 定义自定义的负载均衡器:需要实现 ReactorLoadBalancer 接口或扩展现有的实现(如 RoundRobinLoadBalancer)。
- 实现 choose 方法:这是负载均衡算法的核心,它接收一个请求(通常是一个 Request 对象)和一个服务实例列表(ServiceInstanceListSupplier),并返回一个 Mono,表示选定的服务实例。
- 配置自定义的负载均衡器:需要将自定义的负载均衡器配置为 Spring Cloud 的默认负载均衡器。这通常是通过注册一个 ReactorLoadBalancer 的 Bean 来完成的。
示例:
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.DefaultRequest;
import org.springframework.cloud.client.loadbalancer.ReactiveLoadBalancer;
import org.springframework.cloud.client.loadbalancer.ReactiveLoadBalancerFactory;
import org.springframework.cloud.client.ServiceInstanceChooser;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono; import java.util.List; @Configuration
public class CustomLoadBalancerConfig { @Bean public ReactiveLoadBalancer<ServiceInstance> customLoadBalancer( ReactiveLoadBalancerFactory<ServiceInstance> factory, ObjectProvider<List<ServiceInstance>> serviceInstances) { return new ReactiveLoadBalancer<ServiceInstance>() { @Override public Mono<Response<ServiceInstance>> choose(Request request) { // 这里是自定义的负载均衡算法实现 // 例如,我们可以简单地返回服务实例列表中的第一个实例 return Mono.justOrEmpty(serviceInstances.getIfAvailable()) .flatMapMany(List::stream) .firstElement() // 或者可以实现自己的选择逻辑 .map(Response::just); } // 其他必要的方法(如 recordStats, filter, etc.)可以根据需要进行实现 }; } // 如果想要为特定的服务配置自定义的负载均衡器, // 可以通过 ServiceId 来区分并返回不同的 ReactiveLoadBalancer 实例 // 例如,public ReactiveLoadBalancer<ServiceInstance> customLoadBalancerForServiceX(...) {...}
}
spring-cloud-starter-loadbalancer 提供了多种负载均衡算法,包括轮询、随机和自定义策略等。这些算法可以根据实际需求进行选择和配置,以满足不同的负载均衡需求。同时,与 Nacos 服务发现组件的集成还提供了权重负载均衡器的功能,进一步增加了负载均衡的灵活性和可定制性。开发者可以根据自己的业务场景和需求选择适合的负载均衡算法,并对其进行适当的配置和优化,以实现更高效、更可靠的微服务调用。
反应式编程
从 Spring Cloud Greenwich 版本开始,Spring Cloud 引入了对 Project Reactor 的支持,并将负载均衡器从传统的阻塞式(基于 Ribbon)转变为反应式(基于 spring-cloud-starter-loadbalancer)。
反应式编程是一种异步、非阻塞的编程范式,它使用数据流(streams)和变化传播(propagation of change)来处理数据。在反应式编程中,数据不是通过传统的调用和返回机制来传递的,而是通过异步数据流在组件之间传递。
在 spring-cloud-starter-loadbalancer 中,反应式编程主要体现在以下几个方面:
- 非阻塞调用:与传统的基于 Ribbon 的阻塞式负载均衡器不同,spring-cloud-starter-loadbalancer 使用反应式编程模型来执行非阻塞的负载均衡请求。这意味着它不会阻塞线程等待响应,而是异步地处理请求和响应。
- 响应式类型:负载均衡器的 API 使用了反应式类型,如 Mono 和 Flux,它们是 Project Reactor 提供的反应式类型。Mono 用于表示 0 或 1 个元素的异步序列,而 Flux 用于表示 0 到 N 个元素的异步序列。
- 背压(Backpressure):反应式编程支持背压机制,即消费者可以控制生产者生成数据的速度。这在处理大量并发请求时非常有用,可以避免因生产者过快生成数据而导致消费者处理不过来。
- 错误处理:反应式编程提供了丰富的错误处理机制,如 onErrorResume、retry 等操作符,可以在发生错误时优雅地处理异常情况。
- 组合和转换:Mono 和 Flux 提供了丰富的操作符,用于组合和转换异步数据流。这使得可以灵活地处理负载均衡请求和响应,满足各种复杂的业务需求。
简单的示例:
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @RestController
public class MyController { private final LoadBalancerClient loadBalancerClient; public MyController(LoadBalancerClient loadBalancerClient) { this.loadBalancerClient = loadBalancerClient; } @GetMapping("/call-service") public Mono<String> callService() { // 获取服务实例 ServiceInstance serviceInstance = loadBalancerClient.choose("my-service").block(); // 使用 WebClient 发起反应式请求 WebClient webClient = WebClient.builder() .baseUrl(serviceInstance.getUri().toString()) .build(); return webClient.get() .uri("/some-endpoint") .retrieve() .bodyToMono(String.class); }
}
注意:上面的示例中使用了 block() 方法来同步获取服务实例,这在实际应用中可能不是最佳实践。通常,应该在整个调用链中保持反应式编程的异步特性。但是,为了简化示例,这里使用了 block() 方法。在实际应用中,应该将服务实例的获取和请求的发起都转换为反应式操作。
与 OpenFeign 集成
Spring Cloud 应用程序中,spring-cloud-starter-loadbalancer 通常与 spring-cloud-starter-openfeign 或其他 HTTP 客户端(如 WebClient)一起使用,以支持对服务发现的客户端进行负载均衡的调用。
当使用 OpenFeign 声明式 HTTP 客户端时,spring-cloud-starter-loadbalancer 会自动集成以提供负载均衡功能。只需在 pom.xml 或 build.gradle 文件中包含相应的依赖,并在 Feign 客户端接口上使用 @FeignClient 注解指定服务名。
Maven 依赖
<dependencies> <!-- ... 其他依赖 ... --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> <!-- ... 其他依赖 ... -->
</dependencies>
Feign 客户端
@FeignClient(name = "my-service")
public interface MyServiceClient { // 定义 HTTP 方法 @GetMapping("/some-endpoint") Mono<String> getSomething();
}
WebClient 集成
使用 WebClient 作为 HTTP 客户端,可以通过 spring-cloud-starter-loadbalancer 来实现服务间的负载均衡调用。需要创建一个 WebClient.Builder bean,并使用 LoadBalancerExchangeFilterFunction 来自动处理服务发现和负载均衡。
配置 WebClient Bean
@Bean
public WebClient.Builder webClientBuilder(LoadBalancerClient loadBalancerClient) { return WebClient.builder() .baseUrl("lb://my-service") // 使用 'lb://' 前缀启用负载均衡 .filter(new LoadBalancerExchangeFilterFunction(loadBalancerClient));
}
使用 WebClient 发起请求
@Autowired
private WebClient.Builder webClientBuilder; public Mono<String> callService() { WebClient webClient = webClientBuilder.build(); return webClient.get() .uri("/some-endpoint") .retrieve() .bodyToMono(String.class);
}
注意事项
- 确保 Spring Cloud 版本支持 spring-cloud-starter-loadbalancer。
- 从使用 Ribbon 迁移到 spring-cloud-starter-loadbalancer,请注意两者之间的配置差异和 API 更改。
- 在使用 WebClient 时,确保使用了正确的 URL 前缀(lb://)来启用负载均衡。
- 在自定义负载均衡器时,确保实现是线程安全的,并且能够处理并发请求。
相关文章:
SpringCloud 负载均衡 spring-cloud-starter-loadbalancer
简述 spring-cloud-starter-loadbalancer 是 Spring Cloud 中的一个组件,它提供了客户端负载均衡的功能。在 Spring Cloud 的早期版本中,Netflix Ribbon 被广泛用作客户端负载均衡器,但随着时间推移和 Netflix Ribbon 进入维护模式ÿ…...
牛客周赛-46
牛客周赛-46 a乐奈吃冰b素世喝茶c爱音开灯d小灯做题 a乐奈吃冰 ac code #include<iostream> using namespace std; int main(){long long a,b;cin>>a>>b;int tmpmin(b,a/2);long long resatmp;cout<<res;return 0; }b素世喝茶 #include<iostream…...
多模态vlm综述:An Introduction to Vision-Language Modeling 论文解读
目录 1、基于对比学习的VLMs 1.1 CLIP 2、基于mask的VLMs 2.1 FLAVA 2.2 MaskVLM 2.3 关于VLM目标的信息理论视角 3、基于生成的VLM 3.1 学习文本生成器的例子: 3.2 多模态生成模型的示例: 3.3 使用生成的文本到图像模型进行下游视觉语言任务 4、 基于预训练主干网…...
28.找零
上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/744 题目描述 有一台自动售票机,每张票卖 …...
[方法] 《鸣潮》/《原神》呼出与锁定光标的功能细节
本方法适用于Cinemachine - FreeLook。 1. 锁定与呼出光标的功能实现 // 锁定光标 private void LockMouse() {// 将光标锁定在屏幕中间Cursor.lockState CursorLockMode.Locked;// 隐藏光标Cursor.visible false; }// 呼出光标 private void UnLockMouse() {// 释放光标Cu…...
计算机网络-NAT配置与ACL
目录 一、ACL 1、ACL概述 2、ACL的作用 3、ACL的分类 4、ACL的配置格式 二、NAT 1、NAT概述 2、NAT分类 2.1 、 静态NAT 2.2 、 动态NAT 3、NAT的功能 4、NAT的工作原理 三、NAT配置 1、静态NAT配置 2、动态NAT配置 四、总结 一、ACL 1、ACL概述 ACLÿ…...
哈尔滨三级等保测评需要测哪些设备?
哈尔滨三级等保测评需要测的设备,主要包括物理安全设备、网络安全设备和应用安全设备三大类别。这些设备在保障哈尔滨地区信息系统安全方面发挥着至关重要的作用。 首先,物理安全设备是确保信息系统实体安全的基础。在哈尔滨三级等保测评中,物…...
大学体育(二)(华中科技大学) 中国大学MOOC答案2024版100分完整版
大学体育(二)(华中科技大学) 中国大学MOOC答案2024版100分完整版 有氧运动 有氧运动单元测验 1、 世界卫生组织对18-64岁年龄组成年人的运动建议是:每周至少( )分钟的中等强度有氧身体活动,或者每周至少&a…...
Web前端策划:从理念到实现的全方位解析
Web前端策划:从理念到实现的全方位解析 在数字化时代的浪潮中,Web前端策划作为连接技术与用户界面的桥梁,扮演着至关重要的角色。它涉及从用户需求分析、设计构思到技术实现的全方位过程,要求策划者具备深厚的技术功底和敏锐的市…...
经济与安全兼顾:茶饮店购买可燃气体报警器的价格考量
可燃气体报警器在如今的社会中扮演着至关重要的角色。它们用于检测环境中的可燃气体浓度,及早发现潜在的火灾隐患,保护人们的生命和财产安全。 在这篇文章中,佰德将介绍可燃气体报警器的安装、检定以及价格,通过实际案例和数据&a…...
鞠小云张霖浩闪耀北京广播电视台春晚发布会,豪门姐弟感爆棚
昨日,2025年北京广播电视台“追梦春晚”全国海选发布会在杭州举行,中国内地青年女演员鞠小云同人气幕后张霖浩,受主办方盛情邀请出席本次活动。从现场流露出的照片中可以看出,鞠小云一袭白色长裙灵动温婉素雅,而张霖浩…...
java Function 用法
**Function 接口是 Java 8 引入的一个核心函数式接口,用于表示一个接受单一输入参数并产生结果的函数**。Function 接口主要用在数据处理和转换操作中,如集合处理、流处理等场景。下面将深入探讨 Function 接口的用法: 1. **基本概念**&…...
LabVIEW与Python的比较及联合开发
LabVIEW和Python在工业自动化和数据处理领域各具优势,联合开发可以充分发挥两者的优点。本文将从语言特性、开发效率、应用场景等多个角度进行比较,并详细介绍如何实现LabVIEW与Python的联合开发。 语言特性 LabVIEW 图形化编程:LabVIEW使用…...
RAG技术在教育领域的应用
一、引言 点击可以查看最新资源 随着人工智能技术的飞速发展,教育领域正迎来一场深刻的变革。大型语言模型(LLM)和检索增强生成(Retrieval-Augmented Generation,RAG)技术的结合,为教育领域注入…...
玉米粒计数检测数据集VOC+YOLO格式107张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):107 标注数量(xml文件个数):107 标注数量(txt文件个数):107 标注类别…...
成功解决IndexError: index 0 is out of bounds for axis 1 with size 0.
成功解决IndexError: index 0 is out of bounds for axis 1 with size 0. 🌈 欢迎莅临我的个人主页👈这里是我深耕Python编程、机器学习和自然语言处理(NLP)领域,并乐于分享知识与经验的小天地!Ἰ…...
stm32之USMART调试组件的使用
一、什么是USMART? USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具。具体工作过程是通过串口发送命令给单片机,然后单片机收到命令之后调用单片机里面对应的相关函数,并执行,同时支持返回结果。 二、USMART调…...
【Python】成功解决TypeError: ‘int’ object is not iterable
【Python】成功解决TypeError: ‘int’ object is not iterable 🌈 欢迎莅临我的个人主页👈这里是我深耕Python编程、机器学习和自然语言处理(NLP)领域,并乐于分享知识与经验的小天地!🎇 &#…...
【日常记录】【JS】中文转拼音的库 pinyin-pro
文章目录 1、介绍2、pinyin-pro 基本使用3、参考链接 1、介绍 pinyin-pro 是一个专业的 JavaScript 中文转拼音的库,具备多音字识别准确、体积轻量、性能优异、功能丰富等特点。 常用的案例 搜索功能增强:在输入框输入汉字时,可以转化为拼音输…...
CopyOnWriteArrayList详解
目录 CopyOnWriteArrayList详解1、CopyOnWriteArrayList简介2、如何理解"写时复制"3、CopyOnWriteArrayList的继承体系4、CopyOnWriteArrayList的构造函数5、CopyOnWriteArrayList的使用示例6、CopyOnWriteArrayList 的 add方法7、CopyOnWriteArrayList弱一致性的体现…...
CUDA 编程(1):使用Grid 和 Block分配线程
1 介绍 1.1 Grid 和 Block 概念 核函数以线程为单位进行计算的函数,cuda编程会涉及到大量的线程(thread),几千个到几万个thread同时并行计算,所有的thread其实都是在执行同一个核函数。 对于核函数(Kernel),一个核函数一般会分配1个Grid, 1个Grid又有很多个Block,1个Bloc…...
ArcGIS for js 4.x FeatureLayer 加载、点选、高亮
安装arcgis for js 4.x 依赖: npm install arcgis/core 一、FeatureLayer 加载 代码如下: <template><view id"mapView"></view></template><script setup>import "arcgis/core/assets/esri/themes/li…...
倩女幽魂手游攻略:云手机自动搬砖辅助教程!
《倩女幽魂》手游自问世以来一直备受玩家喜爱,其精美画面和丰富的游戏内容让人沉迷其中。而如今,借助VMOS云手机,玩家可以更轻松地进行搬砖,提升游戏体验。 一、准备工作 下载VMOS云手机: 在PC端或移动端下载并安装VM…...
Typesense-开源的轻量级搜索引擎
Typesense-开源的轻量级搜索引擎 Typesense是一个快速、允许输入错误的搜索引擎,用于构建愉快的搜索体验。 开源的Algolia替代方案& 易于使用的弹性搜索替代方案 官网: https://typesense.org/ github: https://github.com/typesense/typesense 目前已有18.4k…...
探索 LLM 预训练的挑战,GPU 集群架构实战
万卡 GPU 集群实战:探索 LLM 预训练的挑战 一、背景 在过往的文章中,我们详细阐述了LLM预训练的数据集、清洗流程、索引格式,以及微调、推理和RAG技术,并介绍了GPU及万卡集群的构建。然而,LLM预训练的具体细节尚待进一…...
高考分数查询结果自动推送至微信(卷II)
祝各位端午节安康!只要心中无结,每天都是节,开心最重要! 在上一篇文章高考分数查询结果自动推送至微信(卷Ⅰ)-CSDN博客中谈了思路,今天具体实现。文中将敏感信息已做处理,读者根据自…...
python类动态属性,以属性方式访问字典
动态属性能够用来描述变化的类,在实际应用中容易遇到用到。 import logging class Sample:def __init__(self):self.timeNoneself.sampleidNoneself.massNoneself.beizhu""self.num0self.items{}#字典属性def __getattribute__(self, attr): #注意&#…...
招聘在家抄书员?小心是骗局!!!
在家抄书员的骗局是一种常见的网络诈骗手段,旨在利用人们想要在家轻松赚钱的心理。这种骗局通常会以招聘兼职抄写员的形式出现,声称只需在家中抄写书籍即可赚取可观的收入。然而,实际上这背后隐藏着诸多陷阱和虚假承诺。 首先,这些…...
Pytorch学习11_神经网络-卷积层
1.创建神经网络实例 import torch import torchvision from torch import nn from torch.nn import Conv2d from torch.utils.data import DataLoaderdatasettorchvision.datasets.CIFAR10("../dataset_cov2d",trainFalse,transformtorchvision.transforms.ToTensor(…...
Qt实现程序单实例运行(只能运行1个进程)及QSharedMemory用法
1. 问题提出 在开发时,经常遇到这样的需求或场景:程序只能被启动一次,不能启动多次,启动多次会导致混乱,如:可执行程序用到文件指针、串口句柄等。试想如果存在多个同一个文件的句柄或同一个串口的句柄&…...
wordpress远程缩略图/win7最好的优化软件
相信很多同学即便没有接触过富文本编辑领域,也一定听说过【富文本编辑是天坑,千万不要碰】的说法——是的,富文本编辑是天坑,但 Slate 能很好地帮助你。下面会介绍富文本编辑的复杂度所在,以及 Slate 的解决方式。 背景…...
rttheme 18 wordpress/各城市首轮感染高峰期预测
1.问题描述 n个强盗(编号1,2,3,…,n)分赃m个金币。先由强盗1提出分配方案,所有的强盗投票,超过半数支持则方案通过,否则将强盗1杀死、由强盗2继续提方案,以此类推。假设所有的强盗都足够聪明,并…...
网站建设竞标书/百度seo教程
FileUtils类的应用 写入一个文件;从文件中读取;创建一个文件夹,包括文件夹;复制文件和文件夹;删除文件和文件夹;从URL地址中获取文件;通过文件过滤器和扩展名列出文件和文件夹;比较…...
湖南做网站 x磐石网络/a站
原文:https://blog.csdn.net/qq_27198345/article/details/111401610对于管理系统或其他需要用户登录的系统,登录验证都是必不可少的环节,在SpringBoot开发的项目中,通过实现拦截器来实现用户登录拦截并验证。1、Spring Boot实现登…...
做公司网站棋牌/免费网站的软件
--------- Lexlin 2016-6-17战国时代诸侯混战,群雄并起,各诸侯国为了各自利益,厉兵秣马、尔虞我诈。而一些个人为了争名逐利,陆续入世到这种大混战之中,于是各种谋略之士、舌辩之士、军事达人纷纷涌现出来ÿ…...
宽屏企业网站源码/一站式媒体发稿平台
每个月都有各种各样的开销,不当家不知道柴米贵呀!柴米油盐酱醋茶样样都要开销,吃的穿的,各种开销,每个月都没有啥结余,小编月初是富人,月底就光了。都说理财从记账开始,小编我用过很…...