Spring Cloud LoadBalancer 简单介绍与实战
前言
本文为SpringCloud的学习笔记,如有错误,希望各位高手能指出,主要介绍SpringCloudLoadBalancer的基本概念和实战
文章目录
- 前言
- 什么是LoadBalancer
- 负载均衡分类
- 服务端负载均衡
- 客户端负载均衡
- 服务端负载均衡和客户端负载均衡的优缺点
- 常见负载均衡策略
- 为什么要学习Spring Cloud LoadBalancer
- 如何使用?
- 项目搭建
- 使用随机策略
- 使用Nacos的负载均衡策略策略
- 自定义策略(IP Hash为例)
- 编写自定义策略类
- 封装自定义负载均衡
- 全局配置自定义负载均衡配置类
- 缓存
什么是LoadBalancer
❀ LoadBalancer是一种流量分发机制,专业中文叫法“负载均衡”,这种流量分发可以通过软件或者硬件来实现服务端系统资源的均衡利用,提高整体系统的高可用和性能。
负载均衡分类
※ 负载均衡可以分为服务端负载均衡和客户端负载均衡
对于服务器端负载均衡,被称为:反向代理
对于客户端负载均衡,则称为:正向代理
服务端负载均衡
顾名思义,服务端负载均衡就是在服务器层面实现流量分发,如下图所示:

实现服务器端负载均衡的均衡器有:Nginx、HAProxy、F5等
客户端负载均衡
在知道服务器负载均衡后,客户端负载均衡也容易理解,这是在客户端就直接实现流量分发,也就是说,在客户端就知道请求去往何处,如下图所示:

客户端负载均衡有:Ribbon、SpringCloudLoadBalancer
服务端负载均衡和客户端负载均衡的优缺点
服务端负载均衡:
-
优点:
- 简化客户端逻辑:客户端无需了解服务实例的具体细节,只需要请求负载均衡器即可。
- 可动态调整负载均衡策略:通过配置负载均衡器,能够根据实际情况动态调整请求的分发规则。
- 提供更好的可扩展性:负载均衡器可与其他服务治理组件整合,如服务注册中心、服务发现等。
- 减轻客户端压力:负载均衡器可以在后端服务器之间平均分发请求,降低单个服务器压力。
-
缺点:
-
单点故障:负载均衡器本身可能成为系统的单点故障,当负载均衡器出现问题时,会导致整个系统不可用。
-
需要独立的负载均衡器:搭建和管理一个独立的负载均衡器需要额外的成本和维护工作。
-
中心化决策:负载均衡的决策是集中在负载均衡器,无法根据客户端的具体状态和需求做出决策。
-
客户端负载均衡:
-
优点:
-
根据状态选择: 可以根据客户端的状态和需求进行负载均衡策略选择。
-
分散决策:分散了负载均衡的决策,可以更加灵活地适应不同的场景需求。
-
提供更好的容错能力:当某个服务实例故障时,客户端可以自动切换到其他可用实例。
-
-
缺点:
-
客户端复杂性增加:客户端需要实现负载均衡算法和服务发现逻辑,增加了客户端的复杂性。
-
全局视图的欠缺:没有全局视图,可能导致不同客户端之间的实例选择不一致,进而影响系统整体性能和一致性。
-
客户端资源消耗:每个客户端需要额外的资源来处理负载均衡逻辑,可能导致资源浪费。
-
综合来看,服务端负载均衡更适用于大型系统和复杂架构,可以提供统一的处理策略和更好的可扩展性。而客户端负载均衡则更适用于轻量级系统和简单架构,可以提供更灵活和定制化的负载均衡策略。
常见负载均衡策略
- 轮询(Round Robin):轮询策略就是按照顺序把每个请求分发给服务端,依次循环。适用于后端服务器性能相近,且每个服务器处理时间相近的情况
- 随机选择(Random):把请求随机发给后端服务器,适用于后端服务器性能相近,且每个服务器处理时间相近的情况,但无法保证请求均与分发
- 最少链接(Least Connections):最少连接策略将请求分发给当前连接数最少的后端服务器,可以确保后端服务器连接均衡,需要维护连接计数器。需要注意的是,
“最少连接数”只是一个估计值,在千变万化的网络环境下,连接数也在变化。 - IP 哈希(IP Hash):根据客户端IP地址进行哈希计算,根据哈希值将请求发送到对应服务器上。这种策略可以用于确保来自同一客户端的请求都会被发送到后端服务器,适用于会话保持的情况。
- 加权轮询(Weight Round Robin):给每个后端服务器分配一个权重值,然后按照权值比例来分发请求,这种策略可以用来处理服务器性能不均衡的情况。
- 加权随机(Weigh Random):与加权轮询类似,但是按照权重值来随机选择后端服务器。这也可以用来处理后端服务器性能不均衡的情况,但是分发更随机。
- 最短响应时间(Least Response Time):根据后端服务器的响应时间情况,分发请求到响应时间最短的服务器。这样可以确保客户端或者最快的响应,适用于低延迟的应用。
为什么要学习Spring Cloud LoadBalancer
作为早期版本中SpringCloud内置的负载均衡器Ribbon,在SpringCloud 2020.0.0中已经被移除,可以在 https://github.com/spring-cloud/spring-cloud-release/wiki/Spring-Cloud-2020.0-Release-Notes中进行查看更新日志。
取而代之的是SpringCloud官方提供的Spring-Cloud-LoadBalancer负载均衡
但Spring Cloud LoadBalancer中仅提供了三种负载均衡策略:轮询、加权、自定义(Nacos的负载均衡算alibaba自定义)
可以通过Spring Cloud LoadBalancer的配置类LoadBalancerClientConfiguration查看底层配置
@Configuration(proxyBeanMethods = false
)
@ConditionalOnDiscoveryEnabled
public class LoadBalancerClientConfiguration {private static final int REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER = 193827465;public LoadBalancerClientConfiguration() {}@Bean@ConditionalOnMissingBeanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
// 以下忽略......
}
这段代码中,reactorServiceInstanceLoadBalancer()方法的返回类型ReactorLoadBalancer< T >就是策略的实现接口,具体实现类如下图所示:

值得我们注意的是,在这个方法中,默认返回了RoundRobinLoadBalancer这个类,也就说SpringCloudLoadBalancer默认使用轮询策略。
如何使用?
在项目中添加Spring Cloud OpenFeign、注册中心(Nacos)、在添加Spring Cloud LoadBalancer则会在接口调用时直接使用SpringCloudLoadBalance。
项目搭建
我们先构建一个多模块项目SpringCloud-LoadBalancer-demo,具体过程省略,详情可以到这篇文章下查看《Nacos 注册中心介绍与实操》

在Provider子模块中,我们创建一个简单controller类
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate ServletWebServerApplicationContext servletWebServerApplicationContext;@RequestMapping("/getid")public String getId(@RequestParam Integer id){return servletWebServerApplicationContext.getWebServer().getPort()+"-provider-"+id;}
}
随后我们启动两个相同的Provider服务并注册到Nacos中


对于Consumer,我们需要建立sevice接口和controller类,controller类调用service接口的方法,该方法会在注册中心中通过负载均衡(默认轮询)获取服务端信息,然后将请求发送到指定服务端请求数据。

Sevice代码
@Service
@FeignClient("nacos-provider")
public interface UserService {@RequestMapping("/user/getid")String getId(@RequestParam("id") Integer id); //@RequestParam("id") 不能省略必须全部带上
}
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/getid")public String getId(@RequestParam("id") Integer id){return userService.getId(id);}
}
启动类添加注解:@EnableFeignClients
@SpringBootApplication
@EnableFeignClients // 开启OpenFeign
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}
那么接下来启动Consumer验证底层默认策略是否为轮询
会发现在我们没有配置负载均衡策略的时候,每次访问都是两个服务端轮流使用
第一次访问:

第二次访问:

使用随机策略
创建随机策略配置类(不需要@configuration注解)
public class RandomLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
细心的同学就已经发现了,这个方法跟上面提到的LoadBalancerClientConfiguration .reactorServiceInstanceLoadBalancer()方法实现很像。这是因为官方文档中就是这么告诉我们如果要使用其他策略就需要这样做,复制一下方法体,修改返回的策略对象。
官方文档链接:https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer
当然如果只是写一个配置类还不够,我们还需要到启动类(全局配置)或者服务类(局部配置)中去启用它
全局配置:
@SpringBootApplication
@EnableFeignClients // 开启OpenFeign
@LoadBalancerClients(defaultConfiguration = RandomLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}
这时再去访问http://localhost:8080/user/getid?id=1时就会发现,我们不断刷新,它访问的值就完全随机了。(不知道怎么做动态图,不方便演示T_T)
局部配置
@Service
@FeignClient("nacos-provider")
@LoadBalancerClient(value = "nacos-provider", configuration = RandomLoadBalancerConfig.class)
public interface UserService {@RequestMapping("/user/getid")String getId(@RequestParam("id") Integer id); //@RequestParam("id") 不能省略必须全部带上
}
可能是SpringCloud版本问题,局部配置不生效,使用的任然是轮询策略,做了解即可
使用Nacos的负载均衡策略策略
@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
public class NacosLoadBalancerConfig {@Resourceprivate NacosDiscoveryProperties nacosDiscoveryProperties;@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name, nacosDiscoveryProperties);}
}
与其他两个官方儿子不一样,Nacos的负载均衡器还需要额外数据信息
启动类添加注解
@SpringBootApplication
@EnableFeignClients // 开启OpenFeign
//@LoadBalancerClients(defaultConfiguration = RandomLoadBalancerConfig.class)
@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}
我们会发现Nacos中使用的不是轮询,翻阅底层实现,会发现他是权重策略,所以为了验证这个,我们到Nacos注册中心中去修改一下服务端权重

这个时候我们再去访问,就可以发现它会大部分请求都使用53922这个端口的服务(无动图不方便演示,读者可以自己实操体验一下)
局部配置NacosNacos策略是生效的,可以自行测试
自定义策略(IP Hash为例)
要实现自定义策略需要三个步骤
- 编写自定义策略类
- 封装自定义策略类
- 全局或者局部使用自定义配置类
编写自定义策略类
回到我们下面这张图

不难发现,ReactorLoadBalancer< T >是我们负载均衡器的实现上层骨架,这个就是设计模式中的“模板方法模式”,所有人都必须按照骨架进行开发,那么我们自定义策略类也需要如此,但我们去实现的接口是他的子接口ReactorServiceInstanceLoadBalancer,重写它的两个choose方法。
MyLoadBalancer实现
public class MyLoadBalancer implements ReactorServiceInstanceLoadBalancer {private static final Log log = LogFactory.getLog(MyLoadBalancer.class);private final String serviceId;private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;public MyLoadBalancer(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();int index = hash%instances.size();ServiceInstance instance = (ServiceInstance)instances.get(index);return new DefaultResponse(instance);}}
}
代码看起来多,但是你如果看一下官方两个亲儿子的源码就会发现,其实只需要复制一下,修改getInstance这段核心代码就可以了

封装自定义负载均衡
构建Config类,使用同样配方进行封装
public class MyLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new MyLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
全局配置自定义负载均衡配置类
启动类
@SpringBootApplication
@EnableFeignClients // 开启OpenFeign
//@LoadBalancerClients(defaultConfiguration = RandomLoadBalancerConfig.class)
//@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
@LoadBalancerClients(defaultConfiguration = MyLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}
实际结果,只会访问固定一个端口
缓存
Spring Cloud LoadBalancer在获取实例时有两种选择
1.即使获取:每次从注册中心得到最新健康的实例,效果好,但是得一直询问,系统开销比较大
2.缓存服务列表:每次得到服务列表之后,缓存一段时间,这样能保证性能,同时也能兼容一定的及时性
Spring Cloud LoadBalancer中默认开始缓存服务列表
Spring Cloud LoadBalancer默认缓存重要特性有两项
- 缓存的过期时间为35S
- 缓存保存个数为256个
我们可以通过以下配置改变这些配置
Spring:cloud:loadbalancer:cache:ttl:35scapacity: 1024# enable: false # 开启缓存
相关文章:
Spring Cloud LoadBalancer 简单介绍与实战
前言 本文为SpringCloud的学习笔记,如有错误,希望各位高手能指出,主要介绍SpringCloudLoadBalancer的基本概念和实战 文章目录 前言什么是LoadBalancer负载均衡分类服务端负载均衡客户端负载均衡服务端负载均衡和客户端负载均衡的优缺点 常见…...
私域流量解决方案分享
...
Scala---WordCount
一、创建Maven项目导入pom.xml文件 安装Maven仓库管理工具,版本要求是3.2版本以上。新建Maven项目,配置pom.xml。导入必要的包。 二、Spark-Scala版本的WordCount 1.val conf new SparkConf() 2.conf.setMaster("local") 3.conf.setAppNam…...
GTC2023全球流量大会蓄势待发,菊风在7B57展位等你!
第六届 GTC 全球流量大会(以下简称 GTC2023)将于12月5日- 6日,在深圳福田会展中心7&8号馆举办。 据悉,本届大会将是历届以来规模最大、参与人数最多、跨境出海资源最丰富的一次行业盛会。7、8 号馆共 15000 平方米&am…...
喜讯!云起无垠成为国家信息安全漏洞库(CNNVD)技术支撑单位
近日,云起无垠凭借其在漏洞挖掘、漏洞检测以及漏洞修复等领域的卓越表现,荣获“国家信息安全漏洞库(CNNVD)技术支撑单位等级证书(三级)”,正式成为CNNVD技术支撑单位。 中国国家信息安全漏洞库&…...
cc linux用root用户执行chmod 777 -R ./提示 Operation not permitted怎么办?
如果你作为 root 用户执行 chmod 777 -R ./ 命令时收到 “Operation not permitted” 错误,可能有几个原因: 不可更改 (Immutable) 文件属性: 文件可能被设置为不可更改。即使是 root 用户也不能修改这些文件的权限。使用 lsattr 命令查看文件…...
scrapy框架流程
1、Scrapy从Spider子类中提取start_url,然后构造为request请求对象 2、将request请求对象传递给爬虫中间件 3、将request请求对象传递给Scrapy引擎(核心代码) 4、将request请求对象传递给调度器(它负责对多个request安排,好比交…...
802.11 帧的Reason Code 位和Status Code 位
Reason Code 位 当对方不适合加入网络时,工作站会送出 Disassociation(解除连接)或 Deauthentication(解除身份认证)帧作为应答。这些帧当中包含一个长度 16bit 的 Reason Code(原因代码)位&am…...
骨传导能保护听力吗?为什么说骨传导耳机可以保护听力?
由于骨传导耳机的特殊传声方式,是可以保护听力的。 首先了解下骨传导耳机的传声方式是什么: 骨传导耳机是通过骨骼震动传导技术,将声音传至颅骨,然后通过颅骨传导到内耳,直接刺激听觉神经,使人感知到声音…...
【iOS】实现评论区展开效果
文章目录 前言实现行高自适应实现评论展开效果解决cell中的buttom的复用问题 前言 在知乎日报的评论区中,用到了Masonry行高自适应来实现评论的展开,这里设计许多控件的约束问题,当时困扰了笔者许久,特此撰写博客记录 实现行高自…...
POE交换机——电源解决方案-升压控制器\降压控制器\中高压降压转换器
PoE是一种有线以太网供电技术,使用于数据传输的网线同时具备直流供电的能力,PoE供电具有可靠、连接简捷、标准统一的优势。越来越多的工业物联网设备开始采用PoE供电, 如IP电话、网络视频监控以及无线以太网设备等。 PoE交换机是一种用于提供…...
[C/C++]数据结构 循环队列
前言: 队列是一种具有先进先出特性的结构,但是当数据出队列以后,前面的空间就无法再次利用了,循环队列就可以解决这个问题 一:概念及结构: 1.循环队列概念 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队…...
Cache学习(2):Cache结构 命中与缺失 多级Cache结构 直接映射缓存
1 Cache名词解释 命中(hit): CPU要访问的数据在Cache中有缓存缺失(miss): CPU要访问的数据在Cache中没有缓存Cache Size:Cache的大小,代表Cache可以缓存最大数据的大小Cache Line&a…...
vue前端前端页面权限验证方式
在Vue应用中使用Vuex(Vue的状态管理库)来存储用户组(user group)和角色(roles)信息是一种合理的做法,特别是在涉及到权限管理和用户身份的情况下。Vuex提供了一个集中式的状态管理方案ÿ…...
jenkins springCloud项目优雅下线
文章目录 场景解决下线请求效果如图贴一个可用的部署脚本 场景 在 Spring Cloud 项目的微服务实例关闭时,需要首先从注册中心设置为下线,避免该服务的消费者继续请求该服务实例,导致请求失败如果我们在服务实例从注册中心取消注册后ÿ…...
indexOf
可以通過String的indexOf判斷是否包括某個字符。 SpringBootTest Slf4j class BaseApplicationTests {Testvoid contextLoads() {log.info("01".indexOf(".")"");log.info("0.1".indexOf(".")"");log.info("…...
STM32分区跳转问题
项目场景: 在OTA中,FLASH通常被划分为以下几种类型 bootloaderiapappbootloaderappapp保存区bootloaderapp1app2 不同的分区方式有不同的有点,但是共同点都是需要执行分区跳转 问题1描述 但在分区跳转过程中遇到过使用不同的编译器不能跳转…...
亿级流量架构服务降级
什么是服务降级 如果看过我前面对服务限流的分析,理解服务降级就很容易了,对于一个景区,平时随便进出,但是一到春节或者十一国庆这种情况客流量激增,那么景区会限制同时进去的人数,这叫限流,那么什么是服务降级呢? 简单来说就是,将一些不太重要的景区项目砍掉,平时就那么三五…...
【技术分享】RK3399 Ubuntu通过Python实现录音和播放功能
本文基于IDO-SBC3968 Ubuntu 系统通过Python脚本实现录音和播放功能。 IDO-SBC3968采用RK3399国产六核64位CPU高性能处理器,支持4K HDMI2.0显示,接口丰富,拥有千兆以太网,全协议TypeC接口,USB3.0 ,eDP 和…...
关于vs code Debug调试时候出现“找不到任务C/C++: g++.exe build active file” 解决方法
vs code Debug调试时候出现“找不到任务C/C: g.exe build active file” ,出现报错,Debug失败 后来经过摸索和上网查找资料解决问题 方法如下 在Vs code的操作页面左侧有几个配置文件 红框里的是需要将要修改的文件 查看tasks.json和launch.json框选&…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

