LB方案分类
目前主流的LB方案可分成两类:一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于后者,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。
1. Ribbon是什么?它解决了什么问题?
Ribbon is a client side IPC library that is battle-tested in cloud. It provides the following features
- Load balancing
- Fault tolerance
- Multiple protocol (HTTP, TCP, UDP) support in an asynchronous and reactive model
- Caching and batching
2.它的模块有哪些?功能分别是什么?
- ribbon: APIs that integrate load balancing, fault tolerance, caching/batching on top of other ribbon modules and Hystrix
- ribbon-loadbalancer: Load balancer APIs that can be used independently or with other modules
- ribbon-eureka: APIs using Eureka client to provide dynamic server list for cloud
- ribbon-transport: Transport clients that support HTTP, TCP and UDP protocols using RxNetty with load balancing capability
- ribbon-httpclient: REST client built on top of Apache HttpClient integrated with load balancers (deprecated and being replaced by ribbon module)
- ribbon-example: Examples
- ribbon-core: Client configuration APIs and other shared APIs
3.哪些模块应用到生产了?
- ribbon-core: deployed at scale in production
- ribbon-eureka: deployed at scale in production
- ribbon-evcache: not used
- ribbon-guice: not used
- ribbon-httpclient: we use everything not under com.netflix.http4.ssl. Instead, we use an internal solution developed by our cloud security team
- ribbon-loadbalancer: deployed at scale in production
- ribbon-test: this is just an internal integration test suite
- ribbon-transport: not used
- ribbon: not used
4.主要类及其层次结构
说明:
DynamicServerListLoadBalancer:A LoadBalancer that has the capabilities to obtain the candidate list of servers using a dynamic source. i.e. The list of servers can potentially be changed at Runtime. It also contains facilities wherein the list of servers can be passed through a Filter criteria to filter out servers that do not meet the desired criteria.
IClientConfig:Defines the client configuration used by various APIs to initialize clients or load balancers and for method execution. The default implementation is {@link DefaultClientConfigImpl}
IRule:Interface that defines a "Rule" for a LoadBalancer. A Rule can be thought of as a Strategy for loadbalacing. Well known loadbalancing strategies include Round Robin, Response Time based etc.
IPing:Interface that defines how we "ping" a server to check if its alive
ServerList:Interface that defines the methods sed to obtain the List of Servers
ServerListFilter:This interface allows for filtering the configured or dynamically obtained List of candidate servers with desirable characteristics.
ServerListUpdater:strategy for {@link com.netflix.loadbalancer.DynamicServerListLoadBalancer} to use for different ways of doing dynamic server list updates
与Eureka结合使用
当与Eureka组合使用Ribbon时,
server使用DiscoveryEnabledServer实现,Servers that were obtained via Discovery and hence contain meta data in the form of InstanceInfo。
ServerList
接口会使用DiscoveryEnabledNIWSServerList
实现,The server list class that fetches the server information from Eureka client. ServerList is used by {@link DynamicServerListLoadBalancer} to get server list dynamically.
ServerListFilter
使用DefaultNIWSServerListFilter实现,The Default NIWS Filter - deals with filtering out servers based on the Zone affinity and other related properties。
ServerListUpdater使用EurekaNotificationServerListUpdater,A server list updater for the {@link com.netflix.loadbalancer.DynamicServerListLoadBalancer} that utilizes eureka's event listener to trigger LB cache updates。封装了LegacyEurekaClientProvider:A legacy class to provide eurekaclient via static singletons。
IPing使用NIWSDiscoveryPing实现,"Ping" Discovery Client,i.e. we dont do a real "ping". We just assume that the server is up if Discovery Client says so。
参考文章
【1】https://github.com/Netflix/ribbon
【2】http://blog.csdn.net/neosmith/article/details/53967330