摘要: 微处理架构——处理复杂事物   许多公司,比如Amazon、eBay和NetFlix,通过采用微处理结构模式解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。

微服务正在博客、社交媒体讨论组和会议演讲中获得越来越多的关注,在Gartner的2014 Hype Cycle上它的排名非常靠前。同时,软件社区中也有不少持怀疑论者,认为微服务不是什么新东西。Naysayers认为这就是SOA架构的重新包装。然 而,尽管存在着不同的争论,微服务架构模式却正在为敏捷部署以及复杂企业应用实施提供巨大的帮助。

首先我们看看为什么要使用微服务。

开发单体式应用

假设你正准备开发一款与Uber和Hailo竞争的出租车调度软件,经过初步会议和需求分析,你可能会手动或者使用基于Rails、Spring Boot、Play或者Maven的生成器开始这个新项目,它的六边形架构是模块化的 ,架构图如下:

应用核心是业务逻辑,由定义服务、域对象和事件的模块完成。围绕着核心的是与外界打交道的适配器。适配器包括数据库访问组件、生产和处理消息的消息组件,以及提供API或者UI访问支持的web模块等。

尽管也是模块化逻辑,但是最终它还是会打包并部署为单体式应用。具体的格式依赖于应用语言和框架。例如,许多Java应用会被打包为WAR格 式,部署在Tomcat或者Jetty上,而另外一些Java应用会被打包成自包含的JAR格式,同样,Rails和Node.js会被打包成层级目录。

这种应用开发风格很常见,因为IDE和其它工具都擅长开发一个简单应用,这类应用也很易于调试,只需要简单运行此应用,用Selenium链接 UI就可以完成端到端测试。单体式应用也易于部署,只需要把打包应用拷贝到服务器端,通过在负载均衡器后端运行多个拷贝就可以轻松实现应用扩展。在早期这 类应用运行的很好。

单体式应用的不足

不幸的是,这种简单方法却有很大的局限性。一个简单的应用会随着时间推移逐渐变大。在每次的sprint中, 开发团队都会面对新“故事”,然后开发许多新代码。几Year后,这个小而简单的应用会变成了一个巨大的怪物。这儿有一个例子,我最近和一个开发者讨论,他正在 写一个工具,用来分析他们一个拥有数百万行代码的应用中JAR文件之间的依赖关系。我很确信这个代码正是很多开发者经过多Year努力开发出来的一个怪物。

一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦。敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开 发者都不可能搞懂它。因此,修正bug和正确的添加新功能变的非常困难,并且很耗时。另外,团队士气也会走下坡路。如果代码难于理解,就不可能被正确的修 改。最终会走向巨大的、不可理解的泥潭。

单体式应用也会降低开发速度。应用越大,启动时间会越长。比如,最近的一个调查表明,有时候应用的启动时间居然超过了12分钟。我还听说某些应用需要40分钟启动时间。如果开发者需要经常重启应用,那么大部分时间就要在等待中渡过,生产效率受到极大影响。

另外,复杂而巨大的单体式应用也不利于持续性开发。今天,SaaS应用常态就是每天会改变很多次,而这对于单体式应用模式非常困难。另外,这种变化带来的影响并没有很好的被理解,所以不得不做很多手工测试。那么接下来,持续部署也会很艰难。

单体式应用在不同模块发生资源冲突时,扩展将会非常困难。比如,一个模块完成一个CPU敏感逻辑,应该部署在AWS EC2 Compute Optimized instances,而另外一个内存数据库模块更合适于EC2 Memory-optimized instances。然而,由于这些模块部署在一起,因此不得不在硬件选择上做一个妥协。

单体式应用另外一个问题是可靠性。因为所有模块都运行在一个进程中,任何一个模块中的一个bug,比如内存泄露,将会有可能弄垮整个进程。除此之外,因为所有应用实例都是唯一的,这个bug将会影响到整个应用的可靠性。

最后,单体式应用使得采用新架构和语言非常困难。比如,设想你有两百万行采用XYZ框架写的代码。如果想改成ABC框架,无论是时间还是成本都是非常昂贵的,即使ABC框架更好。因此,这是一个无法逾越的鸿沟。你不得不在最初选择面前低头。

总结一下:一开始你有一个很成功的关键业务应用,后来就变成了一个巨大的,无法理解的怪物。因为采用过时的,效率低的技术,使得雇佣有潜力的开发者很困难。应用无法扩展,可靠性很低,最终,敏捷性开发和部署变的无法完成。

那么如何应对呢?

微处理架构——处理复杂事物

许多公司,比如Amazon、eBay和NetFlix,通过采用微处理结构模式解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。

一个微服务一般完成某个特定的功能,比如下单管理、客户管理等等。每一个微服务都是微型六角形应用,都有自己的业务逻辑和适配器。一些微服务还 会发布API给其它微服务和应用客户端使用。其它微服务完成一个Web UI,运行时,每一个实例可能是一个云VM或者是Docker容器。

比如,一个前面描述系统可能的分解如下:

每一个应用功能区都使用微服务完成,另外,Web应用会被拆分成一系列简单的Web应用(比如一个对乘客,一个对出租车驾驶员)。这样的拆分对于不同用户、设备和特殊应用场景部署都更容易。

每一个后台服务开放一个REST API,许多服务本身也采用了其它服务提供的API。比如,驾驶员管理使用了告知驾驶员一个潜在需求的通知服务。UI服务激活其它服务来更新Web页面。所有服务都是采用异步的,基于消息的通讯。微服务内部机制将会在后续系列中讨论。

一些REST API也对乘客和驾驶员采用的移动应用开放。这些应用并不直接访问后台服务,而是通过API Gateway来传递中间消息。API Gateway负责负载均衡、缓存、访问控制、API 计费监控等等任务,可以通过NGINX方便实现,后续文章将会介绍到API Gateway。

----------------------------------------------------------------------------------------

完整的项目源码来源  欢迎大家一起学习研究相关技术,源码获取请加求求:2670716182

带你走进微处理架构的世界相关推荐

  1. 一篇文章带你快速理解微服务架构,由浅入深带你走进微服务架构的核心

    戳蓝字"CSDN云计算"关注我们哦! 文章来自:Java和Android架构 什么是微服务 首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应 ...

  2. 独特视角带你走进Java并发编程的世界

    独特视角带你走进Java并发编程的世界 全局概括 并发问题产生的三个根本原因 java内存模型: 有序性和可见性的解决方案 volatile关键字 Happens-Before规则 锁: 原子性的解决 ...

  3. 万字长文梳理:从0开始,步入Service Mesh微服务架构的世界

    来源 | 无敌码农 责编 |贾凯强 头图 | 下载于视觉中国 新一代微服务架构--Service Mesh已经引发了诸多关注.在微服务架构盛行的今天,像Spring Cloud这样的微服务框架大家已然 ...

  4. delphi 中如果不进行 closehandle 会怎么样_报考八一农大的十一大选择之七|带你走进不一样的“信息世界”...

    随着高考招生制度改革的推进,按专业填报志愿成为趋势.在 "专业+院校"的志愿填报方式下,考生必须对高校的专业特色有所了解,这就对高校的招生工作提出新要求.新挑战. 在高考少年规划未 ...

  5. android 判断照片清晰度_手机如何拍出更清晰的照片?带你走进变焦与对焦的世界...

    *本文来自花粉俱乐部@倾阳一点丹心在 大家在讨论手机的拍照功能时,可能经常听到变焦和对焦这两个专业术语,那么到底什么是变焦,什么又是对焦呢? 一.变焦(Zoom) 是指通过调整镜头的焦距f,以改变相机 ...

  6. 【字体分享】各种角度都不一样?带你走进意瞑字的世界

    意瞑字到底是什么呢?不用急,首先我们先来看一张海报,大家可以观察一下这张海报有何特点. 大家有没有发现,这两张海报的主标题正看与反看是不同的字. 正看是"挑战",反看是" ...

  7. 前阿里P8级大神的Serverless+微前端架构学习总结

    前端在写简历和面试的时候,最憋屈的是啥? 我觉得莫过于明明你有90分的实力,却只表达出20分.于是拿不到大厂面试.谈薪被压价.与心仪offer失之交臂等种种糟心结果接踵而至. 这一方面是因为表达能力欠 ...

  8. 【架构师李肯】带你走进架构师的一天

    作者简介 架构师李肯(全网同名),一个专注于嵌入式IoT领域的架构师.有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于主流R ...

  9. 阿里的27个项目资源带你走进Github世界!

    阿里的27个项目资源带你走进Github世界! 1.设计语言 & 前端框架 Ant Design https://github.com/ant-design/ant-design ★ 1488 ...

最新文章

  1. 最常见NLP任务练手项目汇总
  2. mysql 中文乱码
  3. 服务器虚拟化北向,KVM虚拟化的部署及使用
  4. html iframe.b.gen 病毒,常见病毒及处理方法.doc
  5. Codeforces 1326F Wise Men (容斥原理、状压 DP、划分数)
  6. python 爬虫代码_python之路(一)_爬虫—爬一下网页代码输出到文件
  7. 感想篇:4)越来越精简的机械设计
  8. python内存模型_内存篇3:CPython的内存管理架构-L2-块
  9. 2020年7月美妆行业抖音小红书营销报告
  10. 刚入职新公司做一些什么贡献_如果您有全职工作,如何为Kubernetes做贡献
  11. bootstrap select下拉框模糊搜索和动态绑定数据解决方法
  12. 计算机科学与技术专业的英文作文,计算机专业英语:科技交流与科技论文写作...
  13. 使用qq邮箱服务器来实现laravel的邮件发送
  14. ajax基本概念,方法
  15. 西威变频器avo下载调试资料_全程图解变频器应用与检测技能
  16. 哪个Linux可以运行国服lol,Linux wine国服LOL英雄联盟,完美运行!!
  17. Android Miracast 花屏问题分析
  18. 通信工程测试图修改软件,通信工程工具仪器大全,你用过几种?
  19. matlab bmp rgb如何转换,RGB到XYZ转化
  20. Java使用EasyExcel下载xls、xlsx 出现文件格式与扩展名不匹配(亲测)

热门文章

  1. 有关学习参与度的计算
  2. Kali渗透测试:使用browser_autopwn2模块进行渗透攻击
  3. 变电站/配电房智能轨道巡检机器人系统
  4. html上传文件框架,文件上传 - FastAdmin框架文档 - FastAdmin开发文档
  5. A10:怎么利用容器技术,助力开放银行建设
  6. 发那科2021参数_FANUC 有关参数的方面的资料
  7. 图像归一化概念和作用
  8. python怎么计算图像梯度_OpenCV-Python-图像梯度
  9. 【图解】如何击溃芝诺悖论
  10. iOS开发 生成CSR(.certSigningRequest)文件