(1):单体架构
(2):垂直架构
(3):分布式服务架构
(4):SOA架构
(5):微服务架构
(1)描述:当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
(2)优点:架构简单,前期开发成本低、开发周期短,适合小型项目(OA、CRM、ERP 企业内部应用)。
(3)缺点:全部功能集成在一个工程中
- 业务代码耦合度高,不易维护。
- 维护成本高,不易拓展。
- 并发量大,不易解决。
- 技术栈受限,只能使用一种语言开发。
1:描述:当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
2:架构优点:
(1)业务代码相对解耦
(2)维护成本相对易于拓展(修改一个功能,可以直接修改一个项目,单独部署)
(3)并发量大相对易于解决(搭建集群)
(4)技术栈可扩展(不同的系统可以用不同的编程语言编写)。
3:架构缺点:
(1)功能集中在一个项目中,不利于开发、扩展、维护。(2)代码之间存在数据、方法的冗余
1:描述:当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
1:架构优点:
(1)业务代码完全解耦,并可实现通用。
(2)维护成本易于拓展(修改一个功能,可以直接修改一个项目,单独部署)。
(3)并发量大易于解决(搭建集群)。
(4)技术栈完全扩展(不同的系统可以用不同的编程语言编写)。
2:架构缺点:
(1)缺少统一管理资源调度的框架 。
1:描述:当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
2:架构优点:
(1)业务代码完全解耦,并可实现通用
(2)维护成本易于拓展(修改一个功能,可以直接修改一个项目,单独部署)
(3)并发量大易于解决(搭建集群)
(4)技术栈完全扩展(不同的系统可以用不同的编程语言编写)。
( 5 ) 框架实现了服务治理,不去担心集群的使用情况(失败会尝试其它服务…)
3:架构缺点:
组织结构的改变、组织权力结构的改变、业务面临的新挑战、IT变得简单之前会越来越复杂、没有数据视图、监控复杂性、技术不匹配。
zookeeper介绍在上一篇博客以及谈过请阅读:浅谈------Zookeeper
zookeeper在SOA架构上面扮演了注册中心的角色,负责提供一个平台给服务提供者注册服务,以及服务消费者订阅服务。实现原理是通过zookeeper的代码客户端org.apache.curator来在zookeeper服务器上面添加节点信息(注册服务)以及订阅节点信息(订阅服务)。
Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。Dubbo官网地址:dubbo官网Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
dubbo的架构图:
zook架构图中的角色说明:
虚线都是异步访问,实线都是同步访问
蓝色虚线:在启动时完成的功能
红色虚线(实线)都是程序运行过程中执行的功能调用关系说明:
1:服务容器负责启动,加载,运行服务提供者。
2:服务提供者在启动时,向注册中心注册自己提供的服务。
3:服务消费者在启动时,向注册中心订阅自己所需的服务。
4:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。什么是长连接?
1:同步调用:客户端调用服务方方法,等待直到服务方返回结果或者超时,再继续自己的操作。
2:异步调用:客户端把消息发送给中间件,不再等待服务端返回,直接继续自己的操作。
5. 是一种进程间的通信方式
6. 它允许应用程序调用网络上的另一个应用程序中的方法
7. 对于服务的消费者而言,无需了解远程调用的底层细节,是透明的需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程。RPC是一个泛化的概念,严格来说一切远程过程调用手段都属于RPC范畴。各种开发语言都有自己的RPC框架。Java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo、spring Cloud(restapi http)等。
8. 一台电脑调用另外一台脑上的方法
3:RPC主件介绍
1、 客户端(Client):服务调用者
2、 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数打包成网络消息,再通过网络发送给服务方3、 服务端存根(Server Stub):接受客户端发送过来的消息并解包,再调用本地服务
4、 服务端(Server):服务提供者。
1、 服务调用方(client)调用以本地调用方式调用服务;2、 client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体 在Java里就是序列化的过程3、 client stub找到服务地址,并将消息通过网络发送到服务端;
4、 server stub收到消息后进行解码,在Java里就是反序列化的过程;
5、 server stub根据解码结果调用本地的服务;
6、 本地服务执行处理逻辑;
7、 本地服务将结果返回给server stub;
8、 server stub将返回结果打包成消息,Java里的序列化;9、 server stub将打包后的消息通过网络并发送至消费方;10、 client stub接收到消息,并进行解码, Java里的反序列化;
11、 服务调用方(client)得到最终结果。
我们写分布式架构的时候分成以下几个等级
1:model层,这层是数据模型层,主要是用来封装数据以及放常量的模块,一般是一张表一个javaBean类。数据库查询出来的数据封装到这里的类对象里面。
2:dao层,这层主要是用来操作数据库。(这里用到mybatis框架,德鲁伊连接池作为数据源)
3:service层,这层是用来调用dao层以及调用其他的接口来完成业务需求。(这里用到spring框架)
4:web层,这层主要是接收客户端请求以及调用service层获取数据响应给客户端。(这里用到了springMVC框架)
我们写SOA架构的时候分成以下几个等级
1:common模块:这个模块和分布式的model是一样的,存放javaBean类。
2:interface模块:这里是抽取服务弄成接口模块,这里提供接口给provider模块实现,也提供给consumer模块订阅服务。总之就是两者的桥梁吧。
3:provider(服务提供者)模块:这里是服务提供者模块,这个模块实现了interface暴露出来的接口,并将接口通过dubbo发布到zookeeper服务器上面。单独的war工程!
4:consumer(服务消费者),这里是接收客户端请求,调用provider模块提供的接口完成业务,并将数据返回给客户端。这里是通过dubbo订阅provider发布到zookeeper的服务。
1:model层对应common模块,者没啥区别。
2:service层+dao层对应provider模块(soa架构只是多了一个配置文件spring-provider.xml用来配置服务发布。)
3:web层对应consumer模块(SOA架构只是多了一个订阅服务的spring-dubbo.xml配置文件)
4:SOA架构将服务提取出来,单独成一个模块,通过dubbo将服务发布到zookeeper服务器上面,而provider模块通过实现接口,发布服务调用数据库完成数据处理。而consumer模块是通过dubbo订阅zookeeper上面的服务,从而将服务注入到controller类中完成服务的调用。
由上面我们可以看出,分布式架构的体系如果要转成SOA架构做以下几步即可:
1:将服务提取出来,单独成一个模块(如soa的interface模块)。
2:在你的service层实现提取出来的服务,并将提供的服务发布到zookeeper服务器上面。(通过配置文件配置如:soa的provider模块的spring-provider.xml)
3:在你的web层订阅需要的服务,而服务的实现类就是service层的实现类。(通过配置文件配置如:soa的consumer模块的spring-dubbo.xml)
4:当然了,引入zookeeper的客户端依赖,dubbo的依赖那是必须的了,还有开启zookeeper的服务器。在配置服务和订阅服务的时候指定zookeeper的服务器地址。



