概述
Finchley.SR2版本的官方文档:
https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#spring-cloud-ribbon
示例
新建子模块
父模块microservice-spring-cloud,右键新建Maven Module : micorservice-consumer-movie-ribbon-customrule-properties
查看父模块的pom.xml
子模块工程结构
子模块加入依赖
micorservice-consumer-movie-ribbon-customrule-properties子模块的pom.xml加入spring-cloud-starter-netflix-eureka-client依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
配置文件增加配置
根据官网的指导可知,如果我们希望在该微服务中设置请求某个服务的规则,配置
application.yml中增加如下配置
#使用属性自定义Ribbon配置 MICROSERVICE-PROVIDER-USER: ribbon: NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
这里我们使用随机的方式,所以设置了 RandomRule 。
验证
Step1:启动Eureka Server微服务
Step2: 启动两个Provider微服务
Step3:启动该微服务作为消费者,通过Eureka Server上的地址去调用注册在Eureka上的两个provider微服务,观察负载均衡策略
经过测试,如果设置了NIWSServerListClassName,那么调用的服务端的微服务的名字必须大写,否则会找不到微服务。 No instances available for microservice-provider-user。 不过看官网的例子服务名也是小写的,这里还不是很清楚,请大家慎重看待我这里的结论,不一定正确,欢迎指正
这样设置,测试了下结果还是像轮询的方式,先把 NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList配置项去掉,重新验证下
在去掉NIWSServerListClassName的前提下
如果服务名还是大写的话,看测试结果 还是轮询的。
如果把服务名改成小写,测试结果
看结果,是随机分发的策略。
目前还搞不懂Spring Cloud 和Ribbon 是如何协调工作的,先记录下结果,后续再研究。 如果有不对的地方,请指正,谢谢。
Spring Boot和Spring Cloud 的版本信息
源码
https://github.com/yangshangwei/SpringCloudMaster