【云原生&微服务二】SpringCloud之Ribbon自定义负载均衡策略(含Ribbon核心API)「建议收藏」

【云原生&微服务二】SpringCloud之Ribbon自定义负载均衡策略(含Ribbon核心API)「建议收藏」1、SpringCloud之Ribbon自定义负载均衡策略,2、SpringCloud之Ribbon自定义服务实例心跳检查策略,3、ILoadBalancer、IRule、IPing介绍

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、前置知识

在前一篇文章【云原生&微服务一】SpringCloud之Ribbon实现负载均衡详细案例(集成Eureka、Ribbon)我们讨论了SpringCloud如何集成Eureka和Ribbon,本文就在其基础上讨论一下如何自定义Ribbon的负载均衡策略、以及Ribbon的核心API。

二、Ribbon核心API

博主习惯性的在深入研究一门技术的时候去GitHub上看文档,然而Ribbon在GitHub上的文档(https://github.com/Netflix/ribbon)真的是没啥可看的;就给了一个demo和Release notes。

Ribbon有三个核心接口:ILoadBalancer、IRule、IPing,其中:

  1. ILoadBalancer是负载均衡器;
    在这里插入图片描述
  2. IRule 复杂负载均衡的规则,ILoadBalancer根据其选择一个可用的Server服务器;
    在这里插入图片描述
  3. IPing负责定时ping每个服务器,判断其是否存活。
    在这里插入图片描述

三、自定义负载均衡策略IRule

1、编写IRule实现类

MyRule重写IRule的choose(Object o)方法,每次都访问List<Server>中第一个服务实例;

import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;

import java.util.List;

/** * 自定义负载均衡规则,只用第一个实例; * * @author Saint */
public class MyRule implements IRule { 
   

    private ILoadBalancer loadBalancer;

    @Override
    public Server choose(Object o) { 
   
        final List<Server> allServers = this.loadBalancer.getAllServers();
        return allServers.get(0);
    }

    @Override
    public void setLoadBalancer(ILoadBalancer iLoadBalancer) { 
   
        this.loadBalancer = iLoadBalancer;
    }

    @Override
    public ILoadBalancer getLoadBalancer() { 
   
        return loadBalancer;
    }
}

注意:一般很少需要自己定制负载均衡算法的,除非是类似hash分发的那种场景,可以自己写个自定义的Rule,比如说,每次都根据某个请求参数,分发到某台机器上去。不过在分布式系统中,尽量减少这种需要hash分发的情况。

下面我接着看如何把自定义的MyRule应用到指定的服务上 或 全部服务上。

2、编写Ribbon配置类

在Ribbon配置类中通过@Bean注解将自定义的IRule实现类MyRule注入到Spring容器中。

import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/** * 自定义Ribbon配置 * * @author Saint */
@Configuration
public class MyRibbonConfiguration { 
   

    @Bean
    public IRule getRule() { 
   
        return new MyRule();
    }
}

3、应用到全部服务上(Ribbon全局配置)

Ribbon全局配置有两种方式:一种是依赖Spring的自动扫描、一种是依赖@RibbonClients注解。

1)Spring的自动扫描

所谓Spring的自动扫描,就是将自定义的Ribbon配置类放在Spring容器可以扫描到的包目录下即可。
在这里插入图片描述
如上图所示,程序的启动类RibbonFeignSampleConsumerApplication所在的目录为com.saint,Ribbon配置类MyRibbonConfiguration 所在的目录为com.saint.config;又因没有指定包扫描的路径,所以目录会扫描启动类所在的包com.saint,因此Spring可以自动扫描到MyRibbonConfiguration、进而扫描到MyRule。

注意:Ribbon的配置类一定不能Spring扫描到。因为Ribbon有自己的子上下文,Spring的父上下文如果和Ribbon的子上下文重叠,会有各种各样的问题。比如:Spring和SpringMVC父子上下文重叠会导致事务不生效。

所以不推荐使用这种方式。

2)@RibbonClients注解

在启动类所在目录的父目录(com.saint)中新建config文件夹(com.config),并将MyRibbonConfiguration类移动到其中,代码目录结构如下:
在这里插入图片描述
这样操作之后,Ribbon配置类讲不会被Spring扫描到。所以需要利用@RibbonClients注解做一些配置;

在com.saint.config目录下新增GreetingServiceRibbonConf类:

package com.saint.config;

import com.config.MyRibbonConfiguration;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Configuration;

/** * @author Saint */
@Configuration
@RibbonClients(defaultConfiguration = MyRibbonConfiguration.class)
public class GreetingServiceRibbonConf { 
   
}

3、应用到指定服务上(Ribbon局部配置)

针对Ribbon局部配置,有两种方式:代码配置 和 属性配置,上面提到的@RibbonClients就属于代码配置的方式,区别在于Ribbon局部配置使用的是@RibbonClient注解;

1)代码配置 – @RibbonClient

将GreetingServiceRibbonConf类的内容修改如下:

package com.saint.config;

import com.config.MyRibbonConfiguration;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Configuration;

/** * 自定义 调用greeting-service服务时 使用的配置 * * @author Saint */
@Configuration
@RibbonClient(name = "GREETING-SERVICE", configuration = MyRibbonConfiguration.class)
public class GreetingServiceRibbonConf { 
   
}

当然我们也可以不使用GreetingServiceRibbonConf作为一个配置类,直接将@RibbonClient(name = "GREETING-SERVICE", configuration = MyRibbonConfiguration.class)加在启动类中也是一样的。

2)属性配置 – application.yml

首先将GreetingServiceRibbonConf类中的内容全部注释掉:
在这里插入图片描述

然后在application.yml文件中添加如下内容:

# GREETING-SERVICE为要调用的微服务名
GREETING-SERVICE:
  ribbon:
    NFLoadBalancerRuleClassName: com.saint.config.MyRule

3)两种方式对比:

  • 代码配置:基于代码、更加灵活;但是线上修改得重新打包、发布,并且还有小坑(父子上下文问题)
  • 属性配置: 配置更加直观、优先级更高(相对代码配置)、线上修改无需重新打包、发布;但是极端场景下没有代码配置方式灵活。

注意:如果代码配置和属性配置两种方式混用,属性配置优先级更高。

4)细粒度配置-最佳实践:

  1. 尽量使用属性配置,属性方式实现不了的情况下再考虑代码配置。
  2. 同一个微服务内尽量保持单一性,使用同样的配置方式,避免两种方式混用,增加定位代码的复杂性。

4、使用浏览器进行调用服务消费者

结合博文:【云原生&微服务一】SpringCloud之Ribbon实现负载均衡详细案例(集成Eureka、Ribbon),我们已经依次启动了eureka-server、ribbon-feign-sample-8081、ribbon-feign-sample-8082、ribbon-feign-sample-consumer;三个服务、四个实例。

此处我们针对服务消费者ribbon-feign-sample-consumer做四次接口调用,分别为:

  1. http://localhost:9090/say/saint
  2. http://localhost:9090/say/saint2
  3. http://localhost:9090/say/saint3
  4. http://localhost:9090/say/saint4

在这里插入图片描述
然后我们去看ribbon-feign-sample-8081、ribbon-feign-sample-8082的控制台输出:

1> ribbon-feign-sample-8081控制台输出:
在这里插入图片描述

2> ribbon-feign-sample-8082控制台输出:
在这里插入图片描述

3> 结果说明:
我们可以发现,四个请求,ribbon-feign-sample-8082实例处理了所有的请求,我们自定义的IRule已经生效。

四、自定义服务实例是否存活判定策略IPing

和IRule的自定义方式一样,这里只提供自定义的IPing,具体配置方式和IRule一样。

1、自定义IPing

MyPing表示实例永不失活,因为其isAlive(Server server)永远返回TRUE。

package com.saint.config;

import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.Server;

/** * 自定义IPing,判断每个服务是否还存活 * @author Saint */
public class MyPing implements IPing { 
   
    @Override
    public boolean isAlive(Server server) { 
   
        return true;
    }
}

2、修改Ribbon配置类

package com.config;

import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.saint.config.MyPing;
import com.saint.config.MyRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/** * 自定义Ribbon配置 * * @author Saint */
@Configuration
public class MyRibbonConfiguration { 
   

    @Bean
    public IRule getRule() { 
   
        return new MyRule();
    }

    @Bean
    public IPing getPing() { 
   
        return new MyPing();
    }

}

五、性能优化-饥饿加载

Ribbon默认是懒加载微服务,所以第一次调用特别慢,我们可以修改饥饿加载。

ribbon:
  eager-load:
    # 开启饥饿加载
    enabled: true
    # 开启饥饿加载的微服务列表,多个以,分隔
    clients: user-center,xxx
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182333.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java IO流详尽解析「建议收藏」

    java IO流详尽解析「建议收藏」流的概念和作用,好吧,百度了一张图片,不错学习JavaIO,不得不提到的就是JavaIO流。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。IO流的分类根据处理数据类型的不同分为:字符流和字节流根据数据流向不同分为:输入流和输出流字符流和字节流字符流的由

    2022年5月22日
    32
  • 【万字长文】 Vue全家桶从入门到实战,超详细笔记整理 ( 一 ) (建议收藏)

    【万字长文】 Vue全家桶从入门到实战,超详细笔记整理 ( 一 ) (建议收藏)笔记根据B站编程不良人视频整理,视频链接:【编程不良人】VUE全家桶入门到实战,学VUE看这个就够了,已完结!基于企业最流行Vue实战技术,需要md格式笔记的可以私信我。目录1、Vue引言2、Vue入门2.1、下载Vuejs2.2、Vue第一个入门应用3、v-text和v-html3.1、v-text3.2、v-html3.3、v-text和v-html对比4、vue中事件绑定(v-on)4、vue中事件绑定(v-on)4.1、绑定事件基本语法4.2、Vue中事件的简化语法4.3、Vue事件函数.

    2022年10月28日
    0
  • Delphi考虑sql注入 QuotedStr

    Delphi考虑sql注入 QuotedStr之前只在BS架构的项目中考虑了Sql注入问题,却很少考虑到用了多年的Delphi项目也应该考虑Sql注入的问题,今天做了个实验,成功完成注入,把表里数据全部删除,以后再做Delphi项目还真的考虑这个问题。总体讲,大体知道有两种方式可以避免Delphi中的Sql注入:1、用QuotedStr替代”’进行字符串拼接;2、采用传参数的方式与数据库交互,这种方式哪天再仔细体验一下。 以下为一个小测试,…

    2022年10月18日
    0
  • shift work什么意思_shift delete什么意思

    shift work什么意思_shift delete什么意思shift后门之管理员的用处『罗斌原创』shift后门,网络/系统管理员如果想用的话,那还是可以的,为什么要用它呢,第一,公司大部分的电脑都没有光驱,有的甚至不支持从U盘启动,当一个员工走了之后,而他的电脑又设置了密码,无从下手激活成功教程密码,除非把它的电脑拆了,把硬盘挂在其他电脑上去激活成功教程。或者重装系统!这样是不是非常麻烦呢?第…

    2022年9月2日
    2
  • 如何保证docker2375端口的安全

    如何保证docker2375端口的安全情景再现:之前有很多朋友提过,当使用docker-maven-plugin打包SpringBoot应用的Docker镜像时,服务器需要开放2375端口。由于开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵、挖矿、CPU飙升这些情况都有发生,今天我们来聊聊如何解决这个问题。问题产生的原因首先我们要明白问题产生的原因,才能更好地解决问题!Docker为了实现集群管理,提供了远程管理的端口。DockerDaemon作为守护进程运行在后台,可以执行发送到管理端口上的Docker命令。当我们修改do

    2022年6月13日
    74
  • 显示搜索dota2协调服务器,老司机教你处理搜索dota2游戏协调服务器中【操作流程】…[通俗易懂]

    显示搜索dota2协调服务器,老司机教你处理搜索dota2游戏协调服务器中【操作流程】…[通俗易懂]win7系统有很多人都喜欢使用,我们操作的过程中常常会碰到win7系统搜索dota2游戏协调服务器中的问题。如果遇到win7系统搜索dota2游戏协调服务器中的问题该怎么办呢?很多电脑水平薄弱的网友不知道win7系统搜索dota2游戏协调服务器中究竟该怎么解决?其实不难根据下面的操作步骤就可以解决问题1:DOTA2服务器蹦了之后,进入DOTA2,发现最顶端先是提示:“搜索DOTA2协调服务器中…”…

    2022年5月13日
    127

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号