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框选&…...
RISC-V实战:手把手教你为蜂鸟E203设计一个简单的矩阵累加协处理器
RISC-V实战:从零构建蜂鸟E203矩阵累加协处理器 在嵌入式系统设计中,性能优化始终是开发者面临的核心挑战。当标准处理器无法满足特定算法的计算需求时,定制化硬件加速器便成为提升效率的关键。本文将带领您完成一个完整的RISC-V协处理器开发项…...
物理不可克隆函数(PUF)技术解析与ioPUF+创新应用
1. 物理不可克隆函数(PUF)技术解析在物联网设备安全领域,物理不可克隆函数(Physical Unclonable Function, PUF)正逐渐成为硬件安全认证的核心技术。PUF通过提取半导体制造过程中不可避免的工艺偏差,为每个芯片生成独一无二的"数字指纹"。这种…...
2026 论文写作软件红黑榜:AI 论文写作软件怎么选?用数据说话!
2026 年论文写作工具红榜榜单正式发布,掌桥科研 AI 写作、ThouPen、豆包因深度贴合国内学术标准,位列红榜前列。黑榜则提醒大家远离劣质免费工具、无真实文献引用平台以及过度主打全文生成的 AI 软件。挑选时可参考三大核心维度:需求契合度、…...
Go语言的runtime.LockOSThread线程锁定与Cgo调用在并发中的互操作
Go语言的runtime.LockOSThread线程锁定与Cgo调用在并发中的互操作是高性能编程中一个关键但容易被忽视的话题。Go语言以其轻量级goroutine和高效的调度器闻名,但在与C语言交互时,线程绑定和并发控制可能带来意想不到的挑战。本文将深入探讨这一技术细节&…...
ml-intern灾难恢复计划:系统故障后的完整恢复策略
ml-intern灾难恢复计划:系统故障后的完整恢复策略 【免费下载链接】ml-intern 🤗 ml-intern: an open-source ML engineer that reads papers, trains models, and ships ML models 项目地址: https://gitcode.com/GitHub_Trending/ml/ml-intern …...
智能推荐系统的算法原理与工程化实现方案
智能推荐系统已成为互联网时代信息分发的核心技术,其通过算法模型精准匹配用户与内容,广泛应用于电商、短视频、新闻资讯等领域。本文将深入剖析其核心算法原理与工程化落地方案,为读者揭示从数据到推荐的全链路逻辑。推荐算法核心原理推荐系…...
VSCode远程连接卡顿到崩溃?3个被90%开发者忽略的SSH配置致命细节
更多请点击: https://intelliparadigm.com 第一章:VSCode远程连接卡顿到崩溃的真相揭秘 VSCode 的 Remote-SSH 扩展在中大型项目或低带宽/高延迟网络环境下,常出现编辑器响应迟缓、终端假死、甚至整个窗口崩溃的现象。这并非单纯由网络质量导…...
GBase 8c数据库普通视图与物化视图介绍(二)
本文档面向数据库运维人员、架构师及社区技术爱好者,系统介绍南大通用GBase 8c数据库(gbase database)中普通视图与物化视图的核心原理、操作方法、特性差异及适用场景。内容结合GBase 8c分布式架构特性,清晰区分两类视图的使用边…...
2026 年最佳 SEO 报告软件大揭秘:Semrush 等谁能脱颖而出?
SEO 报告现状与软件价值你已深知 SEO 策略成效显著,排名攀升、流量上升,内容吸引自然流量。然而,当被问及“投资换来了什么”时,2026 年多数 SEO 专业人士会在周日手忙脚乱地从五个仪表盘拼凑截图。虽有数据,但转化为清…...
SpringBoot+MyBatis-Plus多数据源实战:从原理到分布式事务
一、多数据源架构设计 说到多数据源,很多人第一反应是配置多个DataSource,然后根据业务场景手动选择。这种方式有两个问题: 代码侵入性强,每个方法都要判断用哪个数据源 事务管理混乱,Spring的@Transactional只能管理单个数据源 更好的方案是使用Spring提供的AbstractRou…...

