spring cloud(3):ribbon
ribbon是什么?
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。
客户端负载均衡与服务端负载均衡?
服务端的负载均衡是一个url先经过一个代理服务器(这里是nginx),然后通过这个代理服务器通过算法(轮询,随机,权重等等..)反向代理你的服务,来完成负载均衡。
而客户端的负载均衡则是一个请求在客户端的时候已经声明了要调用哪个服务,然后通过具体的负载均衡算法来完成负载均衡。
java中如何使用ribbon?
首先,我们还是要引入依赖,但是,eureka已经把ribbon集成到他的依赖里面去了,所以这里不需要再引用ribbon的依赖,如图:
要使用ribbon,只需要一个注解@LoadBalanced:
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
我们这里现在启动了eureka集群(3个eureka) 和Power集群(2个power) 和一个服务调用者(User)
我们能看见 微服务名:SERVER-POWER 下面有2个微服务(power-1,power2),现在我们来通过微服务名调用这个服务
这是我们的user项目的调用代码:
package com.luban.controller;
import com.luban.util.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
private static final String POWER_URL="http://SERVER-POWER";
@RequestMapping("/getUser.do")
public R getUser(){
HashMap map = new HashMap();
map.put("key","user数据");
return R.success("返回成功",map);
}
@RequestMapping("/getPower.do")
public R getPower(){
Map map=new HashMap();
map.put("key1","value1");
R.success().set("key1","value1").set("key1","value1");
return R.success("操作成功",restTemplate.getForObject(POWER_URL+"/getPower.do",Object.class));
}
}
结果如下:
他默认的负载均衡是轮询策略。
核心组件IRule
IRule是什么? 它是Ribbon对于负载均衡策略实现的接口, 怎么理解这句话? 说白了就是你实现这个接口,就能自定义负载均衡策略, 自定义我们待会儿来讲, 我们先来看看他有哪些默认的实现
- RoundRobinRule:轮询
- RandomRule:随机
- AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器 跳闸状态的服务,还有并发的连接数量超过阈的服务,然后对于剩余的服务列表按照轮询策略进行选取
- WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够后,会切换WeightedResponseTimeRule