介绍:Ribbon是客户端负载平衡器,可让您对HTTP和TCP客户端的行为进行大量控制。Feign已经使用了Ribbon。
Ribbon中的中心概念是指定客户端的概念。每个负载平衡器都是组件的一部分,这些组件可以一起工作以按需联系远程服务器,并且该组件具有一个名称,您可以将其命名为应用程序开发人员(例如,使用@FeignClient批注)。根据需要,Spring Cloud通过使用RibbonClientConfiguration为每个命名客户端创建一个新的集合作为ApplicationContext。它包含(除其他事项外)一个ILoadBalancer,一个RestClient和一个ServerListFilter。
Maven坐标G org.springframework.cloud
,A spring-cloud-starter-netflix-ribbon
自定义Ribbon客户端:您可以使用<client>.ribbon.*
中的外部属性来配置Ribbon客户端的某些位,这与本机使用Netflix API相似,不同之处在于可以使用Spring Boot配置文件。
@Configuration
@RibbonClient(name = "custom", configuration = CustomConfiguration.class)
public class TestConfiguration {
}
在这种情况下,Ribbon客户端由RibbonClientConfiguration中已经存在的组件以及CustomConfiguration中的任何组件组成(后者通常会覆盖前者)。另外注意CustomConfiguration
必须标注@Configuration
注解并且不能被@ComponentScan
扫描到,否则将被所有@RibbonClients
共享
Spring Cloud Netflix默认为Ribbon提供了以下的类
我们可以通过像下面一样重写上面的类,然后把它放到@RibbonClient
中(上面)
@Configuration(proxyBeanMethods = false)
protected static class FooConfiguration {
@Bean
public ZonePreferenceServerListFilter serverListFilter() {
ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter();
filter.setZone("myTestZone");
return filter;
}
@Bean
public IPing ribbonPing() {
return new PingUrl();
}
}
使用@RibbonClients
自定义所有Ribbon客户端:
@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {
public static class BazServiceList extends ConfigurationBasedServerList {
public BazServiceList(IClientConfig config) {
super.initWithNiwsConfig(config);
}
}
}
@Configuration(proxyBeanMethods = false)
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;
}
}
通过Properties自定义Ribbon客户端,从Spring Cloud Netflix1.2.0开始支持通过设置属性支持Ribbon客户端(兼容官方属性)github文档
可配置的属性参考,这些属性中定义的类优先于使用@RibbonClient(configuration = MyRibbonConfig.class)定义的bean和Spring Cloud Netflix提供的默认值。
属性配置栗子
Ribbon结合Eureka一起使用:当Eureka 也在类路径下时,ribbonServerList
被重写为DiscoveryEnabledNIWSServerList
,IPing
接口也被替换成NIWSDiscoveryPing
脱离Eureka使用Ribbon:
直接使用Ribbon API
public class MyClass {
@Autowired
private LoadBalancerClient loadBalancer;
public void doStuff() {
ServiceInstance instance = loadBalancer.choose("stores");
URI storesUri = URI.create(String.format("https://%s:%s", instance.getHost(), instance.getPort()));
// ... do something with the URI
}
}
Ribbon的缓存配置:每个Ribbon的命名客户端都有一个相应的子应用程序上下文,Spring Cloud会维护该上下文。这个子应用程序上下文是懒加载的,第一次客户请求时候加载。可以设置为启动时候加载,如下