
分布式
分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统
分布式系统是由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用 更多的机器,处理更多的数据。
场景
- 只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,
- 且硬件的提升高昂到得不偿失的时候、
- 应用程序也不能进一步优化的时候,需要考虑分布式系统。
架构的发展
单一应用框架
当网站流量很小时,只需要一个应用,将所有功能部署在一起,以减少部署节点和成本;
此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
适用于小型网站,小型管理系统;
缺点:
- 性能扩展难;
- 协同开发问题
- 不利于升级维护
垂直应用架构
将应用拆成互不相干的几个应用,以提升效率;
此时,用于加速前端页面开发的Web框架(MVC)是关键。
优点:通过切分业务来实现各个模块的独立部署,降低了维护和部署的难度,团队各司其职容易管理,性能扩展更加方便;
缺点:公用模块无法重复利用,开发性的浪费。
分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快的响应多变的市场需求。
此时,提升分布式服务框架(RPC)是关键。
流动计算架构
增加一个调度中心基于访问压力实时管理集群容量,提高集群的利用率。
此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
RPC
Remote Procedure Call
RPC,远程过程调用,是进程间的通信方式。
是一种思想,而不是规范。
允许程序调用另一个地址空间(通常是共享网络的另一个机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。RPC允许像调用本地方法一样调用远程方法;
RPC两个核心模块:通信、序列化。
序列化:数据传输需要转换;
Dubbo
Apache Dubbo 是一个高性能的基于Java的开源RPC框架
三大核心能力
- 面向接口的远程方法调用;
- 智能容错和负载均衡;
- 服务自动注册和发现。
Dubbo结构图
服务提供者(Provider):暴露服务的提供方,服务提供者在启动时,向注册中心注册自己提供的服务;
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,若调用失败,再选另一台调用;
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者;
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定期每分钟发送一次统计数据到监控中心。
ZooKeeper
ZooKeeper是一个分布式的,开放源代码的分布式应用程序协调服务。
是一个为分布式应用提供一致性服务的软件,功能包括:配置维护、域名服务、分布式同步、组服务等。
是Hadoop和Hbase的重要组件。
第一次运行Zookeeper
到北京理工大学镜像站下载Zookeeper软件:https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.8.0/
(带bin为可执行程序,不带bin为源代码+可执行程序)
- 到conf目录下,将zoo_sample.cfg复制一份,名为zoo.cfg;
- 到bin目录下:
- zkServer:Zookeeper的服务端程序,(Windows以管理员身份)打开即可开启服务;
- zkCli:Zookeeper的测试用的客户端程序。
Dubbo-admin
是Dubbo的一个监控管理后台。
可以查看注册了哪些服务,哪些服务被消费了。
一个Maven项目。
下载使用
https://mirror.bit.edu.cn/apache/dubbo/dubbo-admin/0.4.0/
https://github.com/apache/dubbo-admin
解压;
mvn clean package -Dmaven.test.skip=true
将项目打包。也可直接下载打包好的直接运行;使用java -jar 文件名 运行。
一些要注意的地方
Dubbo服务默认启用一个AdminServer端口为8080;
Dubbo-admin的默认端口也是8080。
若在同一台主机上使用,可能会出现端口占用。需要修改其中一个端口解决问题。
Dubbo的AdminServer服务端口修改:
zoo.cfg
1
admin.serverPort=8888
Dubbo-admin端口修改:
application.properties
1
server.port=8081