Ribbon基础知识以及相关配置

文章目录

  • Ribbon
    • 一、Ribbon概述
      • 1、什么是Ribbon
      • 2、Ribbon 的主要作用
        • (1)服务调用
        • (2)负载均衡
    • 二、服务调用 Ribbon
      • 1、负载均衡描述
        • (1)什么是负载均衡
        • (2)客户端负载均衡与服务端负载均衡
      • 2、基于Ribbon实现负载均衡
        • (1)搭建多服务实例
        • (2)负载均衡策略
        • (3)自定义负载均衡策略
    • 三、Ribbon中负载均衡的源码解析
      • 1、Ribbon中的关键组件
      • 2、自动装配
      • 3、原理流程

Ribbon

一、Ribbon概述

1、什么是Ribbon

Ribbon 是 Netflix 发布的一个负载均衡器,有助于控制HTTP和TCP客户端行为在 SpringCloud 中,Nacos一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Nacos中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。

在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务

2、Ribbon 的主要作用

(1)服务调用

基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助RestTemplate 最终进行调用

(2)负载均衡

当有多个服务提供者时,Ribbon 可以根据负载均衡的算法自动的选择需要调用的服务地址

二、服务调用 Ribbon

1、负载均衡描述

(1)什么是负载均衡

在搭建网站时,如果单节点的 web服务性能和可靠性都无法达到要求;或者是在使用外网服务时,经常担心被人攻破,一不小心就会有打开外网端口的情况,通常这个时候加入负载均衡就能有效解决服务问题。
负载均衡是一种基础的网络服务,其原理是通过运行在前面的负载均衡服务,按照指定的负载均衡算法,将流量分配到后端服务集群上,从而为系统提供并行扩展的能力。
负载均衡的应用场景包括流量包、转发规则以及后端服务,由于该服务有内外网个例、健康检查等功能,能够有效提供系统的安全性和可用性。

Ribbon基础知识以及相关配置_第1张图片

(2)客户端负载均衡与服务端负载均衡

服务端负载均衡
先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配

客户端负载均衡
客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配

2、基于Ribbon实现负载均衡

(1)搭建多服务实例

通过idea再启动一个 shop-product 微服务,设置其端口为8082

Ribbon基础知识以及相关配置_第2张图片

分别启动两次服务器验证效果,并查看两个控制台发现已轮询的方式调用了商品服务

(2)负载均衡策略

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 :可用过滤策略。过滤掉故障和请 求数超过阈值的服务实例,再从剩下的实力中轮询调用
  • **ZoneAvoidanceRule:**以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询

(3)自定义负载均衡策略

  • 方式1

定义一个新的IRule:(全局设置)

@Bean
public IRule randomRule(){
    return new RandomRule();
}
  • 方式2

在yml配置文件中配置:(局部设置)

#需要调用的微服务名称
service-product:
	ribbon:
		NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

三、Ribbon中负载均衡的源码解析

1、Ribbon中的关键组件

Ribbon基础知识以及相关配置_第3张图片

  • ServerList:可以响应客户端的特定服务的服务器列表。

  • ServerListFilter:可以动态获得的具有所需特征的候选服务器列表的过滤器。

  • ServerListUpdater:用于执行动态服务器列表更新。

  • Rule:负载均衡策略,用于确定从服务器列表返回哪个服务器。

  • Ping:客户端用于快速检查服务器当时是否处于活动状态。

  • LoadBalancer:负载均衡器,负责负载均衡调度的管理

2、自动装配

根据SpringBoot中的自动装配规则可以在 spring-cloud-netflix-ribbon-2.1.0.RELEASE.jar 中可以找到 spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframew ork.cloud.netflix.ribbon.RibbonAutoConfiguration

3、原理流程

Ribbon基础知识以及相关配置_第4张图片

源码跟踪:

(1)LoadBalancerInterceptor

可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:

  • request.getURI():获取请求uri
  • originalUri.getHost():获取uri路径的主机名,其实就是服务id,service-product
  • this.loadBalancer.execute():处理服务id,和用户请求。

这里的this.loadBalancer是LoadBalancerClient类型

(2)LoadBalancerClient

继续跟入execute方法:

  • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去nacos中获取服务列表并保存起来

  • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个

基本流程如下:

  • 拦截我们的RestTemplate请求http://service-product/product/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是service-product
  • DynamicServerListLoadBalancer根据service-product到nacos拉取服务列表
  • nacos返回列表,localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代service-product,得到http://localhost:8081/user/1,发起真实请求

你可能感兴趣的:(ribbon,spring,cloud,后端)