简介

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

ribbon 提供了负载均衡和重试功能, 它底层是使用 RestTemplate 进行 Rest api 调用

远程调用

之前有说过远程调用使用httpclient是万能的,但是其步骤很多代码繁琐冗余,所以Springboot提供了一个远程调用工具 RestTemplate

  • getForObject(url, 类型.class, 提交的数据)
  • postForObject(url,提交的数据,类型.class)

RestTemplate不仅封装简化了httpclient代码,还使其返回的json类型的数据可以转化为指定的对象类型

入门案例

  • 创建 RestTemplate 实例

RestTemplate 是用来调用其他微服务的工具类,封装了远程调用代码,提供了一组用于远程调用的模板方法,例如:getForObject()postForObject()

@SpringBootApplication
public class Sp06RibbonApplication {
    
    //创建 RestTemplate 实例,并存入 spring 容器
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

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

在controller中注入RestTemplate,再通过getForObject()postForObject()进行远程调用即可.

ribbon负载均衡及重试功能

对 RestTemplate 添加 @LoadBalanced 注解,增强其功能,实现负载均衡

1.从注册中心获得地址表
2.调用地址使用服务id: http://service/{1}
3.根据服务id,获得这个服务集群服务器地址列表
4.在集群地址列表中轮询调用

负载均衡

实现负载均衡共有三步:
1.添加 ribbon 依赖

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

2.@LoadBalanced 注解
RestTemplate 设置 @LoadBalanced
@LoadBalanced 负载均衡注解,会对 RestTemplate 实例进行封装,创建动态代理对象,并切入(AOP)负载均衡代码,把请求分发到集群中的服务器

@SpringBootApplication
public class Sp06RibbonApplication {
    
    @LoadBalanced //负载均衡注解
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

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

3.调用地址使用服务id
将访问路径中的路径地址都换为服务id--提供者yml中配置的application-name,也就是注册表中注册的id

重试

ribbon提供的一种容错方式
当调用后台服务出错(出异常,请求超时),可以自动进行重试调用

实现重试共两步:
1.添加 spring-retry 依赖
pom.xml 添加 spring-retry 依赖

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

2.配置重试参数

  • MaxAutoRetries - 单台服务器的重试次数
  • MaxAutoRetriesNextServer - 更换服务器的次数
  • OkToRetryOnAllOperations - 默认false,只对GET请求重试
spring:
  application:
    name: ribbon
    
server:
  port: 3001
  
eureka:
  client:    
    service-url:
      defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
      
ribbon:
  MaxAutoRetriesNextServer: 2
  MaxAutoRetries: 1
  OkToRetryOnAllOperations: false

Java代码中设置超时参数

  • ConnectTimeout - 建立连接超时
  • ReadTimeout - 等待响应超时
@SpringBootApplication
public class Sp06RibbonApplication {

    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate() {
        SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
        f.setConnectTimeout(1000);
        f.setReadTimeout(1000);
        return new RestTemplate(f);
        
        //RestTemplate 中默认的 Factory 实例中,两个超时属性默认是 -1,
        //未启用超时,也不会触发重试
        //return new RestTemplate();
    }

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

可以在service(服务的提供者)中的Controller添加延迟代码,以便测试 ribbon 的重试机制


迈克丝
85 声望5 粉丝

一步一步学技术,踏踏实实涨经验,兴趣广泛,广交好友,希望大家多多指正/批评.


下一篇 »
Hystrix

引用和评论

0 条评论