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 超详细讲解抽象类与接口的使用

    Java 超详细讲解抽象类与接口的使用

    对于面向对象编程来说,抽象是它的一大特征之一,在 Java 中可以通过两种形式来体现OOP的抽象:接口和抽象类,下面这篇文章主要给大家介绍了关于Java入门基础之抽象类与接口的相关资料,需要的朋友可以参考下
    2022-04-04
  • 【Java IO流】字节流和字符流的实例讲解

    【Java IO流】字节流和字符流的实例讲解

    下面小编就为大家带来一篇【Java IO流】字节流和字符流的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java毕业设计实战之财务预算管理系统的实现

    Java毕业设计实战之财务预算管理系统的实现

    这是一个使用了java+SSM+Jsp+Mysql+Layui+Maven开发的财务预算管理系统,是一个毕业设计的实战练习,具有财务预算管理该有的所有功能,感兴趣的朋友快来看看吧
    2022-02-02
  • java字符串反转的7种方法

    java字符串反转的7种方法

    本文主要介绍了java字符串反转的7种方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Spring Boot2发布调用REST服务实现方法

    Spring Boot2发布调用REST服务实现方法

    这篇文章主要介绍了Spring Boot2发布调用REST服务实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • JAVA中Comparable接口和自定义比较器示例讲解

    JAVA中Comparable接口和自定义比较器示例讲解

    这篇文章主要给大家介绍了关于JAVA中Comparable接口和自定义比较器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java中自增和自减操作符(++/--)的那些事

    Java中自增和自减操作符(++/--)的那些事

    这篇文章主要给大家介绍了关于Java中自增和自减操作符(++/--)的那些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • Java中long类型与Long类型的区别和大小比较详解

    Java中long类型与Long类型的区别和大小比较详解

    这篇文章主要给大家介绍了Java中long类型与Long类型区别和大小比较的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • SpringBoot登录验证码实现过程详解

    SpringBoot登录验证码实现过程详解

    这篇文章主要介绍了SpringBoot登录验证码实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • springboot的切面应用方式(注解Aspect)

    springboot的切面应用方式(注解Aspect)

    文章总结:Spring Boot提供了三种拦截器:Filter、Interceptor和Aspect,Filter主要用于内容过滤和非登录状态的非法请求过滤,无法获取Spring框架相关的信息,Interceptor可以在获取请求类名、方法名的同时,获取请求参数,但无法获取参数值
    2024-11-11

最新评论