基于SOA的分布式高可用架构和微服务架构,是时下如日中天的互联网企业级系统开发架构选择方案。在核心思想上,二者都主张对系统的横向细分和扩展,按不一样的业务功能模块来对系统进行分割而且使用必定的手段实现服务之间的通讯,而且基于弹性云服务搭建高可用的分布式解决方案。html
但它们之间的区别可能比类似的地方要多,特别是体如今对服务的使用和与云服务的深度结合上。在具体实践中,微服务的架构也能够与其它互联网中间件组合在一块儿,组成规模更为庞大的SOA分布式系统。本文主要对一个典型的SOA分布式应用的架构和组件作详细的说明。nginx
企业级系统架构的演变sql
单体式数据库
单体架构即全部系统功能和模块基于MVC的设计模式耦合在一个单体服务器单元中。基于传统的MVC思想,单体应用基于先后端分离的原则,经过Model、Control和View共同来完成一个特色的服务请求。这种传统的架构模式带了了多人团队合做、代码更新和维护、持续部署方面的困难,更重要的是,这种架构没法支持互联网行业对高并发的需求。下图为一个典型商城应用的单体架构及其SSM实现架构:json


关于单体式应用的更多资料,可参看:后端
JavaWeb开发之详解Servlet及Servlet容器设计模式
基于SSM的Java Web应用开发原理初探缓存
集群服务器
至少在高并发的需求上,单体应用的缺陷是行业所没法忍受的, 那如何提高并发性能呢?一个直接的思路是,把单体应用变成多体,变成集群,经过负载均衡分发服务请求到不一样的应用服务器中。这也是早期淘宝的解决思路。下面是集群的架构草图:架构

虽然集群的架构有效解决了高并发的问题,可是却带来了难度极大的维护和可用性问题。另外在功能上,哪怕是解决用户单点登陆,都须要经过Session广播的方式进行,消耗了资源和宽带。虽然集群面向高并发而生,可是若是要达到上万的并发级别,即使是强力增长节点数量,性能也不会提高很大,有其瓶颈。
分布式
上面的集群,至关于把一份工程代码部署到多台服务器中,每台服务器独立部署运行;而分布式的思想是,把系统按照模块划分为多个子系统,多个子系统之间须要进行通讯,来共同完成业务流程。分布式的架构以下图所示:

分布式的架构具备不少优点:
- 把模块拆分,使用接口通讯,下降模块之间的耦合度。
- 把项目拆分红若干个子项目,不一样的团队负责不一样的子项目。
- 增长功能时只须要再增长一个子项目,调用其余系统的接口就能够。
- 能够灵活的进行分布式部署。
可是,分布式接口通讯的开发,带来了相应的开发压力,提升了团队的学习成本。
基于SOA的架构
SOA:Service Oriented Architecture面向服务的架构。也就是把工程都拆分红服务层工程、表现层工程。服务层中包含业务逻辑,只须要对外提供服务便可。表现层只须要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。工程均可以独立部署。

在一个典型的SOA架构中,加入了大量的中间件和子系统,用于解决分布式架构中的服务通讯及衍生问题,具体包括服务间通讯、负载均衡、反向代理、信息中心、文件管理、主从备份等等。
核心模块和中间件详解
SOA架构为高并发而生,须要解决高并发下不一样服务之间的通讯问题。在实践中,SOA架构须要配合多种中间件技术,包括缓存服务、数据库中间件、服务发布和订阅、消息队列等等。如下为一个典型的SOA商城架构简图:

1、系统间通讯
通常来讲,基于SOA的架构,它的表现层和服务层是不一样的工程。因此要实现一个服务流程须要两个系统之间进行通讯。那么如何实现远程通讯?经常使用的方式包括:
一、使用WebService:效率不高,它是基于SOAP协议(http+xml)。项目中不推荐使用。
二、使用Restful形式的服务:http+json。不少项目中应用。若是服务愈来愈多,服务与服务之间的调用关系复杂,调用服务的URL管理复杂,何时添加机器难以肯定。
三、使用Dubbo。使用rpc协议进行远程调用,直接使用socket通讯。传输效率高,而且能够统计出系统之间的调用关系、调用次数,管理服务。
Dubbo
DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,天天为2,000+个服务提供3,000,000,000+次访问量支持,并被普遍应用于阿里巴巴集团的各成员站点。Dubbo组件的架构和工做机制以下图所示:
Zookeeper
注册中心负责服务地址的注册与查找,至关于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。使用dubbo-2.3.3以上版本,建议使用zookeeper做为注册中心。
Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变动推送,适合做为Dubbo服务的注册中心,工业强度较高(稳定性好),可用于生产环境,并推荐使用。
2、分布式文件服务器
在分布式应用中,没法经过传统手段解决文件上传和下载问题。所以,对于文件上传,业务系统节点能够把文件集中到分布式文件服务器作统一管理,而用户访问,也能够经过分布式文件服务器提供快速的文件下载支持。
FastDFS
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份(高可用)、负载均衡(高并发量)、线性扩容(添加服务器或者磁盘)等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,经过Tracker server调度最终由Storage server完成文件上传和下载。
- Tracker server做用是负载均衡和调度,经过Tracker server在文件上传时能够根据一些策略找到Storage server提供文件上传服务。能够将tracker称为追踪服务器或调度服务器。
- Storage server做用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现本身的文件系统而是利用操做系统 的文件系统来管理文件。能够将storage称为存储服务器。
FastDFS架构和工做机制以下图所示:


3、负载均衡
以一个SOA商城系统为例,它的首页是系统的门户,也就是系统的入口。因此首页的访问量是这个系统最大的。若是每次展现首页都从数据库中查询首页的内容信息,那么势必会对数据库形成很大的压力,因此须要使用缓存来减轻数据库压力。实现缓存的工具备不少,如今比较流行的是Redis。
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库(nosql),应用在缓存、任务队列等场景较多。
4、搜索功能
Solr
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你须要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当索引量很大,搜索请求并发很高,这时须要使用SolrCloud来知足这些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper做为集群的配置信息中心。Solr集群架构图以下:
Zookeeper它有几个特点功能:
- 集中式的配置信息(数据库链接池的配置文件,修改文件不用重启就能够生效)
- 自动容错
- 近实时搜索
- 查询时自动负载均衡
5、消息队列
MQ
MQ是一个消息中间件,好比:ActiveMQ、RabbitMQ、kafka都属于MQ,是MQ的产品。通常能够考虑使用Apache开源的消息队列ActiveMQ。
ActiveMQ的消息形式
对于消息的传递有两种类型:
- 一种是点对点的,即一个生产者和一个消费者一一对应;
- 另外一种是发布/订阅模式,即一个生产者产生消息并进行发送后,能够由多个消费者进行接收。
JMS定义了五种不一样的消息正文格式,以及调用的消息类型,容许你发送并接收以一些不一样形式的数据,提供现有消息格式的一些级别的兼容性。
6、反向代理
Nginx
Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev用c语言所开发,官方测试nginx可以支支撑5万并发连接,而且cpu、内存等资源消耗却很是低,运行很是稳定,并且开源。Nginx的应用场景包括:
- http服务器。Nginx是一个http服务能够独立提供http服务。能够作网页静态服务器。
- 虚拟主机。能够实如今一台服务器虚拟出多个网站。例如我的网站使用的虚拟主机。
- 反向代理,负载均衡。当网站的访问量达到必定程度后,单台服务器不能知足用户的请求时,须要用多台服务器集群可使用nginx作反向代理。而且多台服务器能够平均分担负载,不会由于某台服务器负载高宕机而某台服务器闲置的状况。
7、主从备份
Keepalived
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,能够认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其余机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就须要根据VRRP的优先级来选举一个backup当master。这样的话就能够保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各类检查方式。VRRP模块是来实现VRRP协议的。