写点什么

有关微服务架构的争论:更简单还是更复杂?

  • 2014-05-28
  • 本文字数:2200 字

    阅读完需:约 7 分钟

随着 DevOps、持续交付等理念的深入人心,微服务(Microservices)架构开始走进我们的视野。微服务是用一组小服务的方式来构建一个应用,服务独立运行在不同的进程中,服务之间通过轻量的通讯机制(如 RESTful 接口)来交互,并且服务可以通过自动化部署方式独立部署。正因为微服务架构中的服务之间是相互独立的,所以不同的服务可以使用不同的语言来开发,或者根据业务的需求使用不同类型的数据库。3 月底,来自 ThoughtWorks 的 James Lewis 和 Martin Fowler 分享了他们对微服务架构的理解以及看法。文章中作者详细介绍了微服务的特点以及相对于传统架构的微服务架构的优势。

在 James 看来,传统的整体风格的架构在构建部署和扩展伸缩方面有很大的局限性,传统的整体(monolithic)风格的架构一般分为三部分:客户端用户界面(HTML 页面和 JavaScript 程序)、数据库、服务端应用程序。服务端程序负责处理 HTTP 请求、执行业务逻辑、加载和更新数据库数据、查询和填充 HTML 页面,这个服务端应用就像是一块铁板,笨重且不可拆分,系统中任何程序的改变都需要整个应用重新构建和部署新版本。另外传统的整体风格的架构在进行水平扩展时也只能整个系统扩展,而不能针对某一个功能模块进行扩展。而微服务架构可以完美的解决统一风格架构所遇到的种种问题。微服务架构将系统以组件化的方式分解为多个服务,服务之间相对独立且松耦合,单一功能的改变只需要重新构建部署相应的服务即可。

传统的开发模式在分工时往往以技术为单位,比如 UI 团队、服务端团队和数据库团队,这样的分工可能会导致任何功能上的改变都需要跨团队沟通和协调。而微服务则倡导围绕服务来分工,不同的服务可以采用不同的技术来实现,一个团队中应该包含开发所需的所有技能,比如用户体验、数据库、项目管理。

传统的软件开发常常以项目为周期,一旦项目开发完成即交付给运维部门,而在微服务架构中,一个团队应该去把控产品的整个生命周期,而不只是开发,这其实也是 DevOps 的核心理念,所以微服务中的每一个服务都是一个产品,而不是一个项目。

微服务架构抛弃了 ESB 复杂的业务规则编排、消息路由等功能,微服务架构中服务是高内聚的,每个服务都会处理相应的业务,所有的业务逻辑应该尽量在服务内部处理,且服务间的通信尽可能的轻量化,比如使用 Restful 的方式。

传统的软件开发中经常会使用同一个技术平台来解决所有的问题,而经验表明使用合适的工具做合适的事情会让开发变得事半功倍。微服务架构天生就具有这样的特性,我们可以使用 Node.js 来开发一个简单的报表页面,使用 C++ 来编写一个实时聊天组件。

微服务架构的引入为多样化持久保存数据提供可能,持久层可以使用传统关系数据库和 NoSQL。不同于传统的应用,微服务架构中,我们可以为每个服务选择一个新的适合业务逻辑的数据库系统,比如 MongoDB、PostgreSQL。这样做的好处是显而易见的,首先我们可以根据业务类型(读多还是写多等)来决定使用哪种类型的数据库,其次这样可以减小单个数据库的负载。

就 James 的文章来看,微服务架构主要有以下几个优点:

  1. 每个服务只需要做好一件事,更加专注和简单
  2. 用合适的工具来做合适的事情
  3. 服务之间是松耦合的
  4. 服务的团队之间是相互独立的

James 的文章在社区引起了广泛的讨论,近日,Contino 公司的 CTO Benjamin Wootton 在 highscalability 上撰文表示微服务并没有想象中的那么好,并建议开发者在选用此架构时一定要慎重。Benjamin 认为微服务架构时可能会面临下面一些挑战:

  1. 运营开销。更多的服务也就意味着更多的运营,产品团队需要保证所有的相关服务都有完善的监控等基础设施,传统的架构开发者只需要保证一个应用正常运行,而现在却需要保证几十甚至上百道工序高效运转,这是一个艰巨的任务。
  2. DevOps 要求。使用微服务架构后,开发团队需要保证一个 Tomcat 集群可用,保证一个数据库可用,这就意味着团队需要高品质的 DevOps 和自动化技术。而现在,这样的全栈式人才很少。
  3. 隐式接口。服务和服务之间通过接口来“联系”,当某一个服务更改接口格式时,可能涉及到此接口的所有服务都需要做调整。
  4. 重复劳动。在很多的服务中可能都会使用到同一个功能,而这一功能点没有足够大到提供一个服务的程度,这个时候可能不同的服务团队都会单独开发这一功能,重复的业务逻辑,这违背了良好的软件工程中的很多原则。
  5. 分布式系统的复杂性。微服务通过 REST API 或消息来将不同的服务联系起来,这在之前可能只是一个简单的远程过程调用。分布式系统也就意味着开发者需要考虑网络延迟、容错、消息序列化、不可靠的网络、异步、版本控制、负载等,而面对如此多的微服务都需要分布式时,整个产品需要有一整套完整的机制来保证各个服务可以正常运转。
  6. 事务、异步、测试面临挑战。跨进程之间的事务、大量的异步处理、多个微服务之间的整体测试都需要有一整套的解决方案,而现在看起来,这些技术并没有成熟。

每一种架构都有其优缺点,当然微服务也包括在内。我们需要根据项目业务和团队情况来选择合适的架构,微服务才刚刚开始发展,这也是顺应 PaaS、持续交付、DevOps 等新技术理念下的产物,期待微服务架构能得到更广泛的应用。关于微服务,如果您有新的见解,欢迎与我们分享。


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-05-28 09:345737
用户头像

发布了 219 篇内容, 共 151.8 次阅读, 收获喜欢 195 次。

关注

评论

发布
暂无评论
发现更多内容

“AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学、Xarray 使用教学,针对气象领域.nc文件读取处理

汀丶人工智能

人工智能 数据挖掘 机器学习 深度学习 6 月 优质更文活动

软件测试/测试开发丨接口测试学习笔记分享

测试人

程序员 软件测试 协议 接口测试 http和https

时序数据库 openGemini 线下meetup · 北航站来啦,欢迎大家报名!

华为云开源

数据库 前端

凝聚全球顶尖力量,助力开源行业发展 | 2023开放原子全球开源峰会开幕式暨高峰论坛亮点抢先看!

开放原子开源基金会

开源

GitHub星标20k+的Java指南,号称"Star收割机"

Java java面试 Java八股文 Java面试题 Java面试八股文

BH1750 传感器实战教学 —— 硬件设计篇

矜辰所致

传感器 硬件设计实战 光照传感器 6 月 优质更文活动

电动车厂家会生产制造共享电动车吗?

共享电单车厂家

共享电动车厂家 共享电单车生产 本铯电动车厂家 电动车生产厂家

基于 prefetch 的 H5 离线包方案 | 京东云技术团队

京东科技开发者

ios H5 andiod prefetch_related 企业号 6 月 PK 榜

如何轻松应对复杂的分布式系统日志收集和分析

xfgg

ELK 日志收集架构 6 月 优质更文活动

Github 上最值得学习的 Springboot核心笔记,硬核简直了

Java spring Spring Boot 框架

原来kafka也有事务啊,再也不担心消息不一致了

Java kafka 事务

目前青岛只有一家正规等保测评机构吗?在哪里?

行云管家

青岛 等级保护 等保测评

ChatGPT与软件架构(5) - 网络安全

俞凡

人工智能 架构 网络安全 ChatGPT

制作Jdk镜像

tiandizhiguai

Docker k8s 镜像

从Docker和Kubernetes看Containerd

鲸品堂

Docker 容器 Containerd 企业号 6 月 PK 榜

NineData x 华为云正式上线

NineData

数据库 华为云 企业动态 语言 & 开发 NineData

容器化部署四大优势简单说明-行云管家

行云管家

容器化 部署 IT运维 容器化部署

原来kafka也有事务啊,再也不担心消息不一致了

JAVA旭阳

kafka

20个Golang片段让我不再健忘 | 京东云技术团队

京东科技开发者

Java Go 语言 企业号 6 月 PK 榜

浅谈ByteHouse Projection优化实践

字节跳动数据平台

OLAP Clickhouse bytehouse

“AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[2]:数据探索性分析(温度风场可视化)、CNN+LSTM模型建模

汀丶人工智能

人工智能 数据挖掘 机器学习 LSTM RNN回归 6 月 优质更文活动

INFINI Easysearch 完成龙芯架构兼容性认证

极限实验室

搜索引擎 国产化 龙芯 easysearch 极限科技

太赞了!阿里技术团队《Java 面试官手册》突击版对外开放!

Java java面试 Java八股文 Java面试题 Java面试八股文

百度APP iOS端包体积50M优化实践(三) 资源优化

百度Geek说

ios 开发语言 Object-c 企业号 6 月 PK 榜 6 月 优质更文活动

阿里Java调优笔记爆火,7大模块优化实战,请查收

Java 性能优化 性能调优

对线面试官-线程池(三)

派大星

Java 面试

学习MyBatis的异常处理机制

Java mybatis

“AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[3]:TCNN+RNN模型、SA-ConvLSTM模型

汀丶人工智能

人工智能 数据挖掘 机器学习 LSTM 6 月 优质更文活动

直播app源码开发的稳定控制知识

山东布谷科技

软件 App 开发 搭建平台 直播app系统

【618备战巡礼】“三高”之第一高--如何打造高可用系统 | 京东云技术团队

京东科技开发者

高可用 集群 高可用架构 618 企业号 6 月 PK 榜

有关微服务架构的争论:更简单还是更复杂?_语言 & 开发_小盖_InfoQ精选文章