dubbo-基础概念
分布式系统
分布式系统是由若干它计算机组合起来(多台计算机组成一个功能模块)向用户提供服务。这些计算机对于用户来说相当于单个相关系统。分布式系统是建立在网络之上的软件系统。
网络架构发展演变
单体应用架构 -> 垂直应用架构 -> 分布式服务架构 -> 流计算架构
![image-20200729070529478 image-20200729070529478](https://i-blog.csdnimg.cn/blog_migrate/33fa1d231f91cbe61e869cf05da737b1.png)
单一应用架构
单一应用架构(单体架构):把所有的功能模块部署在一起(传统java web项目,springBoot 单体项目)。以减少部署节点和成本。应用扩展时只能横向扩展(复制应用到新的服务器)应用维护时只能重新打包替换掉所有机器的应用文件。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键
![image-20200729070647195 image-20200729070647195](https://i-blog.csdnimg.cn/blog_migrate/f85f626fa565df6efe1658458a37155a.png)
![image-20200729080723795 image-20200729080723795](https://i-blog.csdnimg.cn/blog_migrate/b26c55f26d21dea9319eef5590a0c2e8.png)
适用于小型网站,小型管理系统。将所有功能部署到一个机器上,简单方便。
缺点:1.性能扩展比较难(只能横向扩展机器,当应用很大时。单机的有限计算机资源(内存,CPU)导致应用的性能并不怎么好)
2.无法协同开发(所有功能都在一个模块中,模块耦合严重,不好协同开发)
3.升级维护难(所有的机器都要重新部署)
垂直应用架构
垂直应用架构:当访问量逐渐增大时。单一应用增加机器带来的性能提升越来越小时。可以将应用拆分为互不相干的几个独立应用,以提升性能。此时,用于加速前端页面的mvc框架是关键
![image-20200729072518188 image-20200729072518188](https://i-blog.csdnimg.cn/blog_migrate/884b1b44164d2c059d0752972b500032.png)
![image-20200729072702326](https://i-blog.csdnimg.cn/blog_migrate/417ce112311e58d4069401e1358ef352.png)
通过业务的拆分实现了各个功能模块的独立,降低了程序耦合。降低了部署和维护的成本。性能扩展比较方便(需要扩展指定模块)
应用模块之间不能完全独立,依然存在大量交互,web功能(MVC)依然存在各个应用模块之中,不能实现 分离出来,用来响应(前端应用变换)。注意:在前后端分离的情况下这种问题是依然存在的。应为前后端分离改变页面时,实际的响应数据依然来自后台的MVC单元中。每个应用的独立导致 公用模块无法重复利用,开发性的浪费。
分布式服务架构
当垂直应用越来越多时,应用的交互不可避免,将核心业务提取出来,作为独立的服务,逐渐形成稳定的服务中心,是前端应用(MVC)能够适应市场需求。此时就需要一个提高业务复用和整合的RPC框架。
![image-20200729073950846 image-20200729073950846](https://i-blog.csdnimg.cn/blog_migrate/59fb42f4da3e9e0d7d1190a2a3b855f6.png)
![image-20200729075456643 image-20200729075456643](https://i-blog.csdnimg.cn/blog_migrate/db018cc467a1bd29cb7652c070cdd12c.png)
注意点:(垂直应用架构与分布式服务架构的区分)
垂直应用架构是把应用拆分成了一个个独立的应用模块,一个模块内包含完整的三层架构。交互是指各个应用之间的调用交互。因为模块的独立导致公共代码无法复用。
分布式服务架构是在垂直应用的基础上把独立的应用模块进行拆分,形成一个个服务单元,各服务单元之间相互交互。性能扩展上,只需要扩展指定的服务单元。
流动计算架构
流动计算架构,是在分布式服务架构的基础上添加了服务调度中心。目的是为了服务越来越多带来的一些资源浪费问题,基于访问压力实时对集群进行管理(动态上下线服务)提高集群利用率。此时关注点在于资源的调度(集群资源为各个服务单元的分配)和治理中心是关键。
![image-20200729080646642 image-20200729080646642](https://i-blog.csdnimg.cn/blog_migrate/75f8b3121d89afd6eb5d4867c4559ad1.png)
![image-20200729080800419 image-20200729080800419](https://i-blog.csdnimg.cn/blog_migrate/f0a575573cff365db111cd25cc3f88ea.png)
RPC
RPC(remote proc call):远程过程调用。
RPC远程过程调用指的是进程的之间的一种通信。简单的说就是利用本地的方法通过网络进程之间通信(socket)来达到调用远程方法的目的。RPC框架,就是实现这调用过程的中间件。通过RPC框架屏蔽掉底层细节。
RPC框架的核心是建立和维护网络通信的socket桥梁和网络数据之间数据高效传输(二进制流 > json > xml)。
Java中网络之间数据传输在于高效的序列化和反序列化机制。序列化Java类要实现Serializable接口,重写
private static final long serialVersionUID=1024856L 序列化版本号。
序列化:是把Java对象装换为与平台无关的二进制流用于持久化到磁盘或在网络之间传输
反序列化:是把二进制流转化为Java对象。
![image-20200729082125898 image-20200729082125898](https://i-blog.csdnimg.cn/blog_migrate/554421d925ef79b5827a63749a09bd5c.png)
![image-20200729082143962 image-20200729082143962](https://i-blog.csdnimg.cn/blog_migrate/2f1115a9f2e17b3d124ddcd268c51c23.png)
RPC远程调用的过程
(1) 客户端调用远程方法 (2)把传输的消息(参数)序列化 (3)通过网络 socket传递消息。
(1)服务端接受socket数据 (2)消息反序列化Java对象 (3)服务端方法处理 (4)处理结果序列化返回结果
(1) 把响应结果反序列化到Java对象 (2)向用户返回响应
dubbo概念
dubbo 是一款高性能,轻量级的开源java RPC框架。提供了面向接口的方法调用,智能容错,负载均衡,服务注册与发现。
![image-20200729090249211 image-20200729090249211](https://i-blog.csdnimg.cn/blog_migrate/416395a51efe0170772a37e154226158.png)
contaniner:服务的容器
provider:服务的提供者:暴露服务的提供方,服务提供方在启动时,向注册中心提供自己的服务。
consumer:服务的消费者:远程调用服务的消费方,服务消费方在启动时,像注册中心订阅自己所需的服务,服务的消费者,从服务的提供者列表中,基于软负载均衡算法,选择一台提供者调用服务,调用失败,在选一台进行调用。
registery注册中心: 用于保存服务提供者的信息列表,常用zookeeper做服务注册中心。负责接收服务提供者的注册信息并保存,并且负责响应服务消费方的请求,用于向服务的消费方提供服务提供者信息列表。当服务生产者产生变化时通过长连接notify通知服务消费者
monitor 监控中心:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心