# 快速搭建微服务-服务调用

Spring Cloud体系中服务间的调用常见的有Feign和Ribbon两种方式,其中Feign默认集成了Ribbon。Ribbon采用注入RestTemplate实例,通过全局的RestTemplate调用其它可以被发现的服务,而Feign则使用类似于Controller的代码风格配合@FeignClient注解实现服务间接口的调用。由于注入RestTemplate的方式更符合Spring的编程风格,这里仅介绍基于Ribbon方式的服务调用。

# Ribbon配置

# 向Spring容器中注入RestTemplate实例

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}
1
2
3
4
5

# 负载均衡策略

@LoadBalanced注解用于开启客户端负载均衡,Ribbon默认的负载均衡策略是轮询选择。Ribbon提供了如下的负载均衡策略:

  • AvailabilityFilteringRule:过滤掉那些一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态。

  • RandomRule:随机选择一个Server。

  • BestAvailableRule:选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过。

  • RoundRobinRule:轮询选择, 轮询index,选择index对应位置的Server。

  • WeightedResponseTimeRule:根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低。

  • RetryRule:对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server。

  • ZoneAvoidanceRule:复合判断Server所在区域的性能和Server的可用性选择Server。

  • ResponseTimeWeightedRule:作用同WeightedResponseTimeRule,二者作用是一样的,ResponseTimeWeightedRule后来改名为WeightedResponseTimeRule。

# 选择负载均衡策略

  1. 注入负载均衡策略IRule实例

    @Bean
    public IRule ribbonRule() {
        return new RandomRule();
    }
    
    1
    2
    3
    4

    这里注入的是RandomRule策略,可以按需注入其它策略。

  2. 添加ribbon配置信息

    [serviceId].ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
    
    1

    配置key中[serviceId]对应服务提供方注册到配置中心的的ServiceId,配置value按需填写策略类的ClassName。

  3. 使用负载均衡策略

    @RestController
    public class ResourceController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @Autowired
        private LoadBalancerClient loadBalancerClient;
    
        @GetMapping("/resource")
        public String getResource() {
            this.loadBalancerClient.choose("[serviceId]");
            return restTemplate.getForObject("http://[serviceId]/get", String.class);
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    [serviceId]填写实际的服务名。

# 饥饿加载

服务调用方采用饥饿加载的方式可以有效解决首次调用服务提供方时大概率出现的超时现象。

在调用方的配置文件中加入如下配置:

ribbon:
  eager-load:
    enabled: true
    clients: serivce-provider1, service-provider2
1
2
3
4

其中,service-provider1和service-provider2是服务提供方的服务名。