Spring Cloud(三)客户端负载均衡Ribbon的使用

Ribbon简介

Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。

在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。

什么是负载均衡?
在这里插入图片描述

负载均衡是一种基础的网络服务,其原理是通过运行在前面的负载均衡服务,按照指定的负载均衡算法,将流量分配到后端服务集群上,从而为系统提供并行扩展的能力;

负载均衡分为两种:

  1. 客户端负载均衡:客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这
    是客户端负载均衡;即在客户端就进行负载均衡算法分配
  2. 服务端负载均衡:先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择一个进行访
    问;即在服务器端再进行负载均衡算法分配

Ribbon为客户端负载均衡!

Eureka整合Ribbon

1:新建Spring Boot项目EurekaServer,添加依赖Eureka Server
2:启动类

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);
	}
}

3:配置文件application.yml

server:
  port: 8761                  
eureka:
  client:
    registerWithEureka: false    #是否将自己注册到Eureka Server,默认为True。由于当前应用就是Eureka Server,故false
    fetchRegistry: false         #是否从Eureka Server获取注册信息,默认True。因为这是一个单节点的Eureka Server,不需要同步其他的Eureka Server节点,故false
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

4:新建Spring Boot项目EurekaClient,添加依赖Eureka Client
5:启动类

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {
	
	public static void main(String[] args) {
		SpringApplication.run(EurekaClientApplication.class, args);
	}
}

6:配置文件application.yml

server:
  port: 8020
spring:
  application:
    name: EurekaClinet
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true 

7:新建Spring Boot项目EurekaRibbon,添加依赖Eureka Client、Ribbon、Web
在这里插入图片描述
添加Ribbon依赖时要注意Spring Boot版本!

8:启动类

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaRibbonApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaRibbonApplication.class, args);
	}
}

9:配置文件application.yml

server:
  port: 8010
spring:
  application:
    name: EurekaRabbon
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

10:MyController

@RestController
public class MyController {
	  private static final Logger LOGGER = LoggerFactory.getLogger(MyController.class);
	  @Autowired
	  private LoadBalancerClient loadBalancerClient;
	  @GetMapping("/log-user-instance")
	  public void logUserInstance() {
	    ServiceInstance serviceInstance = this.loadBalancerClient.choose("EurekaClinet");
	    // 打印当前选择的是哪个节点
	    MyController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());
	  }
}

11:运行测试
启动项目EurekaServer
启动项目EurekaClient(服务提供者1- - -以8020端口启动)
启动项目EurekaClient(服务提供者2- - -以8030端口启动)
启动项目EurekaRibbon(这里我省略了客户端,直接从负载均衡服务发起调用)
在这里插入图片描述
访问:http://localhost:8010/log-user-instance
EurekaRibbon控制台会打印:
在这里插入图片描述
可以看到请求是均匀分布到两个用户微服务节点上的,说明已经实现了负载均衡!

使用Java代码自定义Ribbon配置

Spring Cloud Camden允许使用Java代码或属性自定义Ribbon的配置,两种方式是等价的。
1:EurekaRibbon项目添加Ribbon配置类:RibbonConfiguration.java

@Configuration
public class RibbonConfiguration {
  @Bean
  public IRule ribbonRule() {
    // 负载均衡规则,改为随机
    return new RandomRule();
  }
}

2:EurekaRibbon项目空类TestConfiguration.java

/**
 * @RibbonClient的configuration属性指定自定义Ribbon配置
 * @author yangdong
 * @date 2021-01-20
 */
@Configuration
@RibbonClient(name = "EurekaClinet", configuration = RibbonConfiguration.class)
public class TestConfiguration {

}

3:结构目录:
在这里插入图片描述

4:运行测试
在这里插入图片描述
此时请求会随机分布到两个用户微服务节点上,说明已经实现了Ribbon的自定义配置。

Ribbon中的关键组件

在这里插入图片描述

  • ServerList:可以响应客户端的特定服务的服务器列表;
  • ServerListFilter:可以动态获得的具有所需特征的候选服务器列表的过滤器;
  • ServerListUpdater:用于执行动态服务器列表更新;
  • Rule:负载均衡策略,用于确定从服务器列表返回哪个服务器;
  • Ping:客户端用于快速检查服务器当时是否处于活动状态;
  • LoadBalancer:负载均衡器,负责负载均衡调度的管理;

它们分别对应的配置如下:
这里写图片描述

负载均衡策略

Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接口为com.netflix.loadbalancer.IRule,实现方式如下:
在这里插入图片描述

  • com.netflix.loadbalancer.RoundRobinRule:以轮询的方式进行负载均衡;
  • com.netflix.loadbalancer.RandomRule :随机策略;
  • com.netflix.loadbalancer.RetryRule :重试策略;
  • com.netflix.loadbalancer.WeightedResponseTimeRule:权重策略。会计算每个服务的权重,越高的被调用的可能性越大;
  • com.netflix.loadbalancer.BestAvailableRule:最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回;
  • com.netflix.loadbalancer.AvailabilityFilteringRule:可用过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实力中轮询调用;

从Spring Cloud Netflix1.2.0开始,Ribbon支持使用属性自定义Ribbon客户端,配置的前缀是< ClientName >.ribbon。在EurekaRibbonClient的application.yml配置文件中可以修改负载均衡策略;

application.yml添加:

##需要调用的微服务名称
EurekaClinet:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule 
    ##从Ribbon中的关键组件小节中,可以知道配置负载均衡策略的配置类是NFLoadBalancerRuleClassName

运行测试:
在这里插入图片描述
此时请求依然会随机分布到两个用户微服务节点上!

脱离Eureka使用Ribbon

1:新建Spring Boot项目RibbonWithOutEureka,添加依赖Ribbon、Web
2:启动类

@SpringBootApplication
public class RibbonWithOutEurekaApplication {

	public static void main(String[] args) {
		SpringApplication.run(RibbonWithOutEurekaApplication.class, args);
	}
}

3:MyController

@RestController
public class MyController {
	  private static final Logger LOGGER = LoggerFactory.getLogger(MyController.class);
	  @Autowired
	  private LoadBalancerClient loadBalancerClient;
	  @GetMapping("/log-user-instance")
	  public void logUserInstance() {
	    ServiceInstance serviceInstance = this.loadBalancerClient.choose("EurekaClinet");
	    // 打印当前选择的是哪个节点
	    MyController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());
	  }
}

4:application.yml

server:
  port: 8010
spring:
  application:
    name: RibbonWithOutEureka
EurekaClinet:
  ribbon:
    listOfServers: localhost:8020,localhost:8030

5:运行测试
启动项目RibbonWithOutEureka
访问:http://localhost:8010/log-user-instance
在这里插入图片描述
尽管此时没有注册到Eureka上,Ribbon仍可正常工作,请求依旧会均匀分摊到两个微服务节点上。

参考书籍:Spring Cloud与Docker微服务架构实战
以上只是学习所做的笔记,以供日后参考!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud负载均衡Ribbon是一种客户端负载均衡工具,它可以将请求分发到多个服务提供者实例中,从而提高系统的可用性和性能。Ribbon可以根据不同的负载均衡策略来选择服务提供者,例如轮询、随机、加权轮询等。同时,Ribbon还支持服务发现和服务注册,可以自动地从服务注册中心获取可用的服务实例列表。在Spring Cloud微服务架构中,Ribbon是非常重要的一部分,它可以帮助我们构建高可用、高性能的微服务系统。 ### 回答2: Spring Cloud 负载均衡Ribbon 是一个在客户端上运行的组件,可以在目标服务之间分配传入请求,以降低每个服务的负载。Ribbon 提供了多种负载均衡策略,包括简单轮询、随机、使用可用性统计数据等。 在实践中,Ribbon 可以轻松地集成到 Spring Cloud 应用中,通过配置文件中的特殊前缀“@LoadBalanced”来激活负载均衡服务。Spring Cloud 应用可以使用 Ribbon 来调用其他 REST 服务,而不用担心网络瓶颈和性能问题。 使用 Ribbon 进行负载均衡的最大好处是其透明的实现,使得客户端无需感知分配策略的变化。具体来说,当使用 Ribbon 负载均衡时,客户端可以轮流使用不同的目标服务,而无需编写特定的代码。Ribbon 为开发人员提供了一致的抽象层,以便简化分配策略和请求转发的实现。 Ribbon 作为 Spring Cloud 的核心组件之一,可以与其他重要的云基础设施服务进行集成,例如 Eureka 服务注册、Zookeeper 服务发现和 Consul 网格。通过这种方式,Ribbon 可以很容易地在多个云基础设施服务之间进行切换和部署。此外,Ribbon 还支持快速故障转移和自动重试机制,以确保应用程序可以在单个节点或整个系统故障时保持高可用性。 ### 回答3: Spring Cloud是一个基于Spring Boot实现的云原生应用开发框架,其中Spring Cloud Ribbon是其核心组件之一,提供了负载均衡的功能。 在传统的架构中,为了保证高可用性和可扩展性,常常需要多个相同的应用实例来处理用户请求,这时候就需要使用负载均衡来将请求均匀地分配到各个实例上。Spring Cloud Ribbon就是为了实现这个目的而设计的。 Ribbon可以将所有服务实例看作是一个整体,通过算法(一般为轮询算法)将请求分配给各个实例,从而实现负载均衡Ribbon内部维护了一个可用服务实例列表,当有服务实例启动或宕机时,它会实时更新列表,保证了服务的动态感知和适应。 Ribbon还提供了一些负载均衡策略,比如轮询(Round Robin)、随机(Random)、最少连接(Least Connection)等,可以根据具体业务来选择不同的策略。 在Spring Cloud中,使用Ribbon进行负载均衡非常简单,只需要加上@LoadBalanced注解,就可以实现自动的负载均衡。具体步骤如下: 1. 引入spring-cloud-starter-ribbon依赖 2. 创建RestTemplate实例,并添加@LoadBalanced注解 3. 像普通的RestTemplate一样使用其get、post等方法发起请求即可 最后,需要注意的是,Ribbon只是一种负载均衡的实现方式,而且还有其它的负载均衡框架可以选择,比如Nginx、HAProxy等。选择哪种负载均衡框架,需要根据具体业务需求、系统规模等综合考虑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值