1. RestTemplate简介

RestTemplate是Spring框架提供的HTTP客户端,访问Restful API的请求对象,通过该对象可以方便的调用Http接口,并提供了多种便捷访问远程Http服务的方法,支持Get、Post、Put、Delete等请求,大大提高了客户端的开发效率。

二、Ribbon负载均衡

Ribbon 是 Netflix开源的基于HTTP和TCP等协议的负载均衡组件,Ribbon 可以用来做客户端负载均衡,调用注册中心的服务
什么是负载均衡:负载均衡就是A调用B服务,B有多种实现,或者说B做了集群处理,这时候A以何种方式调用B,ribbon可以选择以下的负载均衡策略.
(1)com.netflix.loadbalancer.RandomRule:从提供服务的实例中以随机的方式;
(2)com.netflix.loadbalancer.RoundRobinRule:以线性轮询的方式,就是维护一个计数器,从提供服务 的实例中按顺序选取,第一次选第一个,第二次选第二个,以此类推,到最后一个以后再从头来过;
(3)com.netflix.loadbalancer.RetryRule:在RoundRobinRule的基础上添加重试机制,即在指定的重试时间内,反复使用线性轮询策略来选择可用实例;
(4)com.netflix.loadbalancer.WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择;
(5)com.netflix.loadbalancer.BestAvailableRule:选择并发较小的实例;
(6)com.netflix.loadbalancer.AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例;
(7)com.netflix.loadbalancer.ZoneAwareLoadBalancer:采用双重过滤,同时过滤不是同一区域的实例和故障实例,选择并发较小的实例。

3、实现步骤

  • 在RestTemplate对象上加@LoadBalance 注解,提供负载均衡的支持

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

  • 负载均衡策略的配置user-service: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

    • 局部配置
  • 全局配置@Bean

    1. - public IRule rules(){
    2. - return new RoundRobinRule();}

    三、CAP定理

    CAP原则又称CAP定理,指的是 Consistency (一致性)、Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得

    四、Ribboin的重试机制

    Spring Cloud Ribbon 借助 Spring Retry模块可以实现请求的重试。

    1、开发步骤

  • 导入依赖

org.springframework.retry spring-retry
  • 配置重试输出日志

logging: level: org.springframework.retry.support: debug

  • 对重试机制进行配置

user-service: # 服务Id,针对某个服务的重试机制进行配置 ribbon: OkToRetryOnAllOperations: false # true 对所有请求 get ,post,put ,delete等都进行重试,false 只针对get请求重试。 MaxAutoRetriesNextServer: 1 # 切换实例次数 MaxAutoRetries: 1 #切换实例后重试次数

2、Ribbon配置

  • 请求超时时间
  • 请求处理超时时间

@Bean @LoadBalanced public RestTemplate restTemplate(){ SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory(); f.setReadTimeout(1000); //请求处理的超时时间(业务处理超时时间) f.setConnectTimeout(1000); // 请求的超时时间 RestTemplate restTemplate = new RestTemplate(f); return restTemplate; }