负载均衡之Ribbon认识与应用
是什么
在开始之前首先我们需要了解Ribbon是什么,Spring Cloud Ribbon是基于Netflix Ribbon实现的一套基于HTTP和TCP协议的客户端负载均衡的工具,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用;Ribbon客户端组件提供一系列的配置项如连接超时、重试等,通过在配置文件中列出Load Balancer所有的机器,Ribbon就能够自动基于某种规则(简单轮询、随机连接等)去连接这些机器,实现负载均衡;
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),Ribbon可以和其他所需的客户端结合使用,本次操作使用的是和Eureka结合使用;
能做什么
常见的负载均衡有软件Nginx,LVS,硬件F5等,负载均衡load Balance包括两种类型:
- 集中式LB
在服务的消费方和提供方使用独立的LB设施(该设置可以是硬件、也可以软件、如Nginx),由该设施把访问的请求通过某种策略转发至服务的提供方;
- 进程内LB
将LB的逻辑集成到消费方,消费方从服务注册中心获取有哪些地址可以使用,然后自己再从这些可用的地址中选择一个合适的服务器,Ribbon就属于是进程内LB,集成与消费方进程,消费方通过Ribbon获取到服务提供方的地址;
RestTemplate
什么是RestTemplate
RestTemplate是Spring提供的一个访问Http服务的客户端类,支持GET、POST、PUT、ELETE等常用方法,微服务间调用使用的是RestTemplate;
Ribbon就是使用的负载均衡+RestTenplate调用;
RestTemplate使用
类关系图示:
- GET-getForObject
底层方法:
应用操作:
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
- GET-getForEntity
底层方法:
应用:
@GetMapping("/consumer/payment/getForEntity/{id}")
public CommonResult<Payment> getPayment2(@PathVariable("id") Long id){
ResponseEntity<CommonResult> entity=
restTemplate.getForEntity(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
if(entity.getStatusCode().is2xxSuccessful()){
return entity.getBody();
}else {
return new CommonResult<>(444,"操作失败");
}
}
Ribbon模块说明
名称 | 说明 |
---|---|
ribbon-loadbalancer | 负载均衡模块,可以单独使用,也可以和其他模块一起使用 |
Ribbon | 其中包含内置的负载均衡算法 |
ribbon-eureka | 集成Eureka |
ribbon-core | 核心通用代码 |
ribbon-example | Ribbon使用的一些代码示例 |
ribbon-transport | 集成Netty,实现多协议支持 |
ribbon-httpclient | 基于Apache HttpClient的REST客户端,集成了负载均衡,可直接在项目中使用来调用接口 |
Ribbon工作步骤
- 选择EurekaServer,它优先选择在同一个区域内负载较少的server;
- 根据用户指定的策略,从server取到的服务注册列表中选择一个地址;
其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。