赞
踩
这篇文章,主要介绍微服务组件之Ribbon负载均衡器及其使用。
目录
上一篇文章介绍了OpenFeign组件,这个组件主要是用于实现微服务之间的调用,既然微服务之间可以调用了,那么问题又来了,假设在某个时间里面,微服务A的访问请求非常多,导致微服务A无法处理过来,从而导致微服务A宕机,对于这种情况,我们应该专门避免呢???
对于上面这种情况,我们可以这样解决,既然一台微服务A无法处理那么多的请求,那如果是多台微服务A应用程序呢,这样子是不是就可以将请求平均分配到不同的微服务A机器上面,从而减少某一台微服务A的请求处理量,避免服务宕机情况的出现,这里介绍的思想就是:负载均衡。
负载均衡:将HTTP请求按照某个策略,将请求分发到不同的机器上面执行,从而实现服务的高可用,这个过程大致就是负载均衡的思想,如下图所示。
负载均衡如果按照软件、硬件来划分,则可以分为下面两种:
根据负载均衡分发请求的不同位置,又可以将负载均衡器分为服务端负载均衡、客户端负载均衡,如下:
这篇文章要介绍Ribbon就是典型的客户端负载均衡器,下面介绍Ribbon实现客户端负载均衡的大致思想。
在微服务的环境下,服务之间的调用都是通过Eureka注册中心(或者其他的注册中心)来获取到需要调用的服务地址,既然可以获取到服务地址,那是不是就可以在调用微服务之前,通过编写一个算法,选择当前HTTP请求应该选择哪一个服务地址进行调用呢???Ribbon就是实现了这一个算法,这个算法将他称作是:【负载均衡策略】,一个【负载均衡策略】其实就相当于是一种选择调用地址的算法。
在Ribbon组件中,默认采用的是【轮询】的负载均衡策略,也就是说,将可用服务地址按照顺序一次循环调用,Ribbon中提供了很多中负载均衡策略,后面会具体介绍各种负载均衡策略。
Ribbon负载均衡大致思想如下图所示:
- <dependencies>
- <!-- 引入 Web 工程 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <!-- 引入 eureka 服务端依赖 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <!-- 引入 Ribbon 依赖 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
- </dependency>
- </dependencies>
- package com.gitcode.ribbon.config;
-
- import org.springframework.cloud.client.loadbalancer.LoadBalanced;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.client.RestTemplate;
-
- /**
- * @version 1.0.0
- * @Date: 2023/1/11 21:16
- * @Copyright (C) ZhuYouBin
- * @Description:
- */
- @Configuration
- public class RibbonConfig {
-
- @Bean
- @LoadBalanced // 开启 Ribbon 实现负载均衡
- public RestTemplate restTemplate() {
- return new RestTemplate();
- }
-
- }
- package com.gitcode.ribbon.controller;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.client.RestTemplate;
-
- import java.util.Map;
-
- /**
- * @version 1.0.0
- * @Date: 2023/1/11 21:19
- * @Copyright (C) ZhuYouBin
- * @Description:
- */
- @RestController
- @RequestMapping("/api/ribbon")
- public class DemoController {
-
- @Autowired
- private RestTemplate restTemplate;
-
- @GetMapping("/getUserInfo")
- public Map<String, String> getUserInfoByRestTemplate(String username) {
- // 获取微服务的虚拟地址
- String url = "http://service-provider/api/service/provider/getUserInfo";
- // 通过 RestTemplate 调用接口
- return restTemplate.postForObject(url, null, Map.class, username);
- }
-
- }
以上日志说明,Ribbon负载均衡默认采用的【轮询】方式,也就是从第一台服务开始一次处理请求,到第三台服务处理结束了,又会回到第一台服务继续这个循环。
Ribbon提供了多种负载均衡的策略,Ribbon将策略抽象为一个【IRule】接口,这个【IRule】接口的实现类就定义了各种负载均衡器的算法策略,常见的策略有如下这些:
要使用Ribbon提供的其他负载均衡策略,我们只需要手动注入一个【IRule】对象即可。代码如下所示:
- /**
- * 使用Ribbon提供的其他负载均衡策略
- */
- @Bean
- public IRule ribbonRule() {
- return new RandomRule(); // 这里采用随机策略
- }
上面代码会对所有的微服务都采用【随机策略】,如果你想根据不同的微服务来选择不同的负载均衡策略,那么可以在【application.yml】配置文件中单独设置某个微服务的负载均衡策略。
- # ribbon 配置
- RIBBON-PROVIDER: # 这里就是单独给 RIBBON-PROVIDER 微服务设置 Ribbon 相关配置属性
- ribbon:
- # 指定 Ribbon 的负载均衡策略
- NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule # 这里采用轮询策略
如果Ribbon提供的那几种负载均衡策略都不满足你的需求,那么我们可以自定义负载均衡策略,只需要实现【IRule】接口,重写其中的方法完成负载均衡算法即可。
但是如果直接实现【IRule】接口,那就需要重写接口中的所有方法,这样太麻烦了,所以Ribbon给我们提供了一个抽象类【AbstractLoadBalancerRule 】,我们继承这个类,只需要重写【initWithNiwsConfig()】方法和【choose()】方法即可完成自定义负载均衡策略。
- package com.gitcode.ribbon.config;
-
- import com.netflix.client.config.IClientConfig;
- import com.netflix.loadbalancer.AbstractLoadBalancerRule;
- import com.netflix.loadbalancer.ILoadBalancer;
- import com.netflix.loadbalancer.Server;
-
- import java.util.List;
- import java.util.Random;
-
- /**
- * @version 1.0.0
- * @Date: 2023/1/11 22:36
- * @Copyright (C) ZhuYouBin
- * @Description:
- */
- public class CustomRibbonRule extends AbstractLoadBalancerRule {
- @Override
- public void initWithNiwsConfig(IClientConfig iClientConfig) {
- }
-
- @Override
- public Server choose(Object o) {
- // 从父类中获取负载均衡器对象
- ILoadBalancer lb = getLoadBalancer();
- // 获取所有可以服务
- List<Server> reachableServers = lb.getReachableServers();
- // 随机选择一个服务地址
- Random random = new Random();
- int index = random.nextInt(reachableServers.size() - 1);
- // 返回这个选择服务地址
- return reachableServers.get(index);
- }
- }
- /**
- * 使用自定义的负载均衡策略
- */
- @Bean
- public IRule ribbonRule() {
- return new CustomRibbonRule(); // 自定义负载均衡策略
- }
到此,微服务组件Ribbon介绍完啦。
综上,这篇文章结束了,主要介绍微服务组件之Ribbon负载均衡器及其使用【源代码】。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。