HTTP 与 RPC 的关系
RPC 远程过程调用,全称:Remote Procedure Call。个人理解这是一个抽象概念,而非类似 RPC 就是 Dubbo 底层使用的服务间的通信方式这种说法。HTTP 也是一种 RPC 调用方式,与 Dubbo 协议的最明显的区别是前者是短连接,而后者是长连接,且都是要基于 TCP 协议才能实现。也可以说,HTTP 与 Dubbo 都是 RPC 调用的子集。
负载均衡模式
可以分为硬件负载均衡与软件负载均衡,但一般的项目来说请求量还达不到需要使用硬件来做负载均衡,基本都是在软件层面实现。下图是软件层面实现负载均衡的两种方式:
常见负载均衡算法
- 随机
- 轮询:默认实现
- 加权轮询:为高配置的服务器配置更高的访问权重,均衡不同配置服务器之间的压力
- 地址 hash:通过客户端的请求地址的 Hash 值对服务节点总数进行取模定位到某个服务器节点后访问
- 最小链接数:请求均衡但处理压力不一定均衡。根据服务器的具体情况如请求积压数,将当前请求分配到压力最小的服务器上
SpringCloud RPC 组件介绍
SpringCloud 集成的 RPC 通信组件底层一般都是采用的 HTTP 协议。如:
- ribbon:netflix 开源,目前已停止维护。在 Spring 官方推出自己的负载均衡组件之前,一直集成的 ribbon
- load-balancer:Spring 官方推出的用于替代 Ribbon
- openfeign:基于 netflix 开源但停止维护的 feign(netflix feign 又基于 Ribbon)进行了增强,使得支持 SpringMVC 的一些注解功能,进行远程调用就如在调用本地方法一样。因为基于 Ribbon,所以配置的 Ribbon 负载均衡策略会生效在 openfeign 上。
这些组件采用的负载均衡模式都属于客户端负载均衡,后面会逐一介绍这三个组件的 Hello World。在实际开发中(至少我司),使用最多的是 openfeign。