一、Ribbon在微服务中的作用
1.什么是Ribbon
1.Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它是基于Netflix Ribbon实现的
2.它不像Spring Cloud服务注册中心、配置中心、API网关那样独立部署,但是它几乎存在于每一个Spring Cloud微服务中。包括Feign提供的声明式服务调用也是基于Ribbon实现的。
3.Ribbon提供了多种负载均衡算法,例如:轮询、随机等等。甚至包含自定义的负载均衡算法。
2.Ribbon解决了什么问题
它解决并提供了微服务的负载均衡问题
二、集中式与进程内负载均衡的区别
1.负载均衡解决方案的分类
目前业界主流的负载均衡方案可分为两类:
-
集中式负载均衡:即在consumer和provider中间使用独立的负载均衡设施(可以是硬件,如F5,也可以是软件,如:Nginx),由该设施把访问请求通过某种策略转发到provider
-
进程内负载均衡:将负载均衡的逻辑集成到consumer,consumer从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择一个合适的provider
Ribbon属于后者,它只是一个类库,集成在consumer中,consumer通过它来获得合适的provider地址。
2.两种负载均衡方式架构图
三、Ribbon入门案例
Ribbon对于集群的服务采用的负载均衡的策略默认是轮询
1.Consumer
@Service
public class UserService {
@Autowired
private LoadBalancerClient loadBalancerClient; //ribbon:负载均衡器
public List<User> getUsers(){
//选择调用的服务的名称
//ServiceInstance:封装了服务的基本信息,如:ip、端口号
ServiceInstance si = loadBalancerClient.choose("eureka-provider");
//拼接访问服务的url
StringBuffer sb = new StringBuffer();
//http://localhost:9090/user
sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/user");
System.out.println(sb.toString());
//SpringMVC RestTemplate
RestTemplate restTemplate = new RestTemplate();
ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {
};
//ResponseEntity:封装了返回值信息
ResponseEntity<List<User>> entity = restTemplate.exchange(sb.toString(), HttpMethod.GET, null, type);
return entity.getBody();
}
}
复制代码
2.Consumer的配置文件
spring.applic