我们还是先从官网文档开始学习,如下图所示,我们可以搞一个测试配置类,来验证是否真的可以通过代码来自定义配置Ribbon,但文档明确给出了警告:即这个测试配置类不能放在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目的了。

那么,哪个类用到了@ComponentScan注解了呢?由于Ribbon是负责客户端负载均衡的,因此我们要配置的自然就是我们的movie微服务了,movie微服务的启动类中有一个@SpringBootApplication注解,我们按Ctrl再点击SpringBootApplication类进入该注解类。

SpringBootApplication接口类如下图所示,可以看到在该接口类上有我们所说的@ComponentScan注解,这也就意味着,凡是该启动类所在的包(com.itmuch.cloud)以及该包的子包都将被所有Ribbon客户端所共享。

因此,为了让我们所定义的配置类不在@ComponentScan的扫描范围下,我们便需要在包"com.itmuch.cloud"之上来放置,这里我选择了放在com.itmuch.config包下,如下图所示。

这里大家可能注意到了,在官方文档中,TestConfiguration类上方有一行注解@RibbonClient,如下图所示。(这里需要说明的是:FooConfiguration.class应该换成我们定义的类TestConfiguration

我把它放到启动类上了,如下图所示,这样做的目的无非是为了在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效。(这里有一点需要说明的是,@RibbonClient(name="microservice-provider-user"这个microservice-provider-user不是随便写的,而是注册到Eureka发现组件上的微服务服务端,意思是要对所有工程名为microsevice-provider-user的服务提供者进行负载均衡管理)

Eureka发现组件上目前注册的微服务如下,可以看到我们的服务提供者是"microservice-provider-user"。

现在既然要自定义负载均衡的方式,那么我们便需要看一看负载均衡的方式都有哪些,我们先按Ctrl键再用鼠标放到configuration上点击进入该类。

我们可以看到如下图所示的内容,在注释中明确告诉我们使用的是RibbonClientConfiguration,我们还是Ctrl并单击进入该类。

我们会看到如下图所示的内容,在该类中有所有的自定义的负载均衡策略。

我们Ctrl+F搜索"ribbonrule"便可以看到如下图所示的方法。

我们就借用一下该方法到我们的TestConfiguration类中,如下图所示。大家应该看到了,我们注入的config类有警告,其实这是不影响运行的,不必理会它。如果大家实在看着别扭,可以参考:http://blog.csdn.net/u012453843/article/details/54906905这篇博客进行处理,就不会报警告了。

刚才我们在Eureka服务发现组件上只注册了一个服务提供者(user微服务),为了可以看出来负载均衡的不同效果,我们再起一个名为microservice-provider-user的服务提供者,只是端口需要改下,另外再起两个名为microservice-provider-user的服务提供者,注意端口不能一样。其实要做到这些非常简单,我们只需要修改user微服务的application.yml文件就可以了。我们已经注册的那个user微服务的端口号是7900,那么我们第二个名为microservice-provider-user的微服务的端口便改为7901。

改完之后,我们到user微服务的启动类去启动7901端口的user微服务。启动完之后,我们再到Eureka主页看下当前注册的微服务,发现已经有两个名为microservice-provider-user的微服务注册进来了,只是端口不一样而已。

接下来我们再启动两个名为microservice-provider-user2的微服务,这样做是为了更好的看清楚ribbon的负载均衡策略是不是按照服务注册名来区分的。如下图所示,我们改端口号为7902,名称为microservice-provider-user,改完后我们到启动类启动该微服务。(同理,我们修改端口为7903,name依然叫microservice-provider-user2,再起一个)

起完之后,我们再来看一下Eureka主页,如下图所示,可以看到,服务名为microservice-provider-user的微服务有两个,名为microservice-provider-user2的微服务也有两个。

为了能够更方便的看出不同策略的负载均衡的效果,我们在movie微服务中添加了些代码,方便我们测试,如下图所示。

this.loadBalancerClient.choose("microservice-provider-user");可以随机获取名为microservice-provider-user的一个微服务的实例,并用该实例做相应的事情。

下面我们重启movie微服务,然后到地址栏输入:http://localhost:8010/test并连续刷新多次。

然后我们到movie的控制台下看看负载均衡的调用情况,如下图所示,我们通过观察可以发现,服务一的调用是没有规律的(即端口7900和7901出现的次数没有规律可言,说明是随机策略。而服务二则不同,它出现的非常规律,7903和7902依次出现数量相等,说明这是轮询策略)这也说明了,我们自定义的随机策略起作用了,而且只作用在了名为microservice-provider-user的微服务上,并未影响名为microservice-provider-user2的微服务。

Spring Cloud 通过代码自定义配置Ribbon的更多相关文章

  1. spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?

    Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...

  2. Spring Cloud 系列之 Apollo 配置中心(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Apollo 配置中心(一) 本篇文章讲解 Apollo 部门管理.用户管理.配置管理.集群管理. 点击链接观看:Ap ...

  3. Spring Cloud之——Config(配置中心)

    Spring Cloud Config(配置中心) 大家好,有一段时间没有写技术博客了.由于工作上的事情,这方面很难分配时间.近几年随着服务化的兴起,一批服务化的框架应运而生,像dubbo,thrif ...

  4. Spring Cloud 入门教程 - 搭建配置中心服务

    简介 Spring Cloud 提供了一个部署微服务的平台,包括了微服务中常见的组件:配置中心服务, API网关,断路器,服务注册与发现,分布式追溯,OAuth2,消费者驱动合约等.我们不必先知道每个 ...

  5. Spring Boot + Spring Cloud 实现权限管理系统 配置中心(Config、Bus)

    技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...

  6. SpringCloud实战之初级入门(三)— spring cloud config搭建git配置中心

    目录 1.环境介绍 2.配置中心 2.1 创建工程 2.2 修改配置文件 2.3 在github中加入配置文件 2.3 修改启动文件 3. 访问配置中心 1.环境介绍 上一篇文章中,我们介绍了如何利用 ...

  7. Spring Cloud Eureka集群配置及注意事项(Greenwich版本)

    Spring Cloud Eureka集群配置及注意事项(Greenwich版本) 一·概述 Spring Cloud Netflix Eureka 是一个提供服务注册与发现的套件.服务提供者只需要将 ...

  8. Spring Cloud 系列之 Config 配置中心(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Config 配置中心(一) 本篇文章讲解 Config 如何实现配置中心自动刷新. 配置中心自动刷新 点击链接观看: ...

  9. Spring Cloud 系列之 Config 配置中心(三)

    本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) 本篇文章讲解 Conf ...

随机推荐

  1. Spring+DBUnit+H2----项目单元测试

    http://yugouai.iteye.com/blog/1879337 今天够郁闷的,早上调好的代码,到中午调试不同了,分析不出问题,H2的JDBC报错:org.h2.jdbc.JdbcSQLEx ...

  2. (C++)UrlEncode的标准实现

    http://blog.163.com/xiaopengyan_109/blog/static/149832173201072685539394/ 地址栏传中文参数后是什么编码格式 网页中的表单使用P ...

  3. Linux文件类型(学习笔记六)

    一.Linux下的文件类型 普通文件:在由 ls –al 所显示出来的属性方面,第一个属性为 [ - ] 目录文件:在由 ls –al 所显示出来的属性方面,第一个属性为 [ d ] 设备文件:一般都 ...

  4. pushlet单播与多播

    近期要弄一个消息推送的功能,在网上找了非常多的关于pushlet的文章,尽管写的都非常具体,可是本人看了以后却总认为是模棱两可···不知道怎样下手,终于參考了这些文章中的一些内容,并结合官网的源码.做 ...

  5. C#编写Windows服务程序 (服务端),client使用 消息队列 实现淘宝 订单全链路效果

    需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group oms ...

  6. plsql 连接oracle数据库的2种方式

      plsql 连接oracle数据库的2种方式 CreationTime--2018年8月10日09点50分 Author:Marydon 方式一:配置tnsnames.ora 该文件在instan ...

  7. 公钥私钥与SSL的握手协议(转)

    一,公钥私钥1,公钥和私钥成对出现2,公开的密钥叫公钥,只有自己知道的叫私钥3,用公钥加密的数据只有对应的私钥可以解密4,用私钥加密的数据只有对应的公钥可以解密5,如果可以用公钥解密,则必然是对应的私 ...

  8. 搭建Weblogic服务器

    安妮,我的小熊熊在ne....... 01.安全设置 service iptables stop chkconfig iptables off    #关闭防火墙,只是建议,为了简便操作 setenf ...

  9. Linux链接文件ln

    链接命令:ln 生成链接文件   ln [源文件] [目标目录] : 创建硬链接 -s:创建软链接    硬链接特征:(ln )1.拥有相同的i节点和存储block快,可以看做是同一个文件2.可通过i ...

  10. 基于FFmpeg的音频编码(PCM数据编码成AAC android)

    概述 在Android上实现录音,并利用 FFmpeg将PCM数据编码成AAC. 详细 代码下载:http://www.demodashi.com/demo/10512.html 之前做的一个demo ...