Ribbon定义
Ribbon是Spring Cloud Netiflix组件中一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。
Ribbon作用
Ribbon主要作用是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。
当多个服务提供者时,Ribbon 可以根据负载均衡的算法,比如:如简单轮询、随机连接等,自动地选择需要调用的服务地址。
Ribbon使用
知道了Ribbon的作用后,我们通过一个简单的示例来学习下Ribbon的使用。
1.引入Ribbon依赖
在 Spring Cloud工程中引用Ribbon非常简单,只需要在pom.xml中添加以下依赖。
如下所示:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
2.增加启动类
@SpringBootApplication @EnableEurekaClient public class RibbonDemoApplication { public static void main(String[] args) { SpringApplication.run(RibbonDemoApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } }
Ribbon客户端本身作为一个Eureka客户端存在,因此需要@EnableEurekaClient注解,并且向注册中心注册服务。
Ribbon通过RestTemplate类调用远程服务器,因此我们还需要注入RestTemplate类。
@LoadBalanced
只有增加@LoadBalanced注解,Ribbon才会启用负载均衡。
3.配置文件
server.port=8090 # 当前应用名称 spring.application.name=ribbon-client # eureka注册中心地址 eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/
作为一个Eureka客户端,我们仍然需要如下的配置信息,以保证注册服务到注册中心服务器上。
4.创建Rest请求示例
我们打算对外暴露一个接口,接收来自浏览器的请求,然后将这些请求以负载均衡的方式发送给真正的服务端。
@RestController public class RibbonTestController { private static String EUREKA_URL = "http://eureka-client/getHello"; @Autowired private RestTemplate restTemplate; @GetMapping("/getRibbonHello") public String getRibbonHello(HttpServletRequest request){ String result = restTemplate.getForObject(EUREKA_URL, String.class); System.out.println(result); return result; } }
如此我们就准备好了一个最简单的Ribbon使用案例。
Ribbon负载均衡原理
首先我们要明确负载均衡分为:集中式负载均衡和进程内负载均衡。
1.服务端的负载均衡
例如,硬件的有:F5,软件的有典型代表:Nginx,都是先发送请求,然后在服务器端再进行负载均衡算法分配。
2.客户端的负载均衡
负载均衡逻辑集成到消费方客户端,消费方从服务注册中心获知那些地址可用,然后自己再从这些地址中选择一个合适的服务器。
例如spring cloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,在客户端就进行负载均衡算法分配。
如下图所示:
总共有七种负载均衡策略可供选择,可以根据自己的业务场景进行选择:
- 轮询RoundRobinRule:这也是Ribbon默认的策略;
- 随机RandomRule;
- 响应时间权重ResponseTimeWeightedRule:为每个服务设置权重,响应时间越短,权重越大;
- 最少并发数策略BestAvailableRule;
- 重试策略RetryRule;
- 可用性敏感策略AvailabilityFilteringRule;
- 区域性敏感策略ZoneAvoidanceRule;
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》