我们还是先从官网文档开始学习,如下图所示,我们可以搞一个测试配置类,来验证是否真的可以通过代码来自定义配置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. RPC框架研究(二)Hadoop源代码-1

    报名了阿里中间件性能大赛,我来说是一个全新的挑战.一切从空白学起,比赛的过程也是学习的过程 是的.想让自己学好.给自己报一个比赛吧~ 就像当初学围棋,也是报了围棋比赛,为了不至于输的太慘.一个星期里学 ...

  2. 火狐浏览器FireFox 如何将整个网页保存为图片

    使用Friefox的Pearl Cresent Page Saver插件 如图所示网页有很长的滚动条 点击右下角的该插件选项,将整个页面保存为图片 在桌面上得到了这样一个文件,大小是1263×6083 ...

  3. 谈谈Boost网络编程(2)—— 新系统的设计

    写文章之前.我们一般会想要採用何种方式,是"开门见山",还是"疑问式开头".写代码也有些类似.在编码之前我们须要考虑系统总体方案,这也就是各种设计文档的作用.在 ...

  4. Mount 挂载错误mount:block device /dev/sr0 is write – protected , mounting read-only

    Mount 挂载错误mount:block device /dev/sr0 is write – protected , mounting read-only 安装虚拟机出现以下提示: mount:b ...

  5. Android Studio关于USB device not found的解决的方法

    Android Studio关于USB device not found的解决的方法 我们使用Android Studio进行Android开发时.当我们使用真机进行调试时.非常可能会出现USB de ...

  6. with/as上下文管理器

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python学习手册 868 #with/as上下文管理器 #with语句的基本格式: with open( ...

  7. HTTP 304状态分析

       在看http log日志发现很多304状态的标识 HTTP 304: Not Modified   ###请求后读取本地缓存的文件标准解释是:Not Modified 客户端有缓冲的文档并发出了 ...

  8. OpenStack网络介绍

    OpenStack网络介绍     OpenStack里面的网络相对复杂.经常有人对几个网络概念搞混淆.因此,本文对OpenStack里面的Provider network 和 Tenant netw ...

  9. 【J2EE之web应用】java集群概念

    在学习web应用进行部署的时候,遇到一个名词java集群,(事实上遇到非常多名词╭(╯^╰)╮~~~).不懂意思就查一查! 在这里做个笔记! 没有什么高深见解,就搞明确几个概念,java集群的特点 . ...

  10. Spring框架文档与API(4.3.6版本)

    http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ Table of Contents I ...