先了解几个名词:
1、RPC(Remote Rroccess Call即为远程过程的调用)

出现背景:单台服务器器处理能力不足,吞吐量受到限制,服务提供方的压力过大,因此需要对不同服务器之间进行分组,以隔离不同的业务,避免相互影响。服务消费者就可以根据相应的负载均衡策略,选择其中的一台机器进行调用。


2、对象序列化
无论什么数据都是要转成二进制在网络上传输的。将对象转为二进制的过程称为对象的序列化。将二级制流恢复为对象的过程称为对象的反序列化。
ByteArrayOutputStream os; Java 序列化:ObjectOutputStream out; out.write(obj);
Hession 序列化:HessionOutput out; out.writeObject(obj); Hession 反序列化:
ByteArrayInputStream is; HessionInput hi = new HessionInput(is);
基于TCP协议实现RPC
基于HTTP协议的RPC

3、负载均衡(同一个业务部署在不同机器上,来提高系统的可用性)


当规模较小时可以采用硬编码的方式来将本地的服务地址和配置写在代码中,也可以通过硬件设备如F5等,或者采用LVS或者Nginx等软件解决方案。但是依赖硬件或者Nginx来调度,单点故障也会凸显,一旦服务器或者负载均衡器宕机,依赖它的所哟服务均失效。也就是说当一个服务器宕机之后,Nginx
还会转到那台已经宕机的机器上。无法通知客户端,告诉客户端这个机器宕机了,不能访问了,请访问其他机器。

以上存在的问题,如果服务越来越多,规模越来越大,对应的机器就越来越庞大。如下图:


此时,就需要一个可以动态注册和获取服务信息的地方,来统一管理服务器名称和对应的服务列表信息,即服务配置中心(zooKeeper…)。当服务者启动时,将服务器提供的服务名称,服务地址注册到配置中心去。消费者通过注册中心或得需要调用的机器列表,通过相应的负载均衡算法来选择一台服务器调用。

以上消费者只是在第一次调用时访问配置中心,然后缓存到本地,直到服务地址变更(机器上线或者下线),这种无中心化的结构解决了单点故障,同时也减轻了配置中心的压力。


常见的负载均衡算法:

* 轮询法(Round Robin)服务器上线后者宕机,算法无法得知。另外要付出额外的性能代价来保证轮询算法的支持,需要加锁来保证正确的轮询,吞吐量明显下降
* 随机法(Random)随机的次数越多,越接近轮训法,那么我们还需要用付出一定代价的轮询算法吗!
*
源地址哈希法(Hash)用客户端的IP地址的Hash值%服务器列表到的大小,同一个IP的客户端挡在服务器列表不变的情况下,每次都会映射到同一台服务器上访问。这种特性可以在服务消费者和提供者之间建立有状态session回话。
* 加权轮询法(Weight Round Robin)增加MAP中权重高的服务器的个数,给配置高,负载底的系统更高的权重。
* 加权随机法(Weight Random)
* 最小连接数法(Least Connections)
分布式和集群的区别:

分布式:不同的业务功能部署在不同的机器上,提高性能,解决高并发问题,解决了单点故障。
集群:相同的业务部署在多台机器上,提高系统可用性,存在单点故障

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信