ribbon有7种负载均衡策略可供选择:

策略类   命名 描述
RandomRule 随机策略 随机选择server
RoundRobinRule 轮询策略 按照顺序选择server(ribbon默认策略)
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

如果想要创建一个全局的负载策略,只需添加一个配置类,也可自己扩展,添加逻辑,如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule; @Configuration
public class RibbonConfiguration { @Bean
public IRule ribbonRule() {
return new RandomRule();
}
}

如果想要对某个服务源设置特有的策略,可以在工程启动类上添加@RibbonClient注解,当然,对应配置代码也需要调整:

/**
* 自定义-标记注解
*/
public @interface AvoidScan { }
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule; /**
* Ribbon负载策略配置类,IClientConfig是针对客户端的管理配置器,配合@RibbonClient注解使用
*/
@Configuration
@AvoidScan
public class RibbonConfiguration { @Autowired
private IClientConfig config; @Bean
public IRule ribbonRule(IClientConfig config) {
return new RandomRule();
}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import cn.springcloud.book.config.AvoidScan;
import cn.springcloud.book.config.TestConfiguration; /**
* 工程启动类
*/
@SpringBootApplication
@EnableDiscoveryClient
@RibbonClient(name = "client-a", configuration = RibbonConfiguration.class)//表示针对client-a服务使用的负责策略是经过RibbonConfiguration配置类的。
//@RibbonClients(value = {
// @RibbonClient(name = "client-a", configuration = RibbonConfiguration.class),
// @RibbonClient(name = "client-b", configuration = RibbonConfiguration.class)
//})//这种方式跟@RibbonClient类似,不过这个是针对多个服务进行策略指定。
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {AvoidScan.class})})//表示让工程在启动的时候,不让Spring扫描被@AvoidScan注解标记的类,
//因为配置的是针对特殊服务的负载策略,不是全局的,如果不排除,启动就会报错。
public class RibbonLoadbalancerApplication { public static void main(String[] args) {
SpringApplication.run(RibbonLoadbalancerApplication.class, args);
} }

如果想使用配置文件的方式,进行配置负责策略,语法是 client name.ribbon.*,client name是我们自己给服务取的名字,即:spring.application.name设置的值。如下:

client-a:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #针对client-a服务使用随机策略

ribbon的重试机制,默认是开启的,需要添加超时与重试的策略配置,如下:

client-a:
ribbon:
ConnectTimeout: 30000
ReadTimeout: 60000
MaxAutoRetries: 1 #对第一次请求的服务的重试次数
MaxAutoRetriesNextServer: 1 #要重试的下一个服务的最大数量(不包括第一个服务)
OkToRetryOnAllOperations: true
#说明:这里配置的ConnectTimeout和ReadTimeout是当HTTP客户端使用的是HttpClient才生效,这个时间最终会被设置到HttpClient中。
#在设置的时候需要结合hystrix的超时时间来综合考虑,针对使用的场景,设置太小会导致很多请求失败,设置太大会导致熔断控制变差。

提供了7个核心接口:


接口 简述 默认实现
IClientConfig 定义ribbon中管理配置的接口 DefaultClientConfigImpl
IRule 定义ribbon中负载均衡策略的接口 ZoneAvoidanceRule
IPing 定义定期ping服务,检查可用性的接口 DummyPing
ServerList<Server> 定义获取服务列表方法的接口 ConfigurationBasedServerList
ServerListFilter<Server> 定义特定场景下,获取服务列表的方法接口 ZonePreferenceServerListFilter
ILoadBalancer 定义负载均衡选择服务的核心方法接口 ZoneAwareLoadBalancer
ServerListUpdater 为DynamicServerListLoadBalancer定义动态更新服务列表的接口 PollingServerListUpdater

Ribbon【负载均衡策略】的更多相关文章

  1. Ribbon负载均衡策略与自定义配置new

    Ribbon负载均衡策略 配置 对调用的某个服务启用某种负载策略 1)通过配置文件配置 hello: ribbon: NFLoadBalancerRuleClassName:com.netflix.l ...

  2. Ribbon负载均衡策略与自定义配置

    Ribbon负载均衡策略 配置 对调用的某个服务启用某种负载策略 1)通过配置文件配置 hello: ribbon: NFLoadBalancerRuleClassName:com.netflix.l ...

  3. springcloud(十四)、ribbon负载均衡策略应用案例

    一.eureka-server服务中心项目不再创建 二.eureka-common-empdept公共组件项目不再掩饰 三.创建eureka-client-provider-empdept-one提供 ...

  4. Ribbon负载均衡策略配置

    在这里吐槽一句:网上很多文章真是神坑,你不看还好,看了只会问题越来越多,就连之前的问题都没有解决!!! 不多说了,Ribbon作为后端负载均衡器,比Nginx更注重的是请求分发而不是承担并发,可以直接 ...

  5. Spring Cloud微服务开发笔记5——Ribbon负载均衡策略规则定制

    上一篇文章单独介绍了Ribbon框架的使用,及其如何实现客户端对服务访问的负载均衡,但只是单独从Ribbon框架实现,没有涉及spring cloud.本文着力介绍Ribbon的负载均衡机制,下一篇文 ...

  6. spring cloud中通过配置文件自定义Ribbon负载均衡策略

    一.Ribbon中的负载均衡策略 1.Ribbon中支持的负载均衡策略 AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端se ...

  7. SpringCloud之Ribbon负载均衡策略

    Spring Cloud 微服务架构学习记录与示例 一.认识Ribbon 首先咱们需要认识下负载均衡,一般分为服务器端负载和客户端负载均衡. 服务器端负载均衡:比如Nginx.F5,请求达到服务器后由 ...

  8. 【SpringCloud】Netflix源码解析之Ribbon:负载均衡策略的定义和实现

    Ribbon负载均衡策略定义 IRule其实就只做了一件事情Server choose(Object key),可以看到这个功能是在LB中定义(要求)的,LB把这个功能委托给IRule来实现.不同的I ...

  9. Spring Cloud Ribbon 中的 7 种负载均衡策略

    负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者--客户端负载均衡器. 服务端负载均衡器的问题是,它提供了更强的流量控制权,但 ...

  10. 浅谈SpringCloud (三) Ribbon负载均衡

    什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...

随机推荐

  1. 10月清北学堂培训 Day 1

    今天是杨溢鑫老师的讲授~ T1 1 题意: n * m 的地图,有 4 种不同的地形(包括空地),6 种不同的指令,求从起点及初始的状态开始根据指令行动的结果. 2 思路:(虽然分了数据范围但是实际上 ...

  2. 全局设置页面颜色 返回按钮样式 iOS

    思路 1.建个UIViewController的分类 2.hook方法viewDidLoad(Aspects是三方库 可以不用) 3.看下面蓝色部分代码 #import "UIViewCon ...

  3. HTML中调用带有SoapHeader头的WebService的两种方法

    第一种: function CallWebMethodWithHeader() { var soapXML = "<soap:Envelope xmlns:xsi='http://ww ...

  4. TynSerial自定义对象的序列(还原)

    TynSerial自定义对象的序列(还原) TynSerial是咏南中间件封装的支持数据二进制序列(还原)的类. 对于ORM来说,序列类必须序列(还原)自定义对象. 1)定义一个自定义对象 type ...

  5. ArcGIS超级工具SPTOOLS1.7升级说明

    ArcGIS超级工具1.7升级说明:多了:5个工具,总87工具. 5.11   数据打包 44 5.11.1.  mxd批量打包MPK:对一个文件夹所有MXD打包MPK 5.11.2.  mxd文档发 ...

  6. java.lang.ClassNotFoundException:org.apache.struts2.dispatcher.FilterDispatcher

    老版本的Struts2升级,启动报的错. org.apache.struts2.dispatcher.FilterDispatcher 是web.xml中对struts2  2.2版本的接入点的类. ...

  7. 微信小程序 scroll-view 填满剩余可用高度

    根据微信小程序 scroll-view 文档所述,scroll-view必须给定一个固定高度.那么如果我们想要让它自动填充剩余高度,该怎么办呢? 前言 在说出我的解决方案之前,先来看一下我的页面设计, ...

  8. SurfaceView双缓冲技术引入

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...

  9. osg 自定义图元

    osg::ref_ptr<osg::Geode> OSG_Qt_::createBox() { osg::ref_ptr<osg::Geode> osg_geode = new ...

  10. Linux输出信息并将信息记录到文件(tee命令)

    摘自:https://www.jb51.net/article/104846.htm 前言 最近工作中遇到一个需求,需要将程序的输出写到终端,同时写入文件,通过查找相关的资料,发现可以用 tee 命令 ...