客户端负载均衡器:Ribbon
Ribbon是一个客户端负载平衡器,它可以很好地控制HTTP和TCP客户端的行为。Feign已经使用Ribbon,所以如果你使用@FeignClient
,那么这一节也适用。
Ribbon中的中心概念是命名客户端的概念。每个负载平衡器是组合的组合的一部分,它们一起工作以根据需要联系远程服务器,并且集合具有您将其作为应用程序开发人员(例如使用@FeignClient
注释)的名称。Spring Cloud使用RibbonClientConfiguration
为每个命名的客户端根据需要创建一个新的集合,作为ApplicationContext
。这包含(除其他外)ILoadBalancer
,RestClient
和ServerListFilter
。
如何加入Ribbon
要在项目中包含Ribbon,请使用组org.springframework.cloud
和artifact id spring-cloud-starter-ribbon
的启动器。有关 使用当前的Spring Cloud发布列表设置构建系统的详细信息,请参阅Spring Cloud项目页面。
自定义Ribbon客户端
您可以使用<client>.ribbon.*
中的外部属性来配置Ribbon客户端的某些位,这与使用Netflix API本身没有什么不同,只能使用Spring Boot配置文件。本机选项可以在CommonClientConfigKey
(功能区内核心部分)中作为静态字段进行检查。
Spring Cloud还允许您通过使用@RibbonClient
声明其他配置(位于RibbonClientConfiguration
之上)来完全控制客户端。例:
@Configuration
@RibbonClient(name = "foo", configuration = FooConfiguration.class)
public class TestConfiguration {
}
在这种情况下,客户端由RibbonClientConfiguration
中已经存在的组件与FooConfiguration
中的任何组件组成(后者通常会覆盖前者)。
警告
FooConfiguration
必须是@Configuration
,但请注意,主应用程序上下文不属于@ComponentScan
,否则将由@RibbonClients
共享。如果您使用@ComponentScan
(或@SpringBootApplication
),则需要采取措施避免包含(例如将其放在一个单独的,不重叠的包中,或者指定要在@ComponentScan
)。
Spring Cloud Netflix默认提供以下功能区(BeanType
beanName:ClassName
)的bean:
IClientConfig
ribbonClientConfig:DefaultClientConfigImpl
IRule
ribbonRule:ZoneAvoidanceRule
IPing
ribbonPing:NoOpPing
ServerList<Server>
ribbonServerList:ConfigurationBasedServerList
ServerListFilter<Server>
ribbonServerListFilter:ZonePreferenceServerListFilter
ILoadBalancer
ribbonLoadBalancer:ZoneAwareLoadBalancer
ServerListUpdater
ribbonServerListUpdater:PollingServerListUpdater
创建一个类型的bean并将其放置在@RibbonClient
配置(例如上面的FooConfiguration
)中)允许您覆盖所描述的每个bean。例:
@Configuration
public class FooConfiguration {
@Bean
public IPing ribbonPing(IClientConfig config) {
return new PingUrl();
}
}
这将PingUrl
替换为PingUrl
。
使用属性自定义Ribbon客户端
从版本1.2.0开始,Spring Cloud Netflix现在支持使用属性与Ribbon文档兼容来自定义Ribbon客户端。
这允许您在不同环境中更改启动时的行为。
支持的属性如下所示,应以<clientName>.ribbon.
为前缀:
NFLoadBalancerClassName
:应实施ILoadBalancer
NFLoadBalancerRuleClassName
:应实施IRule
NFLoadBalancerPingClassName
:应实施IPing
NIWSServerListClassName
:应实施ServerList
NIWSServerListFilterClassName
应实施ServerListFilter
注意
在这些属性中定义的类优先于使用@RibbonClient(configuration=MyRibbonConfig.class)
定义的bean和由Spring Cloud Netflix提供的默认值。
要设置服务名称users
的IRule
,您可以设置以下内容:
application.yml
users:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
使用Ribbon与Eureka
当Eureka与Ribbon结合使用(即两者都在类路径上)时,ribbonServerList
将被扩展为DiscoveryEnabledNIWSServerList
,扩展名为Eureka的服务器列表。它还用NIWSDiscoveryPing
替换IPing
接口,代理到Eureka以确定服务器是否启动。默认情况下安装的ServerList
是一个DomainExtractingServerList
,其目的是使物理元数据可用于负载平衡器,而不使用AWS AMI元数据(Netflix依赖的是)。默认情况下,服务器列表将使用实例元数据(如远程客户机集eureka.instance.metadataMap.zone
)中提供的“区域”信息构建,如果缺少,则可以使用服务器主机名中的域名作为代理对于区域(如果设置了标志approximateZoneFromHostname
)。一旦区域信息可用,它可以在ServerListFilter
中使用。默认情况下,它将用于定位与客户端相同区域的服务器,因为默认值为ZonePreferenceServerListFilter
。默认情况下,即通过eureka.instance.metadataMap.zone
,客户端的区域与远程实例的方式相同。
注意
设置客户端区域的正统“archaius”方式是通过一个名为“@zone”的配置属性,如果可用,Spring Cloud将优先使用所有其他设置(请注意,该键必须被引用)在YAML配置中)。
注意
如果没有其他的区域数据源,则基于客户端配置(与实例配置相反)进行猜测。我们将eureka.client.availabilityZones
,它是从区域名称到区域列表的地图,并拉出实例本身区域的第一个区域(即eureka.client.region
,默认为“us-east-1”,为与本机Netflix的兼容性)。
示例:如何使用Ribbon不使用Eureka
Eureka是抽象远程服务器发现的一种方便的方式,因此您不必在客户端中对其URL进行硬编码,但如果您不想使用它,Ribbon和Feign仍然很适用的。假设你已经为“store”声明了一个@RibbonClient
,并且Eureka没有被使用(甚至不在类路径上)。Ribbon客户端默认为已配置的服务器列表,您可以提供这样的配置
application.yml
stores:
ribbon:
listOfServers: example.com,google.com
示例:在Ribbon中禁用Eureka使用
设置属性ribbon.eureka.enabled = false
将明确禁用在Ribbon中使用Eureka。
application.yml
ribbon:
eureka:
enabled: false
直接使用Ribbon API
您也可以直接使用LoadBalancerClient
。例:
public class MyClass {
@Autowired
private LoadBalancerClient loadBalancer;
public void doStuff() {
ServiceInstance instance = loadBalancer.choose("stores");
URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
// ... do something with the URI
}
}
缓存Ribbon配置
每个Ribbon命名的客户机都有一个对应的子应用程序上下文,Spring Cloud维护,这个应用程序上下文在第一个请求中被延迟加载到命名的客户端。可以通过指定Ribbon客户端的名称,在启动时,可以更改这种惰性加载行为,从而热切加载这些子应用程序上下文。
application.yml
ribbon:
eager-load:
enabled: true
clients: client1, client2, client3
本文同步分享在 博客“DencyCheng”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。