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

相关推荐
Han.miracle2 小时前
Spring Cloud + Nacos 环境切换与配置管理最佳实践
数据库·spring boot·spring cloud·maven
bukeyiwanshui3 小时前
20260423 一、 负载均衡-LVS 全解析
运维·负载均衡·lvs
旷世奇才李先生17 小时前
Docker实战:容器化部署与Docker Compose集群管理(附企业级案例)
spring cloud·docker·eureka
卷毛的技术笔记19 小时前
从“拆东墙补西墙”到“最终一致”:分布式事务在Spring Boot/Cloud中的破局之道
java·spring boot·分布式·后端·spring cloud·面试·rocketmq
RoboWizard20 小时前
移动固态硬盘的耐用性如何,怎么判断使用寿命?
服务器·数据库·负载均衡
源远流长jerry1 天前
从 Nginx 到 DPVS:高性能负载均衡之路
linux·网络·tcp/ip·nginx·负载均衡
2601_949816681 天前
springcloud springboot nacos版本对应
spring boot·spring·spring cloud
青槿吖1 天前
Sentinel 进阶实战:Feign 整合 + 全局异常 + Nacos 持久化,生产环境直接用
java·开发语言·spring cloud·微服务·云原生·ribbon·sentinel
Han.miracle1 天前
Nacos的使用快速上手
java·spring cloud
**蓝桉**1 天前
Nginx 负载均衡策略详解
运维·nginx·负载均衡