Spring Cloud 通过代码自定义配置Ribbon
我们还是先从官网文档开始学习,如下图所示,我们可以搞一个测试配置类,来验证是否真的可以通过代码来自定义配置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的更多相关文章
- spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?
Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...
- Spring Cloud 系列之 Apollo 配置中心(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Apollo 配置中心(一) 本篇文章讲解 Apollo 部门管理.用户管理.配置管理.集群管理. 点击链接观看:Ap ...
- Spring Cloud之——Config(配置中心)
Spring Cloud Config(配置中心) 大家好,有一段时间没有写技术博客了.由于工作上的事情,这方面很难分配时间.近几年随着服务化的兴起,一批服务化的框架应运而生,像dubbo,thrif ...
- Spring Cloud 入门教程 - 搭建配置中心服务
简介 Spring Cloud 提供了一个部署微服务的平台,包括了微服务中常见的组件:配置中心服务, API网关,断路器,服务注册与发现,分布式追溯,OAuth2,消费者驱动合约等.我们不必先知道每个 ...
- Spring Boot + Spring Cloud 实现权限管理系统 配置中心(Config、Bus)
技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...
- SpringCloud实战之初级入门(三)— spring cloud config搭建git配置中心
目录 1.环境介绍 2.配置中心 2.1 创建工程 2.2 修改配置文件 2.3 在github中加入配置文件 2.3 修改启动文件 3. 访问配置中心 1.环境介绍 上一篇文章中,我们介绍了如何利用 ...
- Spring Cloud Eureka集群配置及注意事项(Greenwich版本)
Spring Cloud Eureka集群配置及注意事项(Greenwich版本) 一·概述 Spring Cloud Netflix Eureka 是一个提供服务注册与发现的套件.服务提供者只需要将 ...
- Spring Cloud 系列之 Config 配置中心(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Config 配置中心(一) 本篇文章讲解 Config 如何实现配置中心自动刷新. 配置中心自动刷新 点击链接观看: ...
- Spring Cloud 系列之 Config 配置中心(三)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) 本篇文章讲解 Conf ...
随机推荐
- java泛型中extends 和 super的区别
一般对泛型中extends 和 super 的区别是这样介绍的: 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 < ...
- 微信公众号开发之如何使用JSSDK
微信开发交流群:148540125 欢迎留言.转发.打赏 系列文章参考地址 极速开发微信公众号 项目源码参考地址 点我点我--欢迎Start 查看公众号是否有使用JSSDK的权限 服务号.订阅号可以通 ...
- 解决Windows Git Bash中文乱码问题
在git 安装目录 etc 下面 添加以下配置信息 1,/etc/gitconfig: [gui] encoding = utf-8 #代码库统一用urf-8,在git gui中可以正常显示中文 [i ...
- Opera Unit如何自定义My Opera的网页界面
1 双击Opera Unite Home进入你的个人主页 2 点击你的头像进入你的个人信息设置页面,然后点击右上角的设置图标 3 在下拉菜单中选择"Customize design" ...
- UE查找和替换技巧实例
1 删除多余的空行 如果是在WORD中,则查找^p^p替换为^p. 如果是在EXCEL里,则为全部选中,然后点击编辑,定位,定位条件,空值. 将全部选中空白的行,如图所示 再次点击编辑,删除,删除整行 ...
- Linux学习笔记--which命令(搜索命令的命令)
which.哪一个的意思.作用是从PATH环境变量指定的路径中,搜索命令所在位置及命令别名. which命令特点: 1) "which" 命令仅仅能查找系统命令.不能搜索普通文件. ...
- 87. 再谈变体型Variant
在85. BASIC和LotusScript中的Variant一文中.我提到了BASIC风格的语言中的变体型Variant.由于下述种种原因.在LotusScript中常常要用到变体型. 1. ...
- Grails开发环境的高速搭建
Grails开发环境的高速搭建 1 JAVA环境变量的设置和Grails设置环境变量 个人參考 JAVA_HOME =E:\kaifa\Java\jdk7_32 GRAILS_HOME =E:\kai ...
- PHP高级教程-包含
PHP 包含文件 PHP include 和 require 语句 在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容. include 和 require 语句用于在执 ...
- Hibernate(十三)命名查询-批量处理和调用存储过程
一.命名查询 HQL语句混杂在代码之间将破坏代码的可读性 Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式称为命名查询 二.建立数据表和持久化类 建立数据表 create ...