一、系统内置的策略有以下几种。

 这个负载策略配置说白了就是让 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

二、示例

1.只要在启动时创建一个IRule对象,注入容器,即可。因为系统内置的容器需要在真正 发起请求时才会创建,并且判断系统容器中没有IRule对象。

@SpringBootApplication
@Slf4j
@EnableDiscoveryClient
@RestController
public class ConsumeApplication {@AutowiredRestTemplate restTemplate;@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();clientHttpRequestFactory.setConnectTimeout(5 * 1000);clientHttpRequestFactory.setReadTimeout(5 * 1000);return new RestTemplate(clientHttpRequestFactory);}@Beanpublic IRule ribbonRule() {return new RandomRule();}public static void main(String[] args) {SpringApplication.run(ConsumeApplication.class, args);}@GetMapping("test")public String getContent(){log.info("发起请求");String ret =  restTemplate.getForObject("http://provider/provider",String.class);return ret;}}

2.在创建ribbonLoadBalancer时就会使用最新的RULE

三、在发起调用时触发RULE的choose方法

1.源码  ,这个很简单,就是随机取一个实例。

package com.netflix.loadbalancer;import java.util.List;
import java.util.Random;import com.netflix.client.config.IClientConfig;/*** A loadbalacing strategy that randomly distributes traffic amongst existing* servers.* * @author stonse* */
public class RandomRule extends AbstractLoadBalancerRule {Random rand;public RandomRule() {rand = new Random();}/*** Randomly choose from all living servers*/@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;}Server server = null;while (server == null) {if (Thread.interrupted()) {return null;}List<Server> upList = lb.getReachableServers();List<Server> allList = lb.getAllServers();int serverCount = allList.size();if (serverCount == 0) {/** No servers. End regardless of pass, because subsequent passes* only get more restrictive.*/return null;}int index = rand.nextInt(serverCount);server = upList.get(index);if (server == null) {/** The only time this should happen is if the server list were* somehow trimmed. This is a transient condition. Retry after* yielding.*/Thread.yield();continue;}if (server.isAlive()) {return (server);}// Shouldn't actually happen.. but must be transient or a bug.server = null;Thread.yield();}return server;}

四、可以针对单个服务自定义IRULE规则。

1.编写IRULE

package com.net.sample.consume;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;import java.util.List;
import java.util.Random;public class FirstRule extends AbstractLoadBalancerRule {public FirstRule() {}/*** Randomly choose from all living servers*/public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;}Server server = null;while (server == null) {if (Thread.interrupted()) {return null;}List<Server> upList = lb.getReachableServers();List<Server> allList = lb.getAllServers();int serverCount = allList.size();if (serverCount == 0) {/** No servers. End regardless of pass, because subsequent passes* only get more restrictive.*/return null;}int index = 0;server = upList.get(index);if (server == null) {/** The only time this should happen is if the server list were* somehow trimmed. This is a transient condition. Retry after* yielding.*/Thread.yield();continue;}if (server.isAlive()) {return (server);}// Shouldn't actually happen.. but must be transient or a bug.server = null;Thread.yield();}return server;}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}
}

2.编写CONFIGIGATION,这个配置类不在程序启动初始化时加载,而是在请求时,由RIBBON内部的SpringClientFactory的子applicationContext来创建和实例化。

package com.net.sample.consume;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;@Configuration
/** 用来标记使用的注解,方便排除或者引用 **/
@AvoidScan
public class RibbonFirstLoadBalancingConfiguration {@Beanpublic IRule ribbonRule() {return new FirstRule();}}

3.启动类加上,启动时排除上面的配置的包。RibbonClient针对每个服务端进行单独的配置,就是configuation实例,由这个内部来创建IRULE,IRuleFilter,ServerList都可以自定义。

@SpringBootApplication
@Slf4j
@EnableDiscoveryClient
@RestController
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,value = AvoidScan.class))
@RibbonClient(name = "provider",configuration = RibbonFirstLoadBalancingConfiguration.class)
public class ConsumeApplication {

4.这里看到进入了我们自定义的IRULE规则选择服务实例。

springcloud ribbon 配置负载均衡策略以及自定义策略相关推荐

  1. springcloud ribbon实现负载均衡的时候,提示Request URI does not contain a valid hostname: htt...

    qq社区:541122375,群名springClould全家桶 问题描述:  org.springframework.web.util.NestedServletException: Request ...

  2. springcloud ribbon @LoadBalance负载均衡源码流程分析

    一.编写示例 1.服务端 pom.xml <properties><java.version>1.8</java.version><spring-cloud. ...

  3. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用

    什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...

  4. SpringCloud Hoxton版微服务- Ribbon实现负载均衡

    Ribbon实现负载均衡 Ribbon概念 一.Ribbon策略 二.配置使用 1.编写服务提供者 2.编写服务消费者 3.测试负载均衡随机策略 Ribbon概念 Spring Cloud Ribbo ...

  5. 跟着狂神学SpringCloud(Rest环境搭建+Eureka服务注册与发现+ribbon+Feign负载均衡+Hystrix+服务熔断+Zuul路由网关+SpringCloud config分布)

    跟着狂神学SpringCloud SpringCloud 回顾之前的知识- JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot ...

  6. SpringCloud(7)Ribbon 与负载均衡

    Ribbon SpringCloud Ribbon 是基于NetFlix Ribbon实现的一套客户端负载均衡的工具 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负 ...

  7. 微服务(三) 【手摸手带你搭建Spring Cloud】 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡?ribbon负载均衡有几种策略?Ribbon是什么?

    在上一章,我介绍了springcloud的eureka搭建.我们做了服务注册.最后我们还介绍了一些续约,失效剔除等参数配置.已经不需要再通过手动输入ip去访问服务,而是通过中心只需要通过服务名就可以获 ...

  8. Ribbon的负载均衡策略

    一.Ribbon负载均衡 如上图所示,负载均衡就是避免单个服务的实例处理大批量请求而导致其他实例空闲,造成资源浪费.负载均衡分为客户端.服务端的负载均衡,它们最大的区别在于维护服务器的清单保存的位置不 ...

  9. 【微服务架构】SpringCloud使用Ribbon实现负载均衡

    说在前面 软负载均衡的实现方式有两种,分别是服务端的负载均衡和客户端的负载均衡 服务端负载均衡:当浏览器向后台发出请求的时候,会首先向反向代理服务器发送请求,反向代理服务器会根据客户端部署的ip:po ...

最新文章

  1. Microbiome | 中科院张惠明团队揭示RNA介导的DNA甲基化影响植物根部微生物群落!...
  2. activity切换效果
  3. hdu4846 最大子正方形(dp)
  4. Windows MobileCE 开发书籍大全
  5. redis启动后出现WARNING you have Transparent Huge Pages (THP) support enabled in your kernel问题...
  6. SpringCloud介绍(一)
  7. The Innovation | 中国开启肿瘤CAR-T治疗新时代
  8. html 自定义标签的作用
  9. win10 安装MASM32 遇到的问题DELETE operation of EXE file has failed
  10. 设有单总线结构计算机的cpu数据通路,中央处理器——数据通路之单总线结构
  11. 苹果电子邮件怎么注册_LOL英雄联盟手游谷歌账号怎么注册 谷歌账号注册方法步骤教程介绍...
  12. 美食源码php,美食类门户网站仿豆果网php源码
  13. 漫步者lollipods如何调节音量_漫步者LolliPods怎么配对双耳-使用教程
  14. 怎么用python画一个皮卡丘,用python画皮卡丘的代码
  15. 大数据项目之电商数仓DataX、DataX简介、DataX支持的数据源、DataX架构原理、DataX部署
  16. 搭建PHP环境需要安装Apache服务器,遇到的一系列的问题(切记需要用管理权限进入CMD)
  17. 高阻态是0还是1_超实用买鞋指南!宽脚、胖脚、脚背高、磨脚...搞定各种买鞋难题!...
  18. 轻量级渲染管线_轻量级渲染管道:优化实时性能
  19. vue 输入框限制中英文及数字
  20. 网易严选离线数仓质量建设实践

热门文章

  1. 左手高仿,右手二奢,这届年轻人的奢侈品消费有点迷
  2. 无性别服饰是趋势,但不该只停留在“中性”
  3. 联通4g满格但是网速慢_手机信号明明满格?网速却非常慢,原来其中讲究这么大,涨知识了...
  4. python硬件驱动_Python学习:计算机基础之计算机硬件
  5. oracle 声明二维数组,[zt]C++二维数组讲解、二维数组的声明和初始化
  6. 鱼骨图分析法实际案例_【管理工具详解】鱼骨图分析法
  7. 用python读取股票价格_使用Python写一个量化股票提醒系统
  8. (Python)from collections import Counter统计包
  9. pwntools常用脚本语句介绍讲解
  10. Python类的多态和多态性