一、什么是Ribbon?

Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说,Ribbonn是Netflix的开源项目,主要功能 是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。就是在配置文件中列出 Loa Balancer后面所有机器,Ribbon会自动帮助你基于某种规则 (如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

二、Ribbon的作用

1、负载均衡:
将用户的请求平摊的分配到多个服务上,从而达到HA(高可用),常见的负载均衡有 Nginx,LVS,硬件 F5等。

2、Ribbon 本地负载均衡客户端 VS Nginx 服务端负载均衡

  • Nginx 是服务器 负载均衡,客户端所有请求都会交给 nginx,然后由 nginx实现请求转发。即负载均衡是由服务端实现的。
  • Ribbon 是本地负载均衡,在微服务调用接口时,在注册中心上获取注册信息服务列表 之后缓存在JVM本地,从而实现本地RPC远程服务调用技术。

三、RestTemplate

1、什么是 RestTemplate?

RestTemplate是Spring提供的一个访问Http服务的客户端类。通过RestTemplate可以实现微服务之间的调用。
示例代码

@RestController
@Slf4j
public class OrderController {
    private static final String PAYMENT_URL = "http://localhost:8001";
    @GetMapping(value="/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
    return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
    }
}

四、RestTemplate 使用

  1. getForObject 返回json
  2. getForEntity 返回ResponseEnity对象,包括响应头,响应体等信息。
  3. postForObject,与 get 方法一样,不同的是传进去的参数是对象
  4. postForEntity
  5. GET 请求方法
  6. POST请求方法

五、Ribbon使用

1、引入依赖

由于spring-cloud-starter-netflix-eureka-client 已经引入了 Ribbon-Balance的依赖,所以不需要添加依赖。

spring cloud负载均衡组件_java

2、配置文件yml

server:
  port: 80

spring:
  application:
    name: cloud-order-server

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true
    register-with-eureka: true
    fetch-registry: true
    service-url:
      #defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版

3、添加启动类

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

4、配置RestTemplate

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced //使用LoadBalanced注解赋予RestTemplate负载均衡能力
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

5、业务

@GetMapping(value="/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
    return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}

6、结果

由于默认为轮询策略,所以每次刷新请求为8001,8002轮询

spring cloud负载均衡组件_spring_02


spring cloud负载均衡组件_java_03

六、负载均衡规则替换

1、Ribbon 的几种负载均衡算法

  • RoundRobinRule :轮询策略。Ribbon 默认采用的策略。若经过一轮轮询没有找到可用的 provider,其最多轮询 10 轮。若最终还没有找到,则返回 null。(默认)
  • RandomRule : 随机策略,从所有可用的 provider 中随机选择一个。
  • RetryRule : 重试策略。先按照 RoundRobinRule 策略获取 provider,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。

2、添加规则类

这个自定义配置类不能放在 @ComponentScan 所扫描的当前包下以及子包下,否则自定义的配置类就会被所有的 Ribbon 客户端所共享,达不到特殊化定制的目的了。

spring cloud负载均衡组件_mysql_04


spring cloud负载均衡组件_分布式_05

@Configuration
public class MyRule {
    @Bean
    public IRule myselfRule(){
        return new RandomRule();//改为随机
    }
}

3、主启动类添加 @RibbonClient

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PROVIDER-SERVICE", configuration = MyRule.class)
public class OrderMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class, args);
    }
}

4、测试

多次刷新,8001,8002随机出现 ,负载规则就更改为随机了。