浅练一下Ribbon的负载均衡

发布于:2023-01-17 ⋅ 阅读:(467) ⋅ 点赞:(0)

目录

零、Ribbon是什么

一、Nginx和Ribbon的负载均衡有何不同?

二、Ribbon入门小案例

1.Nacos已经集成了ribbon,所以依赖也不用引

2.这里做一个例子

 3.如法炮制,复制nacos_consumer工程,并改为Ribbon_consumer

 4.测试

5.负载均衡策略

6.ribbon策略的选择

7.ribbon的问题

、声明式服务调用Feign

总结

一年之计在于春,一日之计在于晨


零、Ribbon是什么

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将NetFlix的中间层服务连接在一起。Ribbon的客户端组件提供一系列完整的配置项如:连接超时、重试等等。简单的说,就是在配置文件中列出 LoadBalancer(简称LB:负载均衡)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等等)去连接这些机器。我们也很容易使用Ribbon实现自 定义的负载均衡算法!

一、Nginx和Ribbon的负载均衡有何不同?

通常说的负载均衡一般是nginx用于解决服务器而行使的负载均衡策略。而Ribbon的负载均衡则是指的是客户端的负载均衡策略,即一个Consumer 调用多个相同服务名的Provider,由 Consumer 选择调用哪个 Provider

二、Ribbon入门小案例

1.Nacos已经集成了ribbon,所以依赖也不用引

 之前创建的nacos_provider在这里需要复制两份以上,来模拟多个相同的Provider。具体的工程在我之前的文章中提到做法,可参考一下https://blog.csdn.net/Javashj/article/details/126320154https://blog.csdn.net/Javashj/article/details/126320154

2.这里做一个例子

  • 直接复制nacos_provider子Module到父工程下

  •  但是复制的只是一个文件夹,并非工程。点击File,选择项目结构

  •  之后选择Modules,在点击加号,选择Import导入工程

  •  在选择粘贴的工程,点OK。一路确定就可以了。

但是还需要改动一下,觉得繁琐的可以直接创建一个子工程

  • 在父工程的pom.xml文件添加子modules,修改一下启动类类名

  •  三个复制的Provider的配置文件Application.yml,改成不同的端口号,其他不变

  •  修改每个Provider的Service,加上01,02,03
    @Service
    public class UserServiceImpl implements UserService {
    
        @Override
        public User getUserById(Integer id) {
    
            return new User(id, "王粪堆-01", 18);
        }
    }

 3.如法炮制,复制nacos_consumer工程,并改为Ribbon_consumer

  • 也可直接创建
  • 修改application的应用名application.name,要求见名知意

  • 创建一个配置类ConfigBean
@Configuration
public class ConfigBean {
    @Bean
    /**
     * 添加了@LoadBalanced注解之后,Ribbon会给restTemplate请求添加一个拦截器,在拦截器中获取注册中心的所有可用服务,通过获取到的服务信息(ip,port)替换 serviceId 实现负载请求。
     */
    @LoadBalanced//开启负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    //随机策略
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}

 修改一下Controller类

@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    private int currentIndex;

    @RequestMapping("/getUserById/{id}")
    public User getUserByIds(@PathVariable Integer id) {
        //不使用ribbon:ip:port
        //String serviceUrl = "127.0.0.1:9090";
        //使用ribbon:不再使用ip:port的方式,而是改成了serviceId(即Nacos中注册的服务名称)
        String serviceUrl = "ribbon-provider";
        return restTemplate.getForObject("http://" + serviceUrl +
                "/provider/getUserById/" + id, User.class);
    }

}

 4.测试

开启Mysql,开启Nacos,开启三个Provider,开启ribbon的consumer

输入网址三个输出到浏览器的语句没有任何规律,因为什么呢?

5.负载均衡策略

策略类 命名 描述
RandomRule 随机策略 随机选择 Server
RoundRobinRule 轮询策略 按照顺序循环选择 Server
RetryRule 重试策略 在一个配置时间段内,当选择的 Server 不成功,则一直尝试选择一个可用的 Server
BestAvailableRule 最低并发策略 逐个考察 Server,如果 Server 的断路器被打开,则忽略,在不被忽略的 Server 中选择并发连接最低的 Server
AvailabilityFilteringRule 可用过滤测试 过滤掉一直连接失败,并被标记未 circuit tripped(即不可用) 的 Server,过滤掉高并发的 Server
ResponseTimeWeightedRule 响应时间加权策略 根据 Server 的响应时间分配权重,响应时间越长,权重越低,被选择到的几率就越低
ZoneAvoidanceRule 区域权衡策略 综合判断 Server 所在区域的性能和 Server 的可用性轮询选择 Server,并判定一个 AWS Zone 的运行性能是否可用,剔除不可用的 Zone 中的所有 Server

6.ribbon策略的选择

  1. 在ribbon的配置类中@Bean注入了一个随机策略,最后的结果就是随机出现,如果不注入任何策略,默认是轮询策略,也就是按顺序出现,刷新一下就是下一个。
  2. ribbon有好几个策略,具体源码这里不再赘述。

7.ribbon的问题

在本章中,ribbon虽然动态的获得了提供者的IP和端口,并自动进行拼接,返回回来,但是请求路径还需要拼接,还是不太智能,虽然可以通过其ribbon的其他方法也可以做到动态获取路径,但是宗其所有还是没有Feign方便。

下一个将浅练一下:

三、声明式服务调用Feign


总结

一年之计在于春,一日之计在于晨

本文含有隐藏内容,请 开通VIP 后查看