我们还是先从官网文档开始学习,如下图所示,我们可以搞一个测试配置类,来验证是否真的可以通过代码来自定义配置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. POJ2762 Going from u to v or from v to u? 强连通+缩点

    题目链接: poj2762 题意: 给出一幅单向图.问这张图是否满足   随意两点ab 都能 从a到达b 或  从b到达a 题解思路: 推断一幅图是否满足弱连通 首先想到的是将图中的 强连通分量(能互 ...

  2. MySQL数据源在Spring中的配置

    干脆把MySQL的数据源配置也一起放这里,以备不时之需. MySQL的驱动包可以从这里 http://pan.baidu.com/s/1d02aZ 下载. 以下粗体部分是需要你根据实际情况调整的. & ...

  3. PS中标尺工具在哪里

    打开photoshop应用程序,然后在PS菜单中点击“视图——标尺”选项即可打开ps标尺栏. 单位设置:      按Ctrl+K快捷键会弹出“首选项”对话框,你选择“单位与标尺”项,在“单位”一栏里 ...

  4. iOS中ActionSheet和Alert的区别

    首先,样子长得就不一样 看下图:

  5. 第一节,学习cocos2d-x的前期准备

    1,我用的mac系统,在mac系统上装上cocos2d-x的模板 2,用doxygen工具装上API,这个非常重要,没有API的开发不叫开发,因此我们要习惯看API 3,知道怎么查看cocos2d-x ...

  6. 选择合适的Linux版本

    以下纯属个人想法:欢迎指正 1.Linux桌面系统,首选Ubuntu.当然Ubuntu也有服务器版本,不建议使用 2.服务端的Linux稳定的服务器系统,在企业中从事运维工作Redhat或者CentO ...

  7. 【java读书笔记】JSTL,高速精通

    JSTL并非什么新颖的技术并且非常easy,甚至有人觉得JSTL已经过时了.可是我觉得它既然存在,就有存在的道理.作为技术人员就应该知道它们是什么,怎么使用,有什么长处. JSTL包括两部分:标签库和 ...

  8. Ubuntu apt-get方式安装Subversion

    按照官方文档 http://subversion.apache.org/packages.html 使用apt-get安装方式: 1.安装Subversion: sudo apt-get instal ...

  9. EXCEPTION-JS

      CreateTime--2016年11月22日13:00:55Author:Marydon 声明:异常类文章主要是记录了我遇到的异常信息及解决方案,解决方案大部分都是百度解决的,(这里只是针对我遇 ...

  10. myeclipse debug不显示变量值解决的方法

    依次点击打开mycelipse菜单选项:"Window" - "Preferences" - "Java" - "Editor&q ...