Ribbon是什么
- spring cloud Ribbon是基于Netfix Ribbon实现的一套客户端负载均衡的工具
- Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。
- Ribbon是Netflix发布的开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中Load Balancer后面的所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
如图:
Ribbon能干嘛
- LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。
- 负载均衡就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。
- 负载均衡简单分类:
- 集中式LB
- 即在服务的消费方和提供方之间使用独立的LB设备,如Nginx,由该设施负责把访问请求通过某种策略发至服务的提供方
- 进程式LB
- 将LB逻辑集成到消费方,消费方从服务注册中心获取有哪些地址可用,然后自己再从这些地址中选出合适的服务器。
- Ribbon就属于进程式LB,它只是一个类库,集成于消费方进程,消费方通过它来获取服务提供方的地址。
- 集中式LB
使用 RestTemplate 与整合 Ribbon
在前面介绍 Eureka 时,我们已经使用过 RestTemplate 了。
springcloud(一)-环境搭建及多模块使用RestTemplate实现api调用
两者结合使用也非常简单。
首先我们创建一个消费者模块springcloud-consumer-user-80
导入ribbon依赖,
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
RestTemplate 负载均衡
编写配置类config:
@Configuration
public class ConfigBean {
//spring框架提供的RestTemplate类可用于在应用中调用rest服务,
// 它简化了与http服务的通信方式,统一了RESTful的标准,
// 封装了http链接, 我们只需要传入url及返回值类型即可
@Bean
@LoadBalanced //配置负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
使用添加@LoadBalanced注解后的RestTemplate调用服务提供者的接口时,可以使用虚拟IP替代真实IP地址
。所谓的虚拟IP就是服务提供者在application.properties或yml文件中配置的spring.application.name
属性的值
@RestController
public class UserConsumerController {
/*
* 使用restTemplate访问restful接口非常的简单粗暴无脑。
* (url, requestMap, ResponseBean.class)这三个参数分别代表
* 请求地址、请求参数、HTTP响应转换被转换成的对象类型。
*/
@Autowired
private RestTemplate restTemplate;//提供多种便捷访问远程http服务的方法,简单的restful服务模板
//ribbon 我们这里的地址应该式一个变量,通过服务名来访问
// private static final String REST_URL_PREFIX="http://localhost:8001";
private static final String REST_URL_PREFIX="http://springcloud-provder-user";
@RequestMapping("/consumer/user/get/{id}")
public User get(@PathVariable("id")Long id){
return restTemplate.getForObject(REST_URL_PREFIX+"/user/get/"+id, User.class);//注意get还是post
}
@RequestMapping("/consumer/user/add")
public int addUser(User user){
return restTemplate.postForObject(REST_URL_PREFIX+"/user/add",user,int.class);
}
@RequestMapping("/consumer/user/list"