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

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

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

从前文的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. String、StringBuffer和StringBuilder的差别

    String.StringBuffer和StringBuilder的差别 1.String类是不可变类,即一旦一个String对象被创建后.包括这个对象中的字符序列是不可改变的 2.在字符串拼接的过程 ...

  2. BUPT复试专题—最小距离查询(2013)

    题目描述 给定一个由小写字母a到z组成的字符串S,其中第i个字符为S[i](下标从0开始).你需要完成下面两个操作:INSERT c  其中c是一个待输入的字符.你需要在字符串的末尾添加这个字符.保证 ...

  3. Exactly-once Spark Streaming from Apache Kafka

    这篇文章我已经看过两遍了.收获颇多,抽个时间翻译下,先贴个原文链接吧.也给自己留个任务 http://blog.cloudera.com/blog/2015/03/exactly-once-spark ...

  4. 安卓执行机制JNI、Dalvik、ART之间的比較 。android L 改动执行机制。

    Android L默认採用ART执行环境.全然兼容64位移动处理器.Google称这将比此前的Dalvik模式性能提高两倍,可是会占用很多其它的内存空间.Android有三种执行模式:JNI.Dalv ...

  5. SolidEdge 装配体中如何快速的搞定一个面上所有螺丝 如何在装配体上进行阵列

    1 点击"规则排列" 选择要排列的螺丝   2 选择被规则排列的架子   3 选择所有的圆孔(鼠标滑到任意圆孔位置,左键单击即可选中所有圆孔)   4 选择参考的基准孔(已经上了螺 ...

  6. IP协议解读(二)

    IP协议是TCP协议栈中的核心协议,也是网络编程的基础之中的一个. 我们接着在IP协议解读(一)继续学习 网络层作用 IP分片: IP数据报的长度超过帧的MTU时,将会被分片传输. 分片可能发生在发送 ...

  7. weex 小结

    1. import  文件时,必须引入全称,不能省略 .vue import mEcharts from '../components/Echarts.vue' 2.weex 的 cli 中没有 配置 ...

  8. php生成.php文件

    <?php // -- test.php -- // //搜集资料 $str_tmp="<?php\r\n"; //得到php的起始符.$str_tmp将累加 $str ...

  9. HDU 1114 Piggy-Bank (完全背包)

    Piggy-Bank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  10. boost::serialization 用基类指针转存派生类(错误多多,一波三折)

    boost::serialization 也支持c++的多态,这样我们就能够通过使用基类的指针来转存派生类, 我们接着上一篇( boost::serialization(2)序列化基类 )的样例来看: ...