3,Ribbon的工作
分为两步:
1)第一步有限选择Eureka服务器,它优先选择同一个Zone并负载较少的服务器,
2)第二步在根据用户指定的策略,在从服务器取到的服务注册列表中选择一个地址。其中Ribbon提供了多重策略,例如轮询round robin,随机Random,根据相应时间加权等。
4.2,代码
这里只贴出关键的消费者的重要代码:
工程名称:microservice-consumer-provider-ribbon
应用程序类ConsumerMovieProviderApplication代码如下:
配置Ribbon策略类TestConfiguration,注意,这个类的位置不能再应用类的目录或其子目录下,这是需要强调的。
最后,我们来看我们的测试接口类MovieController,我们把所加载的微服务的实例名和端口给打印出来类代码如下:
我们的接口方法为test()方法,分别选择了加载上面已经在Eureka Server中所注册的User微服务,实例名分别为:microservice-provider-user 和 microservice-provider-user2 ,那么我们通过浏览器多测请求接口来查看能打印出什么。
我这里请求了接口5次,打印出的内容为:
我们可以看到,调用的实例“微服务提供商用户”顺序为:7901,7901,7900,7900,7900,7901,7901,7900,所以这个按照我们配置的策略-RandomRule(随机策略)来随机分配用户提供者的。
好,接着看实例“微服务提供商,用户2”的调用顺序为:7902,7903,7902,7903,7903,7902,7902,7903,所以这个也是按照我们配置的随机策略来随机分配用户提供者的。
但是,我们上面的Ribbon策略类时放在非Application目录及其子目录下的,那如果我们要放在期目录或子目录下,那么办。这里我就放在与Application类同目录下。
1)首先,我们需要在Application同目录下增加一个注解类 ExcludeFromComponentScan,如下代码:
public @interface ExcludeFromComponentScan {
}
这个类没有内容
。2)其次,我们需要在Application类上面增加注解@ComponentScan,如下所示:
说明一下,这里添加的这个注解是:排除掉有注解ExcludeFromComponentScan的策略类。
4)最后,我们启动这个服务,并在浏览器中调用接口,看看输出结果能否成功。
结果:实例“微服务提供商用户”调用顺序:7900,7901,7900,7901,7900,7901,7900,7901,很明显这不是随机策略,的采用轮询的英文策略
实例“微服务提供商,用户2 “调用顺序:7903,7903,7903,7902,7903,7902,7903,7903,很明显这是随机策略因为我们有配置排除策略的模式,在应用类上,我们注解了@RibbonClient,并且将策略TestConfiguration配置应用到了实例“微服务提供商,用户2”上。
5,Ribbon客户端配置文件配置
上面已经做了Java代码配置,现在我们来进行配置文件配置,首先先前上面Java配置的工程复制一个工程,然后删除策略类TestConfiguration,和注解类ExcludeFromComponentScan;同时将Application类的注解@RibbonClient和@ComponentScan去掉。完成这些之后,开始进行配置。
上面的英文是摘自官网API文档中的部分,“定制Ribbon Client”,其中有几个关键点,
1)您可以在.ribbon中配置... *
这里的意思就是说:你可以配置外部属性来配置Ribbon Client,在配置外部属性时应该使用.ribbon。*的格式来配置,这里的其实就是上面Java配置中对应的实例名,如:微服务提供商用户。
配置完成之后,就可以启动Appcliation,然后再到浏览器中访问,并查看结果,结果如下:
结果:我们上面配的实例是”微服务提供商用户”,在打印出的结果,我们可以看到打印结果7901和7900是随机的;而实例”微服务提供商-user2” 来自的访问结果明显是有规则的7902,7903,是轮询策略。