springcloud 入门(2) 之Ribbon

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看详情

Ribbon简介

Ribbon在springcloud中担任着负载均衡的角色,它是一个基于HTTP和TCP的客户端负载均衡工具。springcloud Ribbon只是一个工具类框架,它可以独立部署但是也不需要独立部署,它几乎存在于所有springcloud 构建的微服务和基础设施中。

Ribbon使用

1、在消费者的restTemplate对象上加上 @LoadBalanced注解

@Configuration
public class RestConfig {

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

复制代码

2、创建多个生产者,我创建了三个生产者, 三个生产者的application.properties如下: provider1

server.port=9001

# 生产者应用名称 -
spring.application.name=PROVIDER
# 生产者实例名,同一个spring.application.name 名称唯一
eureka.instance.instance-id=provider1

eureka.client.register-with-eureka=true
eureka.client.service-url.defaultZone=http://localhost:8001/eureka

# 设置心跳的时间间隔(默认是30秒)
eureka.instance.lease-renewal-interval-in-seconds=5
# eureka server 最后一次收到心跳时等待的时间,超时将会移除client(默认是90秒)
eureka.instance.lease-expiration-duration-in-seconds=3
复制代码

provider2和provider3除了端口和实例id外其他都是一样的,就不粘贴了。

对外提供的接口如下: HelloProvider1.java

@RestController
@RequestMapping("/hi")
public class HelloProvider1 {

    @RequestMapping("/hello")
    public String hello(){
        return "hello,I am num one provider,nice to meet you!";
    }
}
复制代码

HelloProvider2.java

@RestController
@RequestMapping("/hi")
public class HelloProvider2 {

    @RequestMapping("/hello")
    public String hello(){
        return "hello,I am num two provider,nice to meet you!";
    }
}
复制代码

HelloProvider3.java

@RestController
@RequestMapping("/hi")
public class HelloProvider3 {

    @RequestMapping("/hello")
    public String hello(){
        return "hello,I am num three provider,nice to meet you!";
    }
}
复制代码

实例测试 1、分别启动eureka server 、三个生产者和消费者 eureka server启动后,看到如下界面证明三个生产者创建成功,会显示有三个生产者,左边红框内是生产者集群名称,消费者在通过IP和port调用生产者接口时都是通过集群名称调用的,右边红框是实例名称 在这里插入图片描述2、通过消费者调用生产者 消费者调用生产者代码

@RestController
@RequestMapping("/hi")
public class HelloConsumer {
    @Autowired
    private RestTemplate restTemplate;

    private final String providerUrl = "http://PROVIDER/hi/hello";

    @RequestMapping("/pro")
    public String provider(){
        return restTemplate.getForObject(providerUrl , String.class);
    }

    @RequestMapping("/hello")
    public String hello(){
        return "hello,I am consumer,nice to meet you!";
    }
}
复制代码

消费者启动成功后,通过浏览器访问http://localhost:7001/hi/pro,你会发现消费者调用生产者的顺序是按照你启动的顺序访问的,或者说是注册到eureka server的顺序访问 的,这是由于Ribbon默认采用的负载均衡策略是轮询。

Ribbon负载均衡策略配置

Ribbon 负载均衡有两种配置方式 1、全局配置 全局配置的话是将消费者调用的所有服务所采用的负载均衡算法都设置为相同的,全局只需写个配置类,在配置类中注入负载均衡策略,这个配置类要能被扫描到。我这里注入的负载策略是随机策略RandomRule

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestConfig {

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

    /**
     * 负载均衡算法
     * @return
     */
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}
复制代码

2、局部配置 局部配置是针对某个生产者服务设置负载策略的,分两步: 1、在启动类扫描不到的包中创建一个配置类,在配置类中注入负载策略

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;

/**
 * @author Aaron
 * @Date 2019/7/12 13:23
 **/
public class RibbonConfig {

    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}
复制代码

2、在启动类中加入@RibbonClient注解,该注解的class为外部配置类名称,name为生产者服务唯一的名称,例如我创建了三个生产者provider1、provider2、provider3,他们共同的应用名称为PROVIDER,这里的name就是PROVIDER

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "PROVIDER" , configuration = RibbonConfig.class)
public class ConsumerApplication {

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

}
复制代码

Ribbon 负载均衡策略

Ribbon 负责负载均衡就会存在负载均衡策略。Ribbon 默认有7种负载均衡策略,当然也可以实现com.netflix.loadbalancer.IRule接口,自定义负载均衡策略。

  • RoundRobinRule: 轮询策略,按顺序循环选择 server。默认策略
  • RandomRule: 随机策略,随机选择一个 server
  • RetryRule:重试策略,在一个配置时间段内当选择 server 不成功,则一直尝试选择一个何用的 server
  • BestAvailableRule:最低并发策略,逐个考察 server ,如果 server 断路器打开,则忽略,再选择其中并发连接最低的 server
  • AvailabilityFilteringRule:可用过滤策略,过滤掉一直连接失败并被标记为 circuit tripped 的 server , 过滤掉那些高并发连接的 server ( active connections 超过配置的阈值)
  • ResponseTimeWeightedRule: 响应时间加权策略,根据 server 的响应时间分配权重。响应时间越长,权重越低,被响应时间选择到的概率就越低;响应时间越短,权重越高,被选择到的概率就越高。这个策略很贴切,综合了各种因素,如:网络、磁盘、 IO 等,这些因素直接影响着响应时间
  • ZoneAvoidanceRule:区域权衡策略,综合判断 server 所在区域的性能和 server 的可用性轮询选择 ,并且判定一个 AWS Zone 的运行性能是否可用,剔除不可用的 Zone 中的所有 server

访问消费端http://localhost:7001/hi/pro,会看到随机访问生产者接口。 这样Ribbon就能简单使用了。

系列文章: springcloud 入门(1) eureka注册中心

GitHub地址: github.com/ArronSun/mi…

能力一般,水平有限,如有错误,请多指出。

猜你喜欢

转载自juejin.im/post/7127838159789883405