Spring Cloud Ribbon客户端负载均衡(四)

序言

Ribbon 是一个客户端负载均衡器(Nginx 为服务端负载均衡),它赋予了应用一些支配 HTTP 与 TCP 行为的能力,可以得知,这里的客户端负载均衡也是进程内负载均衡的一种。它在 Spring Cloud 生态内是一个不可缺少的组件,少了它,服务便不能横向扩展,这显然是有违云原生12要素的。此外 Feign 与 Zuul 中已经默认集成了 Ribbon,在我们的服务之间凡是涉及调用的,都可以集成它并应用,从而使我们的调用链具备良好的伸缩性。
附带拓展福利,云原生12要素:https://12factor.net/zh_cn/

Ribbon是Netflix公司开源的一个负载均衡的项目,它属于上述的第二种,是一个客户端负载均衡器,运行在客户端上。它是一个经过了云端测试的IPC库,可以很好地控制HTTP和TCP客户端的一些行为。 Feign已经默认使用了Ribbon。

  • 负载均衡
  • 容错
  • 多协议(HTTP,TCP,UDP)支持异步和反应模型
  • 缓存和批处理

ribbon:https://github.com/Netflix/ribbon

Feign集成Ribbon示例

@RestController
@RequestMapping(value = "/Promotion",method = RequestMethod.GET)
public class PromotionController implements PromotionFacade {
    @Value("${server.port}")
    String port;
    @Value("${spring.profiles.active}")
    String environment;
    @Override
    @RequestMapping(value = "/delete")
    public String releasePromotion(@RequestParam int orderID){
        try {
            if ("local".equals(environment)) {
                Thread.sleep(200L);
            }
            return port;
        }
        catch (Exception ex)
        {
            return  port+"---"+ex.getMessage();
        }
    }
}

注册服务如下

Spring Cloud Ribbon客户端负载均衡(四)

上述trade-promotion服务,有2个站点部署,feign调用他们如下。

@FeignClient(name = "trade-promotion")
public interface PromotionClient {
    @RequestMapping(value = "/Promotion/delete", method = RequestMethod.GET)
    String releasePromotion(@RequestParam int orderID);
}

默认情况下,调用结果是:8085,8082,8085,8082,8085,8082,8085,8082… 这样轮询调用执行。

原因就是默认集成啦Ribbon,可以通过spring-cloud-starter-openfeign这个依赖看下他的父依赖中,就有spring-cloud-starter-netflix-ribbon这个包的依赖。

Ribbon的负载均衡策略

  • RandomRule (随机策略): 随机选择 Server
  • RoundRobinRule (轮训策略): 按顺序循环选择 Server
  • RetryRule (重试策略): 在一个配置时问段内当选择 Server 不成功,则一直尝试选择一个可用的 Server
  • BestAvailableRule (最低并发策略): 逐个考察 Server,如果 Server 断路器打开,则忽略,再选择其中并发连接最低的 Server
  • AvailabilityFilteringRule (可用过滤策略): 过滤掉一直连接失败并被标记为 circuit tripped 的 Server,过滤掉那些高并发连接的 Server(active connections 超过配置的网值)
  • ResponseTimeWeightedRule (响应时间加权策略): 根据 Server 的响应时间分配权重。响应时间越长,权重越低,被选择到的概率就越低;响应时间越短,权重越高,被选择到的概率就越高。这个策略很贴切,综合了各种因素,如:网络、磁盘、IO等,这些因素直接影响着响应时间
  • ZoneAvoidanceRule (区域权衡策略): 综合判断 Server 所在区域的性能和 Server 的可用性轮询选择 Server,并且判定一个 AWS Zone 的运行性能是否可用,剔除不可用的 Zone 中的所有 Server

默认为轮询策略

全局策略设置

@Configuration
public class RibbonConfig {
    /**
     * 随机规则
     */
    @Bean
    public IRule ribbonRule() {
        return new RetryRule();
    }
}

配置文件配置

#trade-promotion:这个是eureka中的被调用的服务名称
trade-promotion.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

note:第一个new的对象与上面的轮询规则匹配,第二个配置文件最后的词语也是与轮询规则匹配

Ribbon 超时与重试

针对单个服务的重试与超时配置:

#负载均衡策略
trade-promotion.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
#http建立socket超时时间,毫秒
trade-promotion.ribbon.ConnectTimeout=2000
#http读取响应socket超时时间
trade-promotion.ribbon.ReadTimeout=5000
#同一台实例最大重试次数,不包括首次调用
trade-promotion.ribbon.MaxAutoRetries=0
#重试负载均衡其他的实例最大重试次数,不包括首次server
trade-promotion.ribbon.MaxAutoRetriesNextServer=2
是否所有操作都重试,POST请求注意多次提交错误。
默认false,设定为false的话,只有get请求会重试
trade-promotion.ribbon.OkToRetryOnAllOperations=true

全局服务的重试与超时配置

#http建立socket超时时间,毫秒
ribbon.ConnectTimeout=2000
#http读取响应socket超时时间
ribbon.ReadTimeout=5000
#同一台实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetries=0
#重试负载均衡其他的实例最大重试次数,不包括首次server
ribbon.MaxAutoRetriesNextServer=2
是否所有操作都重试,POST请求注意多次提交错误。
默认false,设定为false的话,只有get请求会重试
ribbon.OkToRetryOnAllOperations=true

Ribbon脱离Eureka进行负载

ribbon.eureka.enabled=false
trade-promotion.ribbon.listOfServers:http://localhost:8085,http://localhost:8082

Ribbon饥饿加载

ribbon.eager-load.enabled=true
ribbon.eager-load.clients=trade-promotion,trade-order

总结

多看文档,多翻资料

Original: https://www.cnblogs.com/knowledgesea/p/11231617.html
Author: 张龙豪
Title: Spring Cloud Ribbon客户端负载均衡(四)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540663/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL排序原理与案例分析

    转载:MySQL排序原理与案例分析 posted @2021-04-04 18:12 轨迹320 阅读(34 ) 评论() 编辑 Original: https://www.cnb…

    Java 2023年6月5日
    094
  • 【Java分享客栈】一文搞定京东零售开源的AsyncTool,彻底解决异步编排问题。

    一、前言 本章主要是承接上一篇讲CompletableFuture的文章,想了解的可以先去看看案例: https://juejin.cn/post/7091132240574283…

    Java 2023年6月9日
    0108
  • java list 按照多字段排序

    list 排序涉及的接口 Comparator, 具体实现代码如下,以Apple类为例 public class Test{  public static void main(St…

    Java 2023年5月29日
    074
  • 碎碎念六零

    05.01 在贾府,宝玉就是林姑娘的世界。 那日,宝玉与林姑娘闹小别扭,正要哄时,偏被小厮忽悠去吃酒,说是老爷有事要”请”。觥筹交错之间,林姑娘还在担忧宝玉…

    Java 2023年6月9日
    074
  • rabbitmq延时重试队列

    如果只是网络抖动 出现异常那么直接进入死信队列 那么是不合理的 这就可以使用延时重试队列 原理: 1.发送到业务队里 如果正常收到 正常运行 2.如果处理失败 重试 并投入延时队列…

    Java 2023年5月30日
    069
  • Volatile的学习

    首先先介绍三个性质 可见性 可见性代表主内存中变量更新,线程中可以及时获得最新的值。 下面例子证明了线程中可见性的问题 由于发现多次执行都要到主内存中取变量,所以会将变量缓存到线程…

    Java 2023年6月16日
    074
  • 机器学习(2)特征抽取:TF-Idf

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/cgy1995/p/9975044.htmlAuthor…

    Java 2023年6月8日
    073
  • Javaweb06-JDBC

    1、jdbc.properties配置文件 jdbc.properties driverClass=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql…

    Java 2023年6月15日
    072
  • Android RTL 语言适配

    使用 start/end 代替 left/right 属性值。 官方给出的需要替换的属性值列表如下: Android 对 RTL 的支持,是从 Android 4.2 版本开始的。…

    Java 2023年6月7日
    0103
  • 万字剖析OpenFeign整合Ribbon实现负载均衡的原理

    大家好,前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理,这篇文章来继续剖析SpringCloud组件原理,来看一看OpenFeign是如何基于Ribb…

    Java 2023年6月16日
    089
  • Feign源码解析系列-核心初始化

    开始 初始化Feign客户端当然是整个过程中的核心部分,毕竟初始化完毕就等着调用了,初始化时候准备的什么,流程就走什么。 内容 从上一篇中,我们已经知道,对于扫描到的每一个有@Fe…

    Java 2023年6月13日
    083
  • vue学习笔记

    数据验证 当组件需要传递数据时,推荐进行数据验证。当传输的数据类型和要求不一致时,会在控制台弹出警告。 Vue.compoent(‘my-component’, { props: …

    Java 2023年6月9日
    078
  • Java-函数式编程大全指南

    前言 这里总结记录一下,所有java中可以用到的函数式编程以及使用场景和方法 Original: https://www.cnblogs.com/houzheng/p/160163…

    Java 2023年5月29日
    071
  • IO流文件复制

    用IO流实现文件复制 使用FileInputStream+FileOutputStream完成文件的拷贝 拷贝的过程是一边读一边写 使用以上的字节流拷贝文件的时候,文件的格式不限 …

    Java 2023年6月9日
    070
  • 2、spring+mybatis注解(无mapper实现类)+idea+maven

    1、在idea中配置database 连接数据库,用来在idea中编写sql脚本操作数据库 2、sql详细脚本如下: 1 –1.创建部门表 2 create table dept…

    Java 2023年6月13日
    063
  • 设计模式笔记(一):单例模式

    单例模式可以说是设计模式中最简单的设计模式之一了。顾名思义,单例模式指的是一个类只提供一个固定的单个实例,大家共用该实例。 单例模式代码实现步骤: 1、私有化类的构造方法 2、提供…

    Java 2023年6月6日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球