资料总结 资料总结
首页
go
java
云原生
  • mysql
  • redis
  • MongoDB
  • 设计模式详解
  • 数据结构与算法
  • 前端
  • 项目
  • 理论基础
  • 运营
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

linghui Wu

一只努力学飞的鱼
首页
go
java
云原生
  • mysql
  • redis
  • MongoDB
  • 设计模式详解
  • 数据结构与算法
  • 前端
  • 项目
  • 理论基础
  • 运营
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • java-se

  • jvm

  • mybatis

  • Netty

  • 爬虫 webmagic

  • spring

  • spring-cloud

    • alibaba

    • Netflix

      • Feign
      • Ribbon
        • Ribbon模块
          • 运用到的设计模式
          • 自己的疑惑
          • 参考资料
    • spring

  • 中间件

  • flowable

  • idea工具

  • maven

  • ms

  • java部署

  • 原生安卓

  • java
  • spring-cloud
  • Netflix
wulinghui
2022-01-21
目录

Ribbon

# spring-cloud规范接口

  • LoadBalancerClient : 负载均衡客户端,RibbonLoadBalancerClient是对LoadBalancerClient的实现,exec方法包含了负载均衡的功能,Ribbon做负载均衡时用的就是它
  • LoadBalancerRequestFactory : LoadBalancerRequest 负载均衡请求工厂,用来创建LoadBalancerRequest
  • LoadBalancerRequest : 执行请求方法内容.
  • ClientHttpRequestInterceptor : RestTmplate拦截器的扩展点...

# 高级功能

Ribbon配置静态服务 (opens new window)

hystrix熔断器整合

如何设置饥饿加载,启动就加载

ribbon.eager-load.enabled=true

自定义Ribbon客户端 (opens new window)

针对某个服务定义局部的配置,不是全局配置。

支持ILoadBalancer、IRule、IPing、ServerList、ServerListFilter

直接使用Ribbon API (opens new window)

看扩展点的接口,bean就行了。

超时重试配置,源码指点 (opens new window)

说明 Ribbon 默认情况下就不支持超时重试,需要配置启用 RestClient。

他是通过扩展RestTemplate的ClientHttpRequestFactory接口 -> RibbonClientHttpRequestFactory 去实现的。

这里面才走ribbon的RetryHandler接口去执行。

ribbon 超时配置 (opens new window)

#自定义ribbon的超时时间 ribbon: ReadTimeout: 5000      #处理请求的超时时间,默认为5秒 ConnectTimeout: 5000      #连接建立的超时时长,默认5秒 MaxAutoRetries: 1 #同一台实例的最大重试次数,但是不包括首次调用,默认为1次 MaxAutoRetriesNextServer: 0 #重试负载均衡其他实例的最大重试次数,不包括首次调用,默认为0次 OkToRetryOnAllOperations: false #/是否对所有操作都重试,默认false

# 扩展点接口

  • IClientConfig :Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现。

  • IRule:Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区域环境下选出 最佳区域的实例进行访问。

  • IPing:Ribbon的实例检查策略,默认采用DummyPing实现,该检查策略是一个特殊的实现,实际上 它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是可用的。

  • ServerList:服务实例清单的维护机制,默认采用ConfigurationBasedServerList实现。 NacosServerList的扩展整合

  • ServerListUpdater : 动态更新服务提供方的节点信息,用默认就行了,里面会操作ServerList接口

  • ServerListFilter:服务实例清单过滤机制,默认采ZonePreferenceServerListFilter,该策略能够优先 过滤出与请求方处于同区域的服务实例。

  • ILoadBalancer:真正的负载均衡器,默认采用ZoneAwareLoadBalancer实现,它具备了区域感知的能力。

  • RetryHandler: 重试策略,默认的只有简单的异常处理,真正生产环境使用都需要根据业务场景自定义重试策略

# 源码解析

[Ribbon 源码一:Ribbon概念理解及Demo调试 (opens new window)](https://www.cnblogs.com/wang-meng/p/12151486.html)

Ribbon 源码二:通过Debug找出Ribbon初始化流程及ILoadBalancer原理分析 (opens new window)

他的源码里面运用了大量了CAS无锁修改状态,copyAndWrite的并发内容。

Ribbon重试策略RetryHandler的配置与源码分析

https://cloud.tencent.com/developer/article/1658791 重试的使用代码

https://juejin.cn/post/6934153260966084615#heading-6 配置类中生效的代码.

# Ribbon模块

ribbonloadbalancer 负载均衡模块,可独立使用,也可以和别的模块一起使用
Ribbon 内置的负载均衡算法都实现在其中
ribbon-eureka 基于 Eureka 封装的模块,能够快速、方便地集成 Eureka
ribbon-transport 基于 Netty 实现多协议的支持,比如 HTTP、Tcp、Udp 等
ribbon-httpclient 基于 Apache HttpClient 封装的 REST 客户端,集成了负载均衡模块,可以直接在项目中使 用来调用接口
ribbon-example Ribbon 使用代码示例,通过这些示例能够让你的学习事半功倍。
ribbon-core 一些比较核心且具有通用性的代码,客户端 API 的一些配置和其他 API 的定义。

# 运用到的设计模式

委托模式 PredicateBasedRule:委托给Predicate接口处理
模板模式和回调模式 BaseLoadBalancer、AbstractLoadBalancerRule 、AbstractServerPredicate
门面模式 ILoadBalancer#chooseServer
组合模式 CompositePredicate
工厂模式 SpringClientFactory
包装模式 LoadBalancerRequest
职责链模式 DynamicServerListLoadBalancer

# 自己的疑惑

  • SpringClientFactory 是不是 父子容器的概念??? 不是的,

    官方解释是: 用来给Ribbon客户端创建上下文和配置,它为每个客户机名称创建一个Spring ApplicationContext,并创建好RibbonClient客户端相关的bean和配置。

    他主要的作用在于 实现自定义多个Ribbon客户端,不同的规则。

  • 重试是通过RibbonHttpRequest,而默认情况是ServiceRequestWrapper包装。 为啥他们不再一起处理呢??

    ServiceRequestWrapper,只是包装了一下getURI方法,还会有其他的RestTemplate拦截器。 RibbonHttpRequest ,他是重写了executeInternal 方法, 其他的RestTemplate拦截器,不会再生效了。

# 参考资料

spring-cloud官网资料 (opens new window)

spring-cloud-netflix 中的 2.2.10 版本资料第7章。

十四.SpringCloud源码剖析-Ribbon的初始化配置 (opens new window)

怎么能使用注册中心服务发现的同时自己加载本地静态ribbon啊? (opens new window)

nacos 整合的情况下,他就没有做这个功能,这里需要自己定义了。 或者url>name规则,简单的用,来代替 @FeignClient(name = "nmg", url = "${store.ribbon.listOfServers:}", configuration = FeignCustomizedConfiguration.class)

编辑 (opens new window)
上次更新: 2023/01/24, 15:21:15
Feign
spring commons

← Feign spring commons→

最近更新
01
架构升级踩坑之路
02-27
02
总结
02-27
03
语法学习
02-27
更多文章>
| Copyright © 2021-2025 Wu lingui |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式