springcloud入门——Ribbon原理及应用

1.Ribbon负载均衡原理

默认负载轮训算法:  rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标

List<Servicelnstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");

list.get(index)获取下标index,决定被访问的机器。

实例:eureka服务中心集群了payment微服务8001和8002,则队列为

    List [0] instances = 127.0.0.1:8002
    List [1] instances = 127.0.0.1:8001

8001+ 8002组合成为集群,它们共计2台机器,集群总数为2,按照轮询算法原理:

    当总请求数为1时:1%2=1对应下标位置为1,则获得服务地址为127.0.0.1:8001
    当总请求数位2时:2%2=0对应下标位置为0,则获得服务地址为127.0.0.1:8002
    当总请求数位3时:3%2=1对应下标位置为1,则获得服务地址为127.0.0.1:8001
    当总请求数位4时:4%2=0对应下标位置为0,则获得服务地址为127.0.0.1:8002
    如此类推…固默认算法下,两台机器交替被访问。

每次当服务重启动后rest接口计数从1重新开始。

2.Ribbon源码解析

1.核心组件IRule:

2.随机算法源码:

下方算法为随机轮询算法选择机器的具体代码:

首先确定调用微服务的名称,如无,返回错误参数。

然后根据微服务的名称,传入server微服务机器数,生成list数组。

再把参数(机器数量)传入

incrementAndGetModulo(int modulo)

算法中,使用取余并取下标的算法得到index值,再进行比较和赋值。

把index值传回

nextServerIndex

变量中,再根据server.get(index)选择出所需要的机器。

3.手写Ribbon轮询算法

1.ApplicationContextConfig去掉注解@LoadBalanced,OrderMain80去掉注解@RibbonClient

2.编写lb接口,传入server名参数:

3.实现lb接口:

主要有两个方法,getandincrement()方法用以统计访问次数,返回当前访问次数值。直至取到期望值,跳出循环。

继承接口的方法instance()传入当前server服务的list数组(需要使用其数量),调用getandincrement()方法,套用轮询公式,获取index值,再根据index值返回server名给方法。

4.修改controller类:

如服务失效,返回空值;服务生效,传入服务名,调用loadbalancer(自己编写的轮询算法)。

5.进行测试。不停地刷新http://localhost/consumer/payment/lb,可以看到8001/8002交替出现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud是一个基于Spring Boot的开发工具集,提供了一系列用于构建分布式系统的解决方案。其中,Feign和Ribbon是Spring Cloud中常用的两个组件。 Feign是一个声明式的Web服务客户端,用于简化使用Spring Cloud的服务之间进行通信的过程。它通过支持注解方式来定义和使用服务接口,底层使用的是基于反射的动态代理技术,将接口和实际调用的服务进行映射。Feign通过集成Ribbon来实现负载均衡的功能。 Ribbon是一个负载均衡的组件,它根据一系列的负载均衡策略,从多个服务实例中选择一个要调用的实例。Ribbon通过监听Eureka注册中心上已注册的服务列表,并通过默认的轮询算法选择一个实例。在Feign中,Ribbon用于根据服务接口定义的URL和方法,选择一个具体的服务进行调用。 Feign和Ribbon原理可以简单总结如下:首先,Feign通过使用@EnableFeignClients注解开启Feign功能,扫描包中带有@FeignClient注解的接口定义。接着,Feign将这些接口定义转化为动态代理对象,在调用接口方法时,实际上是通过动态代理对象进行了解析和转发,最终会调用到具体的服务实例上。此时,Ribbon会根据一定的策略从多个服务实例中选择一个实例进行调用,并返回调用结果。整个调用过程是通过HTTP协议进行通信的。 总之,Spring Cloud中的Feign和Ribbon组件能够实现微服务之间的通信和负载均衡功能。Feign简化了基于HTTP的服务接口定义和调用的过程,而Ribbon则负责根据一定的负载均衡策略选择合适的服务实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值