Spring Cloud Alibaba Ribbon负载均衡器

文章目录

Ribbon 负载均衡器

背景

Ribbon 是一个用于客户端负载均衡的开源库,它是 Netflix 开源的一部分,目前由 Spring Cloud 托管和维护。Ribbon 的主要作用是在微服务架构中管理客户端之间的负载均衡。
作用

作为一个负载均衡器,Ribbon 可以将客户端发起的请求分发到多个服务提供者实例中,以实现负载均衡和高可用性。它可以根据配置的负载均衡策略,在请求发起时选择一个合适的服务提供者实例,使请求能够均匀地分布到不同的实例上,从而提高系统的性能和可扩展性。

负载均衡策略

RoundRobinRule:轮询策略,依次选择每个服务提供者实例。

RandomRule:随机策略,随机选择一个服务提供者实例。

WeightedResponseTimeRule:根据平均响应时间和实例权重进行选择。

BestAvailableRule:优先选择可用性最好的实例。

ZoneAvoidanceRule:避免选择故障区域的实例。

此外,Ribbon 还支持自定义负载均衡策略,通过实现 IRule 接口可以编写自定义的负载均衡规则。
拓展

在 Spring Cloud 中,通过引入 spring-cloud-starter-netflix-ribbon 依赖,可以方便地使用 Ribbon 进行客户端负载均衡。

需要注意的是,从 Spring Cloud 2020 年版本开始,官方推荐使用 Spring Cloud LoadBalancer 替代 Ribbon 进行客户端负载均衡。因此,在最新的项目中,建议使用 Spring Cloud LoadBalancer 来实现负载均衡的功能。

环境搭建

(上一篇采用的搭建环境的方法)传送至上一篇

在之前的基础上需要加入一行新的配置即可

如果新建一个项目加入下方依赖即可

spring boot 版本 2.3.11.RELEASE

对应采用的springcloud

java 复制代码
 <properties>
        <java.version>1.8</java.version>
        <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
    </properties>

1.依赖

java 复制代码
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.配置

配置 application.properties

java 复制代码
spring.application.name=ribbon-a
server.port = 3030
#Nacos服务发现注册中心
spring.cloud.nacos.discovery.server-addr=192.168.14.3:8848

logging.level.com.hb = debug

3.修改其默认的负载均衡策略

轮询 ------> 随机 【ps:其他的也可自行设置】

配置config文件修改默认 策略

java 复制代码
@Configuration
public class MyRuleConfig {
    @Bean
    public IRule rule(){
        return new RandomRule();
    }
}

3.1 验证

开启两个nacos,都在统一命名空间下,一个打包以cmd 运行,一个idea运行

1.打包文件

在这里插入图片描述

2.进入该文件夹中#

3.,记得打开的时候进入 target目录下

在启动类上加入@EnableDiscoveryClient,即可在服务中查看到对应的服务

4.创建自定义的Rule

4.1 MyRule()

java 复制代码
@Component
@Slf4j
public class MyRule extends AbstractLoadBalancerRule {
    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;
    @Autowired
    private NacosServiceManager nacosServiceManager;

    private static AtomicInteger count = new AtomicInteger(0);


    @Override
    @SneakyThrows
    public Server choose(Object key) {

        String group = this.nacosDiscoveryProperties.getGroup();
        DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer)getLoadBalancer();
        String name = loadBalancer.getName();
        NamingService namingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());
        List<Instance> instances = null;
        instances = namingService.selectInstances(name, group, true);
        if (CollectionUtils.isEmpty(instances)) {
            log.warn("no instance in service {}", name);
            return null;
        }
        Instance maxInstance = instances.stream().max(Comparator.comparing(Instance::getWeight)).get();
        Instance minInstance = instances.stream().min(Comparator.comparing(Instance::getWeight)).get();
        int count2 = count.addAndGet(1);
        int mod = count2 % 4; //取模运算  5,10,15,20,25 ...
        if (mod == 0) {
            log.debug("count={},mod={},使用min",count2, mod);
            return new NacosServer(minInstance);
        } else {
            log.debug("count={},mod={},使用max",count2, mod);

            return new NacosServer(maxInstance);
        }
    }


    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
}

4.2 在配置config类中配置

下方是访问4次三次调用权重最大的,一次访问权重最小的

结果

也可以在peroperties文件中配置还可以配置全局的但是在我这个版本不行 ,这里只配置啦命名空间为nacos-a的

复制代码
 nacos-a.ribbon.NFLoadBalancerRuleClassName=com.hb.rule.MyRule

5.饥饿加载

在进行服务调用的时候,如果网络情况不好,第一次调用会超时。

Ribbon默认懒加载,意味着只有在发起调用的时候才会创建客户端。

开启饥饿加载,解决第一次调用慢的问题:

复制代码
ribbon:
eager-load:
# 开启ribbon饥饿加载
enabled: true
# 配置order-service使用ribbon饥饿加载,多个使用逗号分隔
clients: order-service

开启饥饿加载会在系统加载类的过程中,与连接池进行链接

6.我只想访问不想被别的访问

application.properties 配置文件中加入这个即可

spring.cloud.nacos.discovery.register-enabled=true

相关推荐
逆向编程6 小时前
MySQL 负载均衡完整入门实战教程
mysql·adb·负载均衡
Token炼金师1 天前
服务的骨架:网关、负载均衡、容灾、弹性与多机房 —— 推理系统架构五柱
人工智能·系统架构·llm·负载均衡·容灾·kv cache·prefix cache
微三云 - 廖会灵 (私域系统开发)2 天前
电商系统微服务拆分实战:从单体到Spring Cloud的分布式事务踩坑与补偿方案
分布式·spring cloud·微服务
k↑2 天前
SpringCloud + React19 集成Scalar的API文档
后端·spring·spring cloud
章老师说2 天前
NGINX官方谈Lua风险:这其实是两条网关技术路线之争
运维·nginx·负载均衡·lua·openresty
LiaoWL1232 天前
【SpringCloud合集-02】Spring Cloud LoadBalancer 负载均衡器学习笔记
学习·spring cloud·负载均衡
姚不倒3 天前
F5 SSL Profile 证书卸载深入篇
运维·网络协议·负载均衡·ssl·f5
oscar9993 天前
3.4 Nginx 负载均衡——动态再平衡的反人性纪律
nginx·github·负载均衡·财富源代码
姚不倒3 天前
F5 健康检查 Monitor 深入篇
运维·负载均衡·f5
9i编程4 天前
5.Nacos 配置中心化改造与短信 Debug 模式动态切换实践
后端·spring cloud