自定义负载均衡策略

官方文档指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目的了;

要求自定义的算法:依旧是轮询策略,但是每个服务器被调用5次后轮到下一个服务,即以前是每个服务被调用1次,现在是每个被调用5次。

打开消费者工程:

1、自定义算法类必须继承 AbstractLoadBalanceRule

启动类在com.yufeng.springcloud 包下,所以我们新建一个包: con.yufeng.myrule,并在该包下新建一个类:CustomeRule

public class CustomeRule extends AbstractLoadBalancerRule
{
/*
total = 0 // 当total==5以后,我们指针才能往下走,
index = 0 // 当前对外提供服务的服务器地址,
total需要重新置为零,但是已经达到过一个5次,我们的index = 1
*/ private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
private int currentIndex = 0; // 当前提供服务的机器号 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) {
return null;
} //int index = rand.nextInt(serverCount);
//server = upList.get(index);
if(total < 5)
{
server = upList.get(currentIndex);
total++;
}else {
total = 0;
currentIndex++;
if(currentIndex >= upList.size())
{
currentIndex = 0;
}
} if (server == null) {
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;
} @Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
} @Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
}

2、配置类中增加自定义规则

@Configuration
public class ConfigBean
{
@Bean
@LoadBalanced //Ribbon 是客户端负载均衡的工具;
public RestTemplate getRestTemplate()
{
return new RestTemplate();
} @Bean
public IRule myRule()
{
return new CustomeRule(); //自定义负载均衡规则
}
}

3、主启动类添加 @RibbonClient 注解,name和configuration参数很重要;

在启动该微服务的时候就能去加载我们自定义的Ribbon配置类,从而使配置生效:

  @RibbonClient(name="microservicecloud-dept", configuration=ConfigBean.class)

  name指定针对哪个服务 进行负载均衡,而configuration指定负载均衡的算法具体实现类。

4、启动该消费者服务,然后访问:http://localhost/consumer/dept/get/1,可以看到先访问生产者1服务5次,然后访问生产者2服务5次......

ConfigBean

自定义Ribbon的负载均衡策略的更多相关文章

  1. Ribbon【负载均衡策略】

    ribbon有7种负载均衡策略可供选择: 策略类 命名 描述 RandomRule 随机策略 随机选择server RoundRobinRule 轮询策略 按照顺序选择server(ribbon默认策 ...

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

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

  3. Spring Cloud学习 之 Spring Cloud Ribbon(负载均衡策略)

    文章目录 AbstractLoadBalancerRule: RandomRule: RoundRobinRule: RetryRule: WeightedResponseTimeRule: 定时任务 ...

  4. 撸一撸Spring Cloud Ribbon的原理-负载均衡策略

    在前两篇<撸一撸Spring Cloud Ribbon的原理>,<撸一撸Spring Cloud Ribbon的原理-负载均衡器>中,整理了Ribbon如何通过负载均衡拦截器植 ...

  5. SpringCloud微服务实战——搭建企业级开发框架(十二):OpenFeign+Ribbon实现负载均衡

      Ribbon是Netflix下的负载均衡项目,它主要实现中间层应用程序的负载均衡.为Ribbon配置服务提供者地址列表后,Ribbon就会基于某种负载均衡算法,自动帮助服务调用者去请求.Ribbo ...

  6. Spring Cloud Ribbon——客户端负载均衡

    一.负载均衡负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.其意思 ...

  7. Spring Cloud:使用Ribbon实现负载均衡详解(下)

    在上一篇文章(Spring Cloud:使用Ribbon实现负载均衡详解(上))中,我对 Ribbon 做了一个介绍,Ribbon 可以实现直接通过服务名称对服务进行访问.这一篇文章我详细分析一下如何 ...

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

    序言 Ribbon 是一个客户端负载均衡器(Nginx 为服务端负载均衡),它赋予了应用一些支配 HTTP 与 TCP 行为的能力,可以得知,这里的客户端负载均衡也是进程内负载均衡的一种.它在 Spr ...

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

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

随机推荐

  1. Fluentvalidation的基本使用

    前言: fluentvalidation用于构建强类型验证规则的流行.NET库.方便好用快捷省心!!! 本文按照官方文档进行试验,如果深(不)入(看)的(我)研(写)究(的)请去官网:https:// ...

  2. C#使用post方式提交json数据

    尝试了一天,尝试了各种方法,一下方法最直接方便. //地址 string _url = "https://www.dXXXayup.ink/api/User/Login"; //j ...

  3. 2019 苏州朗动java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.苏州朗动等公司offer,岗位是Java后端开发,因为发展原因最终选择去了苏州朗动,入职一年时间了,也成为了面 ...

  4. Composer安装laravel框架

    一.打开CMD,进入想安装的目录,输入如下图所示,安装一个blog的项目: 二.进入指定目录即可看到生成的blog项目,如下图:

  5. cookie跨域解决方案

    cookie的名/值对中的值不允许出现分号.逗号和空白符,因此在设置cookie前要用encodeURIComponent()编码,读取时再用decodeURIComponent()解码. cooki ...

  6. JAVA concurrent包下Semaphore、CountDownLatch等用法

    CountDownLatch 跟join的区别 CountDownLatch用处跟join很像,但是CountDownLatch更加灵活,如果子线程有多个阶段a.b.c; 那么我们可以实现在a阶段完成 ...

  7. CentOS7下firewall-cmd防火墙使用

    一. firewalld的基本使用启动: systemctl start firewalld查状态:systemctl status firewalld 停止: systemctl disable f ...

  8. shell 脚本命令之alias

    1.alias的功能 设置一个别名,即为一个长命令起一个新的名字 2.alias的基本格式 alias   alias_name='origin_command' alias是指定别名命令的关键字 a ...

  9. 织梦dedecms后台文件media_add.php任意上传漏洞解决办法

    织梦在安装到阿里云服务器后阿里云后台会提示media_add.php后台文件任意上传漏洞,引起的文件是后台管理目录下的media_add.php文件,下面跟大家分享一下这个漏洞的修复方法: 首先找到并 ...

  10. bootstrap ui样例

    http://demo.codedefault.com/demo/ui/theadmin/samples/invoicer/settings.html