https://blog.csdn.net/wuzhiwei549/article/details/80692278
分布式系统
分布式其实就是分散而已,不等于并行。比如把一个程序,有多步,每一小步在一个系统上执行,然后组合成一个大的系统。更多的时候和并行之间相互配合,提高效率。
优点:增加可靠性,我们将一个大的服务分散成小的服务,降低
增加可扩展性。
分布式系统和微服务
微服务:
和分布式很相似。
是把单体服务拆分成很多独立都小个体,降低耦合性。每个小服务只负责一个功能。
分布式服务顾名思义服务是分散部署在不同的机器上的,一个服务可能负责几个功能,服务之间也是通过rpc来交互或者是webservice来交互的。
微服务可以部署在同一个机器或者不同的机器,把一个整体拆分成很多小的服务单元。
分布式部署的是多个服务器部署多个子模块,可以干不同的事也可以干相同的事。,比如集群部署,它是把相同应用复制到不同服务器上。现在分布式和集群都互相交叉使用,比如一个分布式系统中的一块加集群增加容错性。
微服务相比分布式服务来说,它的粒度更小,服务之间耦合度更低,由于每个微服务都由独立的小团队负责,因此它敏捷性更高,分布式服务最后都会向微服务架构演化,这是一种趋势, 不过服务微服务化后带来的挑战也是显而易见的,例如服务粒度小,数量大,后期运维将会很难
RPC 远程过程调用
https://www.jianshu.com/p/2accc2840a1b
在单独程序中我们可以直接通过创建类的对象然后调用该方法。
然而在分布式系统中,我们把不同的程序放在不同的服务器,而如果我们要调用其他服务器中的方法,我们就不能很方便的直接调用。
这时我们就可以使用RPC。当然你也可以说使用restful调用,但是每次调用都写http请求显然十分麻烦。这时RPC就派上用场了。
所以他的用处就是:
- 解决分布式系统中,服务之间的调用问题。
- 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
RPC 通信过程
RPC通信是直接使用二进制数据包。
这个过程中最重要的就是序列化和反序列化了,因为数据传输的数据包必须是二进制的,你直接丢一个Java对象过去,人家可不认识,你必须把Java对象序列化为二进制格式,传给Server端,Server端接收到之后,再反序列化为Java对象。
序列化和反序列化
序列化是把对象的状态信息(对象)转化为可存储和传输的形式。
比如把对象转化成XML文件或字节等格式,能够传输和存储(对象持久化)。
反序列化就是相反的过程。
dubbo
https://blog.csdn.net/zxljsbk/article/details/81626559
(一个jar包)基于RPC远程过程调用 的分布式服务框架。只有在分布式的时候,才有dubbo这样的需求。让分布式服务之间调用效率更高。
springcloud使用http restful进行通信。
这框架包括zookeeper,zookeeper是他的注册中心。
功能
- 远程调用:使用RPC进行通信。
它主要是使用高效的网络框架和序列化框架,让分布式服务之间调用效率更高。
采用注册中心管理众多的服务接口地址,当你想调用服务的时候只需要跟注册中心询问即可,不用像使用WebService一样每个服务都得记录好接口调用方式。 - 监控中心:实现对服务方和调用方之间运行状态的监控,还能控制服务的优先级、权限、权重、上下线等,
- 注册中心也能实现高可用(ZooKeeper)。
- 负载均衡:采用软负载均衡算法实现对多个相同服务的节点的请求负载均衡。
四大组件:消费者,生产者,注册中心,监控器
zookeeper
zookeeper 注册中心
他是集群的管理者,监视着集群中各个节点的状态,并进行下一步合理操作。负载均衡。
分布式锁
为什么要使用:
在单机引用的时候,如果对共享变量访问我们可以使用多线程,加同步锁。
而分布式是集群,一个应用要部署到多台机器上然后做负载均衡。
如果多用户操作一个变量A,由于变量A是在不同服务器上,而java多线程的锁是基于单个JVM的,所以就不能保证多机器加锁。所以我们就要使用到分布式锁来处理多机器的共享资源。
所以我们要保证在分布式环境下,一次只能单机中的一个线程来操作共享变量。
三种实现:
基于数据库实现:
基于redis缓存实现
SET resource_name my_random_value NX PX 30000
设置过期时间,超过时间自动释放锁
缺点:
如果master加锁后,master会把锁同步到从服务器,而这时 master死机,我们从服务器还没有拿到锁信息就晋升为master,这时就相当于没加上锁。
基于zookeeper实现
zookeiper的存储结构为树
节点叫Znode。
- 持久节点
springcloud和dubbo的区别
dubbo的话,很多其他服务要自己装,比如配置注册中心用zookeeper,而SpringCloud把整个分布式方案都整合好了注册中心使用erueka。
dubbo使用rpc通信二进制传输,而Springcloud使用http的rest方式一般用json格式文件。
dubbo国内大公司用的比较多,成熟稳定。
springcloud更新快。国外用的比较多。