此文已由作者尧飘海授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

天下大势,分久必合,合久必分,社会历史的发展方向总有着惊人的相似。把这种规律应用到软件应用架构的发展方向上,当生产力和生产关系到了不可调和的矛盾时,也将导致软件架构的演变,这样演变将会进一步推动软件的发展,同时也会带来很多问题,因此在不同的阶段,采用不同的架构适应业务发展是有一定道理的,步子太小,容易夹着蛋,步子太大,容易扯着蛋 。

从前文的WEB应用技术的发展来看,WEB应用的服务架构模式的可以划分为Monolithic(整块架构)和MSA(微服务架构)。并且现在很大的中小应用还是使用Monolithic的架构模式,不同的架构模式应用在不同规模的应用中将产生不同的效果,下面我们简单的对二种架构进行分析

Monolithic架构

随着移动应用的发展,现在的服务端程序需要提供不同的能力来支持包括桌面端、浏览器端及移动端等。早期的应用可通过CORBA,EJB等技术来实现,日前,考虑到各平台的兼容和简便性,大部分会通过暴露相关的服务接口或消息代理给第三方消费和实现消息交换。应用程序基本上通过分层或者组合的方式来架构,由不同的组件来完成相关职责

  • 表现层,主要负责处理HTTP相关请求,然后返回不同的响应格式,包括HTML,JSON等

  • 业务逻辑,即控制层,负责应用的逻辑处理

  • 数据库层,负责模型层的数据存储和组织

这种架构的方式的实现方式如下:

在日常的软件开发过程中,无样采用什么样的软件模式,常常有这样的非功能性需求:

  • 必须有一个完整的开发队伍来保证应用的开发进度

  • 新入希望能够较快的溶入到队伍中,并且能快速上手

  • 应用希望能够容易的理解和修改

  • 应用支持能够持续的部署

  • 能较好的实现扩展性和高可用性等非功能性需求

  • 能够快速的利用新的技术的红利

在完成相关的功能开发和测试后,在上线时,会采用什么样的部署方式呢?对于JAVA应用大部分采用JAR或者WAR的方式来实现,对于其他的语言也基本采用打包整个目录的方式来完成部署,我们的自动部署平台系统中的大部分应用都是属于采用这种使用方式来实现部署上线。

采用这种架构模式的优势是:

  • 易开发 整个应用能直接利用开发工具或IDE直接完成,除了一些依赖的服务,基本在能单机上完成

  • 测试简单 由于不涉及到多个系统的交互,因此对应的测试流程也会变得相对简单,单一的流程能完成相关的测试

  • 部署简单 通过一些部署的工具,甚至SHELL脚本即能完成整个应用的部署,其他的无非是一些规范化或定制化的东西

  • 易运维 通过复制多份的方式来实现模向扩展,负载均衡完成请求路由。

当然,随着系统的发展和扩大,Monolithic架构的一些问题也暴露出来了:

  • 大量的代码经常会导致开发人员因为风险导致不敢轻易重构,同时还要完整的测试用例才能保证重构的完成;另外对新人来说,模块划分不清楚也会带来很多的挫折感,基本在一段时间内不敢对应用功能修改,情愿添加新增的方式来完成。而很大一部分的人都使用新增导致整个系统更复杂,最后很快就变得无法维护了

  • 大量的代码会将导致CO代码的时间非常长,同时对应的IDE的编译时间和运行时间也变得不可预测,以前就碰到过同事的代码过长在紧张上线修改BUG时,导致ECLIPSE死掉而使得工作效率大大减少的问题;另外应用容器的启动时间也会因为应用代码的急增导致变长,不能快速的启动导致调试和测试的时间变长,影响应用的进度。同样在部署的过程中也会影响到用户的服务时间。

  • 持续部署也是很困难的,如果应用要希望时常发布,这对运用运维也来也是一定的灾难,为了修改一个问题导致整个应用重新打包部署,编译时间打包又长,特别是在后端的应用修改的情况下还要进行前端代码的无功打包,对了运维人员的时间是个极大的浪费。如果应用里面包括定时任务等功能还可能对业务数据产生影响,导致运维的风险越来越高,加上开发人员对运维方式的抱怨,导致运维人员对发布越来抗拒,从而导致矛盾越来越严重。在同事使用自动部署平台的反馈中,有时候就听到开发人员和运维人员的相互指责或者抱怨。

  • 扩展也是比较团难的,尽管大部门分的WEB应用能支持横向扩展,但是实际上,当应用规模扩展到了后端服务无法支撑时,比如后端单一数据库连接资源不够时,就无法扩展了。另外对其他的资源竞争也会导致无法真正的扩展,因为系统到一定规模时就有定会有热点数据,这个热点数据常会导致整个系统无法正常服务。系统的每个模块对资源的使用也是不同的,有些是CPU密集型,有些是IO密集型,因此,实际是不可扩展的,只是系统没有真的到达到相像中的那么大。

  • 快速开发的障碍 整块应用的架构还将导致整个开发团队的相互依赖,一般来讲一个应用最后会发展成根据特定的功能划分成不同的工程师队伍,比如UI小组,交互小组,会员组,前端组等架构形式,这将使用得各工作的团队相互依赖,不能独立工程一个功能的修改会使得一系统的人员依赖和评估相关的风险,这也使得导致产品不能快速迭代。

  • 技术债,此架构迫使开发人员严重依赖相关的技术,比如只能使用JAVA语言,甚至还些还依赖于特定的软件版本,就也会使得软件无法采用最新的版本,只能通过补丁加补丁的方式来完成,导致技术债越来越重。如果使用的软件版本不再提供维护,后面只能通过特定的人员或团队才能搞定或者采用整个应用重写的方式来实现,这在实际应用开发中是非常常见的,包括微软这样的大公司也避免不了这个问题,这将导致相关大的风险。

上面我们大体根据实际应用中碰到的问题对Monolithic架构的优势和问题分析,但是本文并不是说Monolithic架构毫无用处,只是说明这种架构模式的适用场景,其实它在大部分的系统中还是使用这种模式也完成的,并且还工作的很好,引用之前汪源老大引用GOOLGE大师的话,JUST WORK就好。

为了避免本文的裹脚布又长又臭,将继续分下一篇对MSA服务构架来分析。敬请期待。

PaaS服务之路漫谈(一)

网易 云计算基础服务 深度整合了  IaaS 、 PaaS  及容器技术,提供弹性计算、 DevOps  工具链及微服务基础设施等服务,帮助企业解决  IT 、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台, 点击可免费试用

相关文章:
【推荐】 后台服务项目的白盒测试之旅
【推荐】 遭遇各种内容监管,有些企业到底欠缺的是什么,仅仅是价值观吗?

PaaS服务之路漫谈(二)的更多相关文章

  1. PaaS服务之路漫谈(三)

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Monolithic架构在产品访问量很大的情况下,有可能常会导致整个产品迭代或升级过程不能按预期进行,或者上 ...

  2. PaaS服务之路漫谈(一)

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. PaaS服务之路漫谈(一) 1983年,SUN公司提出的网络即计算的理念:2006年亚马逊(Amazon)推 ...

  3. Choerodon 的微服务之路(二):Choerodon 的微服务网关

    链接地址:https://my.oschina.net/choerodon/blog/2254030

  4. .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)

    微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...

  5. NET Core微服务之路:实战SkyWalking+Exceptionless体验生产环境下的追踪系统

    前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的问题: 从APM上说,知道某个节点出现异常,或延迟过过高,却不能及时知道日志反馈情况,总不可能去相应的节点 ...

  6. NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

    原文:NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统 前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的 ...

  7. .NET Core微服务之路:不断更新中的目录 (v0.43)

    原文:.NET Core微服务之路:不断更新中的目录 (v0.43) 微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑, ...

  8. redis成长之路——(二)

    redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...

  9. Azure PaaS服务密钥的安全性

    Azure PaaS服务,比如存储,Redis缓存,服务总线,IoT中心等等,一般通过密钥来认证客户端,也就是说只有提供正确密钥的客户端才能访问和使用对应的Azure PaaS服务,所以这个密钥是很重 ...

随机推荐

  1. android开发之 Wifi的四个类

    android开发之 Wifi的四个类 在Android中对Wifi操作,android本身提供了一些实用的包,在android.net.wifi包以下.简介一下: 大致能够分为四个基本的类ScanR ...

  2. Linux学习系列之Iptables

    iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分.可以直接配置,也可以通过许多前端和图形界面配置. 语法 iptables(选项)(参数) 选项 -t<表&g ...

  3. linux系统(ubuntu14.04)安装mentohust完毕校园网锐捷认证

    近来升级电脑又一次做了系统.再次面临这linux系统下的各种校园网上网限制. 我在这里採用了mentohust来完毕锐捷认证. 这里我们选择Mentohust取代锐捷. Mentohust 是由华中科 ...

  4. JVM 调优 —— 新生代 Survivor 空间不足

    零. 新生代调优规律 增大新生代空间. Minor GC 频率降低, Minor GC 时间上升. 降低新生代空间, Minor GC 频率上升, Minor GC 时间下降 一. 新生代典型问题 先 ...

  5. Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

    三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...

  6. 【分享】利用Apache的Htaccess Files命令限制訪问文件类型,Files正则

    假设你在你的模板目录中有非常多PSD HTML模板,那么用接下来这个htaccess文件能够保护限制訪问: 文件D:\WebSite\ZBPHP.COM\www\Tpl\.htaccess 所有源代码 ...

  7. nginx-伤心的事

    今天测试接口,总是出问题,测试了两天,整个流程就卡在最后一步. 每次采用curl,request等请求访问我的服务器都会返回403状态码,网上找了很多资料 有权限的,有静态文件的,然而很多都没有什么卵 ...

  8. Linux 及 CentOS系统安装

    VMware与Centos系统安装   今日任务 .Linux发行版的选择 .vmware创建一个虚拟机(centos) .安装配置centos7 .xshell配置连接虚拟机(centos) 选择性 ...

  9. Codeforces Round #426 (Div. 2) D. The Bakery 线段树优化DP

    D. The Bakery   Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought req ...

  10. Kubernetes实战阅读笔记--2、架构和部署

    安装Kubernetes “本书准备了4台虚拟机(CentOS 7.0系统)用于部署Kubernetes运行环境,包括一个Etcd.一个Kubernetes Master和三个Kubernetes N ...