两种负载均衡
软件负载均衡:nginx,lvs
硬件负载均衡:F5
我们只关注软件负载均衡,
第一层可以用DNS,配置多个A记录,让DNS做第一层分发。
第二层用比较流行的是反向代理,核心原理:代理根据一定规则,将http请求转发到服务器集群的单一服务器上。
客户端负载均衡
在客户端负载均衡中,所有的客户端节点都有一份自己要访问的服务端地址列表,这些列表统统都是从服务注册中心获取的;
服务端负载均衡
在服务端负载均衡中,客户端节点只知道单一服务代理的地址,服务代理则知道所有服务端的地址。
Ribbon组成
看官网首页:https://github.com/Netflix/ribbon
ribbon-core: 核心的通用性代码。api一些配置。
ribbon-eureka:基于eureka封装的模块,能快速集成eureka。
ribbon-examples:学习示例。
ribbon-httpclient:基于apache httpClient封装的rest客户端,集成了负载均衡模块,可以直接在项目中使用。
ribbon-loadbalancer:负载均衡模块。
ribbon-transport:基于netty实现多协议的支持。比如http,tcp,udp等。
原理
- 拦截请求。
- 获取url。
- 通过url中 serviceName 获取 List。
- 通过负载均衡算法选取一个ServiceInstance。
- 替换请求,将原来url中的 serviceName换成ip+port。
总结
- 几种负载均衡。(硬,软(服务端,客户端(Ribbon)))
- Ribbon可以单独使用。需要提供服务地址列表。
- 原理。拦截请求,然后替换地址(servicename到ip+port)。
- 源码。ILoadBalancer,Map<服务名,ILoadBalancer>
- @LoadBalanced,拦截器。(LoadBalancerInterceptor中intercept)
- 自定义配置:java配置,yml配置。
- 自定义负载均衡策略