相信看了 每天学点SpringCloud(一):简单服务提供者消费者调用每天学点SpringCloud(二):服务注册与发现Eureka这两篇的同学都了解到了我的套路,没错,本篇博客同样是为了解决上篇的问题的。

上篇我们使用Eureka默认的负载均衡解决了消费方调用服务方硬编码的问题,不过呢,因为是使用的默认负载均衡的策略,所以这次我们就搞一搞事情,来自定义一下它的策略。

搞这个策略呢有两种实现方式

通过代码自定义

通过代码的方式自定义负责均衡策略时需要注意的是,注意避免SpringBoot的包扫描,因为自定义的规则必须在Eureka的规则实例化以后再实例化才会生效,那么这样就有两种方式,

第一种

1.在CloudDemoConsumerApplication类上级新建包config,然后新建LoanBalanced类。使用此类注册一个IRule以达到替换Eureka的目的

package cn.org.config;

import com.netflix.loadbalancer.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class LoadBalanced {
@Bean
public IRule ribbonRule() {
return new RoundRobinRule(); //轮训
// return new WeightedResponseTimeRule(); //加权权重
//return new RetryRule(); //带有重试机制的轮训
//return new RandomRule(); //随机
//return new TestRule(); //自定义规则
}
}

2.注意包名,CloudDemoConsumerApplication的包名是cn.org.zhixiang。

3.想使用哪种负载均衡策略就new哪一种就ok

4.TestRule为自定义的规则:

package cn.org.config.domain;

import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server; import java.util.List; public class TestRule implements IRule { private ILoadBalancer loadBalancer;
@Override
public Server choose(Object o) {
List<Server> servers= loadBalancer.getAllServers();
return servers.get(0);
} @Override
public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
this.loadBalancer=iLoadBalancer;
} @Override
public ILoadBalancer getLoadBalancer() {
return this.loadBalancer;
}
}

如果有自定义的需求的话可以参照这个写法,我这只是测试使用,取的服务列表的第一个。

5.在CloudDemoConsumerApplication类上添加注解@RibbonClient(name = "provider-demo", configuration = cn.org.config.LoadBalanced

.class),指定provider-demo服务使用的是LoadBalanced类提供的规则

第二种:

依旧把LoadBalanced放到cn.org.zhixiang包下,不过呢通过自定义注解来解决包扫描的问题

1.自定义一个注解

public @interface ExcludeFromComponentScan {
}

2.类使用刚才自定义的注解标示

@Configuration
@ExcludeFromComponentScan
public class AvoidLoanbalanced {
  @Bean
  public IRule ribbonRule() {
    return new RoundRobinRule();        //轮训
    // return new WeightedResponseTimeRule();  //加权权重
    //return new RetryRule();          //带有重试机制的轮训
    //return new RandomRule();          //随机
    //return new TestRule();           //自定义规则
  }
}

3.Application中指定包扫描忽略使用上方注解的类,然后注册规则

@RibbonClient(name = "provider-demo", configuration = AvoidLoanbalanced.class)
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) })

注意:上方两种方式使用一种就够了。

使用配置文件自定义

#为服务Id名称为provider-demo的项目配置负载均衡规则为com.netflix.loadbalancer.WeightedResponseTimeRule
provider-demo:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

当然,自定义负载均衡策略只需要选择代码或配置文件自定义其中的一种就可以了。毕竟美酒虽好,可不要贪杯哦。

GitHub:https://github.com/shiyujun/spring-cloud-demo

如果对您有所帮助,请记得帮忙点一个star哦

本文出自https://zhixiang.org.cn/#/blog/read/9f8bd71e-2482-4014-8566-630aaa75f339,转载请保留。

每天学点SpringCloud(三):自定义Eureka集群负载均衡策略的更多相关文章

  1. 【Nginx(三)】Nginx配置集群 负载均衡策略

    Nginx配置集群 负载均衡策略 一.安装环境 1.安装JDK8的环境,配置JDK8的环境变量 2.上传jar包demo-1.jar 和 demo-2.jar demo-1.jar 监听8080端口; ...

  2. 【Nginx(四)】Nginx配置集群 负载均衡策略

    1.Nginx常见的负载均衡策略 ip_hash (固定分发) 简介:根据请求按访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器 场景:服务器业务分区.业务缓存.Session需要 ...

  3. springcloud费话之Eureka集群

    目录: springcloud费话之Eureka基础 springcloud费话之Eureka集群 springcloud费话之Eureka服务访问(restTemplate) springcloud ...

  4. 图文解说:Nginx+tomcat配置集群负载均衡

    图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用  作者:niumd Blog:http://ari.iteye ...

  5. 转】Nginx+tomcat配置集群负载均衡

    原博文出自于:http://blog.csdn.net/bruce_6/article/details/38228299         感谢! 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食 ...

  6. ngnix apache tomcat集群负载均衡配置

    http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...

  7. lunix 集群,负载均衡,location

       nginx location语法: location支持的语法优先级: 复制代码location匹配顺序 #  www.s14hanju.com/1.location = / {  我是代码1} ...

  8. .net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡

    1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...

  9. Apache+Tomcat +mod_proxy集群负载均衡及session

      序言: 在玩Apache+Tomcat +mod_jk集群负载均衡及session的时候发现,还有一种方式可以实现,就是网上各位大牛们说的mod_proxy反向代理. 实在弄的我的知识细胞洋洋.实 ...

随机推荐

  1. python websocket 再线聊天室的 Demo

    服务端 import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options import ...

  2. python简单实现tftp客户端(基于udp)

    TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务 ...

  3. Qt跨平台开发Wince5.0和Android程序

    所谓跨平台是指维护一份代码,可编译出多平台的应用程序.Qt这方面虽然已经做的不错,但性能还是体验,和原生开发工具开发的程序相比,差距还是不小的.但单从生产应用的角度来说,可以采用,不失为一种好的解决方 ...

  4. VUEX报 “was assigned to but it has no setter”

    如果有当前的变量(VUEX声名的)会发生改变的(change),刚绑定的值需要在data () 内进行声明 一个新的变量进行处理.

  5. angular如何引入公共JS

    一.现象 在项目的开发中,总会用到一些公司的脚本方法,同时,不希望在每个页面用到时又得需要引用,有点麻烦. 二.解决 1.在src文件夹下新建文件夹 utils: 2.在utils下新建文件 comm ...

  6. linux下修改时间戳

    Linux下touch是一个非常有用的命令. touch语法结构如下: touch [-acfm][-d <日期时间>][-r <参考文件或目录>][-t <日期时间&g ...

  7. vs2010单步调试崩溃

    vs2010在使用单步调试(F10,F11)功能时崩溃,如下图: 困扰了一段时间,度娘,google了很久也没有搜到有价值的解决方案,貌似问题非主流? 原因如下图(禁用即可): 当然这里NET Ref ...

  8. 解决删除镜像时image is referenced in multiple repositories

    1.查看镜像 docker images rt@:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hours ago MB f8ab12e0 ...

  9. vs2015 不能启动 iis express

    删除以下目录的文件 <<path_to_solution_folder>>\.vs\config\applicationhost.config具体地址http://stacko ...

  10. Python几周学习内容小结

    环境配置 学习python首先是要配置环境,我们选择了Anaconda. 什么是Anaconda:专注于数据分析的python发行版本. 为什么选择Anaconda:省事省心,分析利器 至于下载和安装 ...