1. 引入:
因为其与Eureka捆绑,因此可以直接以下形式引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2. 全局规则配置:
(1) 主启动类上,直接配置默认规则
@SpringBootApplication
@EnableEurekaClient
@RibbonClients(defaultConfiguration = RandomRule.class)
public class OrderApp {
以上RandomRule.class,只是规则的简化配置,完整的配置如下:
@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {
public static class BazServiceList extends ConfigurationBasedServerList {
public BazServiceList(IClientConfig config) {
super.initWithNiwsConfig(config);
}
}
}
@Configuration
class DefaultRibbonConfig {
@Bean
public IRule ribbonRule() {
return new BestAvailableRule();
}
@Bean
public IPing ribbonPing() {
return new PingUrl();
}
@Bean
public ServerList<Server> ribbonServerList(IClientConfig config) {
return new RibbonClientDefaultConfigurationTestsConfig.BazServiceList(config);
}
@Bean
public ServerListSubsetFilter serverListFilter() {
ServerListSubsetFilter filter = new ServerListSubsetFilter();
return filter;
}
}
其中:public IRule ribbonRule() ...,就是配置规则的部分,但可以有更加细节的定制的部分。
以上的配置,虽然简化,但只适用于配置全局负载均衡规则。
3. 根据“服务名”,进行规则配置:
(1). 配置两个不同的“规则配置文件”
//========注意:这个两个文件的类路径,不可以被@ComponentScan扫描到!!!==============
@Configuration
public class MyRuleConf{
@Bean
public IRule randomRule(){
return new RandomRule();
}
}
//=====================
@Configuration
public class YourRuleConf {
@Bean
public IRule roundRule(){
return new RoundRobinRule();
}
}
(2). 主启动类或一般配置类,进行如下注解:
代码中的payment
和other
是注册在Eureka中两个不同的服务名
@SpringBootApplication
@EnableEurekaClient
//配置多个规则的方式
@RibbonClients(
value = {
@RibbonClient(value = "payment",configuration = YourRuleConf.class)
,@RibbonClient(value = "other",configuration = MyRuleConf.class)
}
)
//配置一个规则的方式:
//@RibbonClient(value = "payment",configuration = YourRuleConf.class)
public class OrderApp {
(3)原理分析:
当RestTemplate在工作时,将会在容器中查找相对应的IRule对象(全局或根据被访问服务名,进行查找相应的对象),而该对象将会相应的Configuration对象产生(Configuration对象可能直接产生在IOC容器中,也可能由Ribbon产生并缓存)。
-- 参考:https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html
网友评论