SpringCloud LoadBalancer自定义负载均衡器使用解析

 更新时间:2023年04月17日 08:34:41   作者:程序员李哈  
LoadBalancerClient 是 SpringCloud 提供的一种负载均衡客户端,Ribbon 负载均衡组件内部也是集成了 LoadBalancerClient 来实现负载均衡,本文给大家深入解析 LoadBalancerClient 接口源码,感兴趣的朋友跟随小编一起看看吧

由于原有的负载均衡组件Ribbon停止维护,而完美的Spring生态怎能允许缺少负载均衡组件呢?Spring Cloud官方自己造出了Spring Cloud LoadBalancer来代替原有的Ribbon。由于是官方自己写的组件,所以并没有像eureka、Feign那样抽出一个单独的组件包出来。而放入到Spring Cloud Commons规范包中。

正文

Spring Cloud LoadBalancer 帮开发者已经实现了RoundRobinLoadBalancer、RandomLoadBalancer,分别是轮训和随机,默认实现为轮训。

即让是负载均衡组件,那必然有默认实现,也必然有扩展接口暴露给开发者。所以第一步肯定是介绍抽象接口。

// 负载均衡的标志性接口,继承ReactorLoadBalancer接口
// 本接口无任何接口增强,仅仅作为一个标志性接口。
public interface ReactorServiceInstanceLoadBalancer extends ReactorLoadBalancer<ServiceInstance> 
// 在Spring Cloud高版本中大部分组件采用了Reacotr框架(有一说一,阅读性极差!!)
// 这里定义了一个选择的抽象方法。
public interface ReactorLoadBalancer<T> extends ReactiveLoadBalancer<T> {
	Mono<Response<T>> choose(Request request);
	default Mono<Response<T>> choose() {
		return choose(REQUEST);
	}
}

这里有涉及到Reactor框架,不过完全可以当黑盒使用。接口非常的简单就一个choose方法,所以接下来我们只需要实现此接口。

@LoadBalancerClient(value = "deptmanagecloud-provider", configuration = MyConfig.class)
public class MyConfig {
    // 配置负载均衡策略
    @Bean
    public ReactorLoadBalancer<ServiceInstance> myLB(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new MyLB(
                loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class));
    }
}

这里有部分逻辑,读者完全可以当作黑盒暂时不需要去理解。只需要明白从注册中心拿到注册表以后会执行getInstanceResponse方法,只需要实现自定义负载均衡策略的逻辑即可,好比我这里的逻辑是永远只调用一个服务(当然,这完全扯淡,仅仅是Demo无须太关心)

既然我们把自定义负载均衡策略写好了,那么,怎么告诉Spring呢?肯定需要注入给Spring。

@LoadBalancerClient(value = "deptmanagecloud-provider", configuration = MyConfig.class)
public class MyConfig {
    // 配置负载均衡策略
    @Bean
    public ReactorLoadBalancer<ServiceInstance> myLB(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new MyLB(
                loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class));
    }
}

这里需要➕上@LoadBalancerClient注解,value为调用方的服务名,configuration为配置类

总结

相比以前的Ribbon的IRule方式这个要复杂一些,不过大部分都是造轮子,开发者只需要关心自定义的负载均衡逻辑即可~!

到此这篇关于SpringCloud LoadBalancer自定义负载均衡器使用解析的文章就介绍到这了,更多相关SpringCloud LoadBalancer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 分析讲解Java Random类里的种子问题

    分析讲解Java Random类里的种子问题

    Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字
    2022-05-05
  • 详解Java中switch的新特性

    详解Java中switch的新特性

    这篇文章主要介绍了Java中switch的新特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • maven依赖的version声明控制方式

    maven依赖的version声明控制方式

    这篇文章主要介绍了maven依赖的version声明控制方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • SpringBoot项目如何访问jsp页面的示例代码

    SpringBoot项目如何访问jsp页面的示例代码

    本篇文章主要介绍了SpringBoot项目如何访问jsp页面的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • IDEA 端口占用的解决方法(推荐)

    IDEA 端口占用的解决方法(推荐)

    这篇文章主要介绍了IDEA 端口占用的解决方法,本文通过两种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 使用Springboot+Vue实现文件上传和下载功能

    使用Springboot+Vue实现文件上传和下载功能

    本文介绍了如何使用Springboot结合Vue进行图书信息管理系统开发,包括数据库表的创建,实体类、Dao层、Service层和Controller层的编写,重点讲解了文件上传和下载功能的实现,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • 在SpringBoot项目中获取Request的四种方法

    在SpringBoot项目中获取Request的四种方法

    这篇文章主要为大家详细介绍了SpringBoot项目中获取Request的四种方法,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以学习一下
    2023-11-11
  • 使用Java创建数据透视表并导出为PDF的方法

    使用Java创建数据透视表并导出为PDF的方法

    数据透视分析是一种强大的工具,可以帮助我们从大量数据中提取有用信息并进行深入分析,本文将介绍如何使用Java来构建PivotTable以及实现数据透视分析,并将其导出为PDF
    2023-10-10
  • 深入理解spring多数据源配置

    深入理解spring多数据源配置

    项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。本篇文章主要介绍了spring多数据源配置,有兴趣的可以了解一下。
    2017-01-01
  • JAVA统计字符串中某个字符出现次数的方法实现

    JAVA统计字符串中某个字符出现次数的方法实现

    本文主要介绍了JAVA统计字符串中某个字符出现次数的方法实现,可以循环使用String的charAt(int index)函数,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11

最新评论