Ribbon

1、负载均衡策略

  • 轮询策略(RoundRobinRule)
    这是默认的策略,按照顺序依次选择服务实例进行处理。例如,如果有三个服务实例,那么第N次请求将会被分配到序号为(N mod 3)的服务实例上。轮询策略简单且平等地分配请求,适用于服务器处理能力相近的场景。
  • 随机策略(RandomRule)
    这种策略从可用的服务实例列表中随机选择一个来处理请求。由于选择是随机的,因此每个服务实例都有可能被选中,这有助于在某些情况下避免过多请求集中到某一特定实例。
  • 响应速度加权策略(WeightedResponseTimeRule)
    该策略根据服务实例的响应时间动态计算权重,响应时间越短的实例权重越高,从而有更大几率被选中。这种策略适用于处理能力不同的服务实例集群,通过实时监控响应时间,自动调整负载分配,优化整体性能。
  • 最优可用策略(BestAvailableRule)
    此策略会选取当前连接数最少的服务实例。连接数较少意味着服务的负载较轻,这样的分配可以进一步均衡各个服务的负载,避免某些服务因连接过多而变得缓慢或不可用。
  • 可用性过滤策略(AvailabilityFilteringRule)
    首先会过滤掉不可用的服务实例,然后在剩余的服务中选择并发连接数最少的一个。这种策略结合了对服务可用性的考量和负载均衡的需求,提升了系统的健壮性和用户体验。
  • 区域内可用性能优先策略(ZoneAvoidanceRule)
    在考虑服务可用性的基础上,还会优先考虑特定区域(zone)内服务的可用性。这种策略适用于跨区域部署的服务集群,能够优先调用同一区域内的服务,降低延迟,提升效率。
  • 重试策略(RetryRule)
    当选定的服务实例无法处理请求时,会自动换一个新的服务实例重试。这种策略适用于需要高可靠性的系统中,即使某个服务暂时不可用,也能通过快速切换保障业务的持续运行。

2、修改默认负载均衡策略

1)第一种方式

新增config
PS:不能写在@SpringbootApplication注解的@CompentScan扫描得到的地方,否则会被所有的RibbonClients共享

java 复制代码
package com;

import com.alibaba.cloud.nacos.ribbon.NacosRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RibbonConfig {

    @Bean
    public IRule iRule() {
        return new NacosRule();
    }
}

启动类上新增注解,server-nacos是被调用方的名称

java 复制代码
@RibbonClients(value = {
        @RibbonClient( name = "server-nacos", configuration = RibbonConfig.class)
})
2)第二种方式

配置application.yml

yml 复制代码
# 被调用的服务名
server-nacos:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

3、自定义策略

新增策略

java 复制代码
package com.zzuhai.client.ribbonrule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class NacosCustomRule extends AbstractLoadBalancerRule {

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    @Override
    public Server choose(Object o) {
        ILoadBalancer loadBalancer = this.getLoadBalancer();

        // 获取所有实例
        List<Server> reachableServers = loadBalancer.getReachableServers();

        // 获取随机数
        int random = ThreadLocalRandom.current().nextInt(reachableServers.size());

        return reachableServers.get(random);
    }
}

修改application.yml

yml 复制代码
# 被调用的服务名
server-nacos:
  ribbon:
    NFLoadBalancerRuleClassName: com.zzuhai.client.ribbonrule.NacosCustomRule

4、配置项目启动加载

默认是懒加载,调用的时候才加载,第一次调用的时候可能很慢

新增配置,修改成启动时候加载

yml 复制代码
ribbon:
	eager‐load:
 	# 开启ribbon饥饿加载
	enabled: true
 	# 使用ribbon饥饿加载,多个使用逗号分隔
	clients: server-nacos
相关推荐
跳跳的向阳花21 天前
03-08、SpringCloud第八章,升级篇,负载均衡与服务调用Ribbon和OpenFeign
spring cloud·ribbon·负载均衡
BestandW1shEs1 个月前
快速理解微服务中Ribbon的概念
微服务·ribbon
yours_Gabriel1 个月前
【微服务】 Eureka和Ribbon
java·微服务·eureka·ribbon
跳跳的向阳花1 个月前
03-03、SpringCloud第三章,负载均衡Ribbon和Feign
spring cloud·ribbon·负载均衡
吴冰_hogan1 个月前
Ribbon 入门实战指南
后端·spring cloud·ribbon·springcloud
一叶飘零_sweeeet1 个月前
Ribbon 与 Feign:微服务调用中的差异探究
spring·spring cloud·ribbon
快乐非自愿1 个月前
Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
spring cloud·ribbon·负载均衡
ChinaRainbowSea1 个月前
4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
java·spring boot·后端·spring·spring cloud·ribbon·负载均衡
白总Server1 个月前
JVM 处理多线程并发执行
jvm·后端·spring cloud·微服务·ribbon·架构·数据库架构
白总Server1 个月前
Swagger UI
后端·ui·spring cloud·ribbon·架构·scala·1024程序员节