0


【Ribbon负载均衡调用】—— 每天一点小知识

在这里插入图片描述

                                                                          **💧 
  
   
    
     
      
      
        R 
       
      
        i 
       
      
        b 
       
      
        b 
       
      
        o 
       
      
        n 
       
      
        负载均衡调用 
       
      
     
    
   
     \color{#FF1493}{Ribbon负载均衡调用} 
    
   
 Ribbon负载均衡调用💧**          

🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点
💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录


🐳Ribbon负载均衡调用

在现代分布式系统中,负载均衡是非常重要的组件,它可以确保服务的高可用性和性能优化。Ribbon是Netflix开源的负载均衡器,它在Spring Cloud中被广泛应用,为微服务架构中的服务消费者提供了负载均衡的功能。本博客将介绍Ribbon的概述、使用RestTemplate进行Ribbon负载均衡演示、Ribbon核心组件IRule的讲解和使用,以及Ribbon负载均衡算法,带领读者逐步完成内容,并通过代码示例来加深理解。

在这里插入图片描述


1. Ribbon概述

💧Ribbon是Netflix开源的负载均衡器,它是一个基于HTTP和TCP的客户端负载均衡器,可用于在多个服务提供者之间进行负载均衡。Ribbon的主要目标是提供客户端的负载均衡和容错能力,通过在服务消费者端实现负载均衡,可以有效地将请求分发到不同的服务实例上,从而提高系统的可用性和性能。

💧Ribbon在Spring Cloud中被广泛应用,结合其他组件如Eureka等,可以为微服务架构中的服务消费者提供高效可靠的负载均衡支持。下面,我们将通过一个简单的示例来演示如何使用RestTemplate实现Ribbon负载均衡。

2. Ribbon负载均衡演示(使用RestTemplate)

💧首先,我们需要创建一个Spring Boot项目,并添加相关依赖:

<!-- pom.xml --><dependencies><!-- 其他依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency></dependencies>

💧假设我们有一个提供"Hello World"服务的服务提供者,它有多个实例运行,并注册到Eureka服务器上。现在,我们将创建一个服务消费者,并使用Ribbon来调用这个服务的多个实例。

💧**在

application.properties

中配置Eureka服务器和Ribbon的相关信息:**

# application.properties
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

💧接下来,我们创建一个服务消费者,并在其中使用RestTemplate进行Ribbon负载均衡调用:

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cloud.client.loadbalancer.LoadBalanced;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;@ConfigurationpublicclassRibbonConfig{@Bean@LoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}@RestControllerpublicclassHelloController{@AutowiredprivateRestTemplate restTemplate;@GetMapping("/hello")publicStringsayHello(){// 使用服务名替代具体的URL,RestTemplate会自动处理负载均衡ResponseEntity<String> response = restTemplate.getForEntity("http://hello-service/hello",String.class);return response.getBody();}}

💧**在上面的代码中,我们通过

@LoadBalanced

注解创建了一个具有负载均衡能力的RestTemplate。在调用服务提供者时,我们使用服务名(“hello-service”)来代替具体的URL,Ribbon会自动帮助我们选择一个可用的实例进行调用。这样,我们就完成了Ribbon负载均衡的演示。**

3. Ribbon核心组件IRule讲解和使用

💧在Ribbon中,IRule是负载均衡的核心组件,它定义了负载均衡的策略。Ribbon提供了多种内置的IRule实现,同时也支持自定义实现。

💧Ribbon内置的一些常用IRule实现包括:

  • **RoundRobinRule**:轮询策略,默认的负载均衡策略,按顺序依次选择服务实例。
  • **RandomRule**:随机策略,随机选择一个可用的服务实例。
  • **WeightedResponseTimeRule**:根据实例的响应时间来分配权重,响应时间越短的实例被选中的概率越大。

💧**我们可以通过配置修改IRule的默认实现。在

application.properties

中添加以下配置:**

# application.properties
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

💧**上述配置将使用

RandomRule

替代默认的轮询策略。**

💧**除了使用内置的IRule实现,我们还可以自定义IRule,以满足特定的负载均衡需求。自定义IRule需要实现

com.netflix.loadbalancer.IRule

接口,并使用

@Configuration

注解将其声明为配置类。**

4. Ribbon负载均衡算法

💧Ribbon在负载均衡时采用了多种算法来选择服务实例。前面提到了一些常用的内置IRule实现,它们对应了不同的负载均衡算法。以下是一些常见的负载均衡算法:

  • 轮询(Round Robin):依次按顺序选择服务实例,逐个进行调度,循环往复。
  • 随机(Random):随机选择一个可用的服务实例。
  • 加权轮询(Weighted Round Robin):根据权重来进行轮询选择,权重越高的实例被选中的概率越大。
  • 加权随机(Weighted Random):根据权重来进行随机选择,权重越高的实例被选中的概率越大。
  • 最少连接数(Least Connections):选择当前连接数最少的实例,以达到请求分发的负载均衡效果,适用于处理连接耗时较长的场景。
  • 响应时间加权(Weighted Response Time):根据实例的响应时间来分配权重,响应时间越短的实例被选中的概率越大,适用于处理响应速度较快的服务。

💧选择合适的负载均衡算法取决于实际业务场景和系统需求。Ribbon提供了多种内置算法,同时也支持自定义算法来满足特定的负载均衡需求。

💧为了演示Ribbon负载均衡算法的效果,我们将使用加权随机算法。我们需要自定义一个IRule,并在配置中指定使用这个自定义的规则。

💧创建一个自定义的IRule实现:

importcom.netflix.client.config.IClientConfig;importcom.netflix.loadbalancer.BaseLoadBalancer;importcom.netflix.loadbalancer.ILoadBalancer;importcom.netflix.loadbalancer.IRule;importcom.netflix.loadbalancer.Server;importjava.util.List;importjava.util.Random;publicclassWeightedRandomRuleimplementsIRule{privateILoadBalancer lb;@OverridepublicvoidinitWithNiwsConfig(IClientConfig iClientConfig){// 初始化操作,此处不需要做任何处理}@OverridepublicServerchoose(Object o){List<Server> servers = lb.getAllServers();if(servers.isEmpty()){returnnull;}// 计算总的权重值int totalWeight = servers.stream().mapToInt(this::getWeight).sum();// 生成随机数并根据权重进行选择int randomWeight =newRandom().nextInt(totalWeight);int currentWeight =0;for(Server server : servers){
            currentWeight +=getWeight(server);if(currentWeight > randomWeight){return server;}}// 如果未选择到服务实例,返回nullreturnnull;}privateintgetWeight(Server server){// 这里可以根据实际情况从服务器的元数据中获取权重值return1;// 假设所有服务实例的权重均为1}@OverridepublicILoadBalancergetLoadBalancer(){return lb;}@OverridepublicvoidsetLoadBalancer(ILoadBalancer iLoadBalancer){this.lb = iLoadBalancer;}}

💧接下来,在配置类中使用这个自定义的规则:

@ConfigurationpublicclassRibbonConfig{@Bean@LoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}@BeanpublicIRuleribbonRule(){returnnewWeightedRandomRule();}}

💧**在上述代码中,我们自定义了一个

WeightedRandomRule

,它实现了加权随机算法。在配置类中,我们将这个规则定义为一个Bean,这样Ribbon就会使用我们自定义的算法来进行负载均衡。**


注意:上述示例代码为简化的演示版本,并未包含完整的异常处理和配置细节。在实际项目中,需要根据具体情况进行进一步完善。

在这里插入图片描述


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!


本文转载自: https://blog.csdn.net/qq_58035032/article/details/131891790
版权归原作者 微风撞见云 所有, 如有侵权,请联系我们删除。

“【Ribbon负载均衡调用】—— 每天一点小知识”的评论:

还没有评论