Ribbon负载均衡算法原理与使用介绍

 更新时间:2022年09月01日 16:12:27   作者:一个风轻云淡  
在微服务中,对服务进行拆分之后,必然会带来微服务之间的通信需求,而每个微服务为了保证高可用性,又会去部署集群,那么面对一个集群微服务进行通信的时候,如何进行负载均衡也是必然需要考虑的问题

负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标 ,每次服务重启动后rest接口计数从1开始。

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

如:

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

如此类推......

写一个本地负载均衡器

设现在有俩个服务端口8001 8002幼由80端口调动

其中8001 8002 的controller中

@GetMapping(value = "/payment/lb")
    public String getPaymentLB()
    {
        return serverPort;
    }

80 的一个接口为:

public interface LoadBalancer
{
    ServiceInstance instances(List<ServiceInstance> serviceInstances);
}
 

实现类

@Component
public class MyLB implements LoadBalancer
{
    private AtomicInteger atomicInteger = new AtomicInteger(0);
    public final int getAndIncrement()
    {
        int current;
        int next;
        do
        {
            current = this.atomicInteger.get();
            next = current >= 2147483647 ? 0 : current + 1;
        } while(!this.atomicInteger.compareAndSet(current, next));
        System.out.println("*****next: "+next);
        return next;
    }
    @Override
    public ServiceInstance instances(List<ServiceInstance> serviceInstances)
    {
        int index = getAndIncrement() % serviceInstances.size();
        return serviceInstances.get(index);
    }
}

调用 方法

 @Resource
    private RestTemplate restTemplate;
    //可以获取注册中心上的服务列表
    @Resource
    private DiscoveryClient discoveryClient;
    @Resource
    private LoadBalancer loadBalancer;
@GetMapping("/consumer/payment/lb")
    public String getPaymentLB()
    {
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        if(instances == null || instances.size()<=0) {
            return null;
        }
        ServiceInstance serviceInstance = loadBalancer.instances(instances);
        URI uri = serviceInstance.getUri();
        return restTemplate.getForObject(uri+"/payment/lb",String.class);
    }

ApplicationContextBean去掉注解@LoadBalanced

到此这篇关于Ribbon负载均衡算法原理与使用介绍的文章就介绍到这了,更多相关Ribbon负载均衡内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中Date和Calendar常用方法

    Java中Date和Calendar常用方法

    这篇文章主要为大家详细介绍了Java中Date和Calendar常用用法,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • SpringMVC中controller返回json数据的方法

    SpringMVC中controller返回json数据的方法

    这篇文章主要为大家详细介绍了SpringMVC中controller返回json数据的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Spring MVC的web.xml配置详解

    Spring MVC的web.xml配置详解

    这篇文章主要介绍了Spring MVC的web.xml配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java Testcontainers库实现测试功能

    Java Testcontainers库实现测试功能

    这篇文章主要介绍了Java Testcontainers库实现测试功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 详细理解JAVA面向对象的封装,继承,多态,抽象

    详细理解JAVA面向对象的封装,继承,多态,抽象

    这篇文章主要介绍了Java基础之面向对象机制(多态、继承)底层实现,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-07-07
  • Java设计模式之责任链模式详解

    Java设计模式之责任链模式详解

    客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象。这样就实现了请求者和接受者之间的解耦,并且在客户端可以实现动态的组合职责链。使编程更有灵活性
    2022-07-07
  • springBoot @Enable* 注解的使用

    springBoot @Enable* 注解的使用

    这篇文章主要介绍了springBoot @Enable* 注解的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Java根据ip地址获取归属地实例详解

    Java根据ip地址获取归属地实例详解

    这篇文章主要为大家介绍了Java根据ip地址获取归属地实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • JavaWeb项目中JSP访问的问题解决

    JavaWeb项目中JSP访问的问题解决

    JSP文件一般有两个存放位置,本文主要介绍了JavaWeb项目中JSP访问的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Spring Boot 快速入门指南

    Spring Boot 快速入门指南

    Spring 框架是非常著名的 Java 开源框架,历经十多年的发展,整个生态系统已经非常完善甚至是繁杂,Spring Boot 正是为了解决这个问题而开发的,为 Spring 平台和第三方库提供了开箱即用的设置,只需要很少的配置就可以开始一个 Spring 项目
    2017-03-03

最新评论