客户端负载均衡—Ribbon初探

一、什么是Ribbon

  Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用

二、为服务消费者整合Ribbon

  1、引入依赖:spring-cloud-starter-ribbon(spring-cloud-starter-eureka中已包含了ribbon)

  2、为RestTemplate添加@LoadBalanced注解

  3、将请求地址修改为虚拟主机名,Ribbon会自动把虚拟主机名映射称网络地址(默认情况下,虚拟主机名和服务名称是一样的,也可以通过配置属性eureka.instance.virtual-host-name或者eureka.instance.secure-virtual-host-name。虚拟主机名不能包含下划线)

#在RestTemplate上加上@LoadBalanced注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
  return new RestTemplate();
}

//修改controller内的方法,将请求地址从url改为微服务的虚拟名
@GetMapping("/user/{id}")
  public User findById(@PathVariable Long id) {
    //VIP:virtual IP
    return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);
  }
使用Ribbon

三、利用java代码自定义Ribbon配置

IClientConfig:Ribbon 的客户端配置,默认采用 com.netflix.client.config.DefaultClientConfigImpl 实现。
IRule:Ribbon 的负载均衡策略,默认采用 com.netflix.loadbalancer.ZoneAvoidanceRule 实现,该策略能够在多区域环境下选择最佳区域的实例进行访问
IPing:Ribbon 的实例检查策略,默认采用 com.netflix.loadbalancer.NoOpPing 实现,该检查策略是一个特殊的实现,实际上他并不会检查实例是否可用,而是始终返回 true ,默认认为所有服务实例都是可以使用
ServerList<Server>:服务实例清单的维护机制,默认采用 com.netflix.loadbalancer.ConfigurationBasedServerList 实现。
ServerListFilter<Server>:服务实例清单过滤机制,默认采用 org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter 实现,该策略能够优先过滤出与请求调用方处理同区域的服务实现
ILoadBalancer:负载均衡器,默认采用 com.netflix.loadbalancer.ZoneAwareLoadBalancer 实现,他具备了区域感知的能力

//该类为Ribbon配置类
//该类不应该在主应用程序上下文的@ComponentScan中,否则该类中的配置信息就会被所有的@RibbonClient共享
@Configuration
public class RibbonConfiguration{
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

//空类,添加@Configuration和@RibbonClient注解
@Configuration
@RibbonClient(name = "microservice-provider-user",configuration = "RibbonConfiguration.class")
public class TestConfiguration{
}
Ribbon自定义配置

四、使用属性自定义Ribbon配置

<clientName>.ribbon.为前缀:

#预加载配置,默认为懒加载
ribbon:
  eager-load:
    enabled: true
    clients: mima-cloud-producer,mima-cloud-producer2
#这里使用服务提供者的instanceName
mima-cloud-producer:
  ribbon:
    # 代表Ribbon使用的负载均衡策略
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    # 每台服务器最多重试次数,但是首次调用不包括在内, Max number of retries on the same server (excluding the first try)
    MaxAutoRetries: 1
    # 最多重试多少台服务器,Max number of next servers to retry (excluding the first server)
    MaxAutoRetriesNextServer: 1
    # 无论是请求超时或者socket read timeout都进行重试,Whether all operations can be retried for this client
    OkToRetryOnAllOperations: true
    # Interval to refresh the server list from the source
    ServerListRefreshInterval: 2000
    # Connect timeout used by Apache HttpClient
    ConnectTimeout: 3000
    # Read timeout used by Apache HttpClient
    ReadTimeout: 3000
mima-cloud-producer2:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
Ribbon自定义配置

microservice-provider-user:
  ribbon:
    NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule

五、脱离Eureka使用Ribbon

  由于脱离了Eureka,微服务不再缓存服务列表,所以需要在配置文件中配置可访问的服务列表

server:
    port: 8010
spring:
    application:
        name:microservice-consumer-movie
microservice-provider-user;
    ribbon:
        listOfServers: localhost:8000,localhost:8001
配置

六、相关中间件

Nacos Discovery内部默认集成了Ribbon,集成的方式跟Eureka几乎一致

原文地址:https://www.cnblogs.com/yanghanwen/p/12093677.html