五、Ribbon实现客户端的负载均衡

    前言:消费者获取出多个服务提供者的地址后,按一定的规则请求这多个相同服务中的一个,实现负载均衡。Ribbon的这种负载均衡可理解为针对消费者请求时做的。

1、Ribbon简介

    SpringCloud中,当Ribbon和Eureka配合使用,Ribbon可自动从Eureka Server中获取供给方地址列表,基于负载均衡算法(也可以自定义算法)请求其中一个服务提供者实例。如图:

Ribbon

2、为服务消费者整合Ribbon

2.1、pom文件

    (注意:spring-cloud-starter-eureka中是包含有ribbon依赖的,所以有前者就不需要导后者了)

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

2.2、为RestTemplate对象添加@LoadBalanced注解

@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return new RestTemplate();
}

    @LoadBalanced注解可以为RestTemplate整合Ribbon,使其具备负载均衡能力。

2.3、具体负载均衡代码

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    public void logUserInstance(){
        ServiceInstance serviceInstance = loadBalancerClient.choose("microservice-provider-        user");
        sytem.out.println(serviceInstance.getServiceId());
        sytem.out.println(serviceInstance.getHost());
        sytem.out.println(serviceInstance.getPort());
    }

    microservice-provider-user 是用户微服务的虚拟主机名。当Ribbon和Eureka配合使用时,会自动将虚拟主机名映射成微服务的网络地址。

  • 默认情况下,虚拟主机名和服务名称是一致的。当然,也可以使用配置属性eureka.instance.virtual-host-name指定虚拟主机名,虚拟主机名不能包含“_”之类的字符,否则会异常。
  • 不能将restTemplate.getForObject(...) 和 loadBalancerClient.choose(...) 写在同一方法里,两者之间会有冲突——因为此时代码中的restTemplate实际上是一个Ribbon客户端,本身已经包含了“choose”的行为。

3、自定义Ribbon配置

    很多场景下,都要根据需求自定义Ribbon配置。比如修改负载均衡规则等。Spring Cloud Camden允许使用Java代码或属性自定义Ribbon的配置。两种方式等价。

3.1、Java代码自定义Ribbon的配置

3.2、使用属性自定义Ribbon的配置

4、脱离Eureka使用Ribbon

脱离Eureka使用Ribbon

    没有Eureka,所有不能从第三方获取服务提供者的地址等信息。这时候就把地址配置在消费者项目里,给Ribbon随机就可以了。

4.1、pom配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

 4.2、启动类上去掉@EnableDiscoveryClient注解

    该注解是属于Eureka的

4.3、yml配置文件

microservice-provider-user:
    ribbon:
        listOfServers: localhost:8000,localhost:8001

猜你喜欢

转载自blog.csdn.net/sky_helloword/article/details/85112694