浅练一下Ribbon的负载均衡

目录

零、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


总结

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值