Ribbon服务调用

Posted by Beyonderwei on 2020-11-30
Words 722 and Reading Time 2 Minutes
Viewed Times

一、简介

SpringCloud Ribbon是基于Netflix Ribbon实现的一个客户端负载均衡和服务调用的客户端组件。使用上只需在配置文件中加入LoadBalancer,具有完善的连接、超时、重试等配置,也可基于Ribbon实现自定义的负载均衡算法。未来Spring将使用LoadBalancer来代替Ribbon.

Ribbon实际上就是RestTemplate接入了负载均衡。

github地址:https://github.com/Netflix/ribbon/wiki/Getting-Started

  • 集中式LB:

    在服务的调用方和提供方之间建立独立的LB设施,如Nginx,由该设施负责转发至服务的提供方。

  • 进程内LB:

    将LB集成到消费方,消费方从注册中心获知有哪些地址可用,然后依据一定算法选择一个调用。Ribbon就属于进程内LB。

二、Ribbon引入

在引入Eureka Client的时候,已经引入在eureka的内部引入了Ribbon。

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
1
2
3
4
5
6
7
<!-- Eureka已经引入了Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-client</artifactId>
<version>2.2.1.RELEASE</version>
<scope>compile</scope>
</dependency>

三、使用

只需要在RestTemplate的配置类中创建实例的方法上添加 @LoadBalanced 注解

1
2
3
4
5
6
7
8
9
10
@Configuration // 配置类注解
public class ApplicationContextConfig {

@Bean // 注入后,容器内就有RestTemplate 对象
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}

}

四、RestTemplate使用

  • restTemplate.postForObject

    直接返回响应体的Json数据

  • restTemplate.getForEntity

    返回响应实体 ResponseEntity 对象,可获得响应实体,响应码等信息。

    • entity.getStatusCode() 获取状态码
    • entity.getBody() 获取响应体
    • entity.getHeaders() 获取HTTP头信息

五、Ribbon自带的负载均衡规则

核心组件为 IRule。

  • com.netflix.loadbalancer.RoundRobinRule:

    轮询

  • com.netflix.loadbalancer.RandomRule:

    随机

  • com.netflix.loadbalancer.RetryRule:

    先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试

  • WeightedResponseTimeRule :

    对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择

  • BestAvailableRule :

    会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务

  • AvailabilityFilteringRule :

    先过滤掉故障实例,再选择并发较小的实例

  • ZoneAvoidanceRule:

    默认规则,复合判断server所在区域的性能和server的可用性选择服务器

六、负载均衡规则替换

  • 在项目启动类所在目录所在目录新建同级目录,如com.beyonderwei.ribbonrule,在改目录下新建MySelfRule规则类。(如果创建在@ComponentScan可以扫描到的地方会导致所有的项目均使用了该规则)

    1
    2
    3
    4
    5
    6
    7
    @Configuration
    public class MySelfRule {
    @Bean
    public IRule myRule(){
    return new RandomRule();//定义为随机
    }
    }
  • 主启动类添加 RibbonClient 注解

    1
    @RibbonClient(name = "注册的微服务的名字",configuration = MyRule.class)

本文为作者原创文章,未经作者允许不得转载。

...

...

00:00
00:00