客户端负载均衡器,控制HTTP和TCP客户端。Feign用Ribbon,用@FeignClient适用。
中心概念:指定客户端的概念。每个负载平衡器是组合的组合的一部分,一起工作,根据需要联系远程服务器,@FeignClient注释,RibbonClientConfiguration为每个命名客户端创建新合奏作为ApplicationContext。包含ILoadBalancer,RestClient和ServerListFilter。
一、如何加入Ribbon
org.springframework.cloud和工件ID spring-cloud-starter-ribbon
二、自定义Ribbon客户端
用
@RibbonClient声明其他配置(RibbonClientConfiguration之上)完全控制客户端。例:
客户端由RibbonClientConfiguration中已经存在的组件与FooConfiguration中任何组件组成(后通常覆盖前)。
FooConfiguration必须是@Configuration,不在主应用程序上下文@ComponentScan中,否则将由@RibbonClients共享。
如用@ComponentScan(或@SpringBootApplication),需采取措施避免包含(例如将其放在一个单独的,不重叠的包中,或者指定要在@ComponentScan)。
Spring Cloud Netflix默认Ribbon(BeanType beanName:ClassName)提供以下bean:
IClientConfig ribbonClientConfig:DefaultClientConfigImpl
IRule ribbonRule:ZoneAvoidanceRule
IPing ribbonPing:NoOpPing
ServerList
ServerListFilter
ILoadBalancer ribbonLoadBalancer:ZoneAwareLoadBalancer
ServerListUpdater ribbonServerListUpdater:PollingServerListUpdater
创建一个类型bean并将其放置@RibbonClient配置(如上面FooConfiguration中)允许覆盖所描述每个bean。
PingUrl代替NoOpPing
三、使用属性自定义Ribbon客户端
Spring Cloud Netflix支持使用属性与Ribbon文档兼容来自定义Ribbon客户端。
不同环境中更改启动时的行为。
NFLoadBalancerClassName:应实施ILoadBalancer
NFLoadBalancerRuleClassName:应实施IRule
NFLoadBalancerPingClassName:应实施IPing
NIWSServerListClassName:应实施ServerList
NIWSServerListFilterClassName应实施ServerListFilter
属性中定义类优先于使用@RibbonClient(configuration=MyRibbonConfig.class)定义的bean和由Spring Cloud Netflix提供的默认值。
设置服务名称users的IRule,您可以设置以下内容:
有关Ribbon提供的实现,请参阅Ribbon文档。
四、在Eureka中使用Ribbon
ribbonServerList扩展为DiscoveryEnabledNIWSServerList,扩展名为Eureka服务器列表。用NIWSDiscoveryPing替换IPing接口,代理Eureka确定服务器是否启动。默认安装的ServerList是一个DomainExtractingServerList,使物理元数据可用于负载平衡器,不使用AWS AMI元数据(Netflix依赖)。
服务器列表默认用实例元数据(如远程客户端集合eureka.instance.metadataMap.zone)中提供的“区域”信息构建,如缺少,则可用服务器主机名中的域名作为代理用于区域(如果设置了标志approximateZoneFromHostname)。区域信息可用,可在ServerListFilter中使用。
定位与客户端相同区域服务器,默认值ZonePreferenceServerListFilter。客户端与远程方式相同eureka.instance.metadataMap.zone
ps1:设置客户端区域的正统“archaius”方式是通过一个名为“@zone”的配置属性,如可用,Spring Cloud优先用所有其他设置(该键必须被引用)YAML配置中)。
ps2:如没有其他区域数据源,则基于客户端配置(与实例配置相反)进行猜测。我们将eureka.client.availabilityZones(从区域名称映射到区域列表),并将实例自己的区域的第一个区域(即eureka.client.region,其默认为“us-east-1”为与本机Netflix的兼容性)。
五、示例:如何使用Ribbon不使用Eureka
方便抽象远程服务器发现,不必在客户端中对URL硬编码,不想使用它,Ribbon和Feign仍适用。假设已经为“商店”申请@RibbonClient,Eureka未被使用(甚至不在类路径上)。Ribbon客户端默认为已配置的服务器列表
六、示例:在Ribbon中禁用Eureka使用
ribbon.eureka.enabled = false
七、直接使用Ribbon API
您也可以直接使用LoadBalancerClient。例:
八、缓存Ribbon配置
Ribbon命名客户端都有相应子应用程序上下文,Spring Cloud维护,上下文第一个请求中被延迟加载到命名的客户端。通过指定Ribbon客户端名称,启动时更改延迟加载,饥饿加载上下文
application.yml
ribbon:
eager-load:
enabled: true
clients: client1, client2, client3