当前位置: 首页 > news >正文

微服务架构优缺点

随着DevOps、持续交付等理念的深入人心,微服务架构开始走进我们的视野。

那么微服务是业界期待已久的解决方案么?或者说微服务要比整体解决方案更加简单?

让我们先对微服务下个定义:

微服务是用一组小服务的方式来构建一个应用,服务独立运行在不同的进程中,服务之间通过轻量的通讯机制(如RESTful接口)来交互,并且服务可以通过自动化部署方式独立部署。正因为微服务架构中,服务之间是相互独立的,所以不同的服务可以使用不同的语言来开发,或者根据业务的需求使用不同类型的数据库。

来自ThoughtWorks的James Lewis和Martin Fowler分享了他们对微服务架构的理解以及看法。文章中作者详细介绍了微服务的特点以及相对于传统架构的微服务架构的优势。

微服务的一些优势是显而易见的:

  1. 服务简单,只关注一个业务功能 
    在James看来,传统的整体风格的架构在构建部署和扩展伸缩方面有很大的局限性,其服务端应用就像是一块铁板,笨重且不可拆分,系统中任何程序的改变都需要整个应用重新构建和部署新版本。在进行水平扩展时也只能整个系统扩展,而不能针对某一个功能模块进行扩展。 
    而微服务架构将系统以组件化的方式分解为多个服务,服务之间相对独立且松耦合,单一功能的改变只需要重新构建部署相应的服务即可。

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

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

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

微服务架构的引入为多样化持久保存数据提供可能,持久层可以使用传统关系数据库和NoSQL。不同于传统的应用,微服务架构中,我们可以为每个服务选择一个新的适合业务逻辑的数据库系统,比如MongoDB、PostgreSQL。这样做的好处是显而易见的,首先我们可以根据业务类型(读多还是写多等)来决定使用哪种类型的数据库,其次这样可以减小单个数据库的负载。James的文章在社区引起了广泛的讨论,Contino公司的CTO Benjamin Wootton撰文表示微服务并没有想象中的那么好,并建议开发者在选用此架构时一定要慎重。Benjamin认为微服务架构时可能会面临下面一些挑战:

  1. 运维开销 
    更多的服务也就意味着更多的运维,产品团队需要保证所有的相关服务都有完善的监控等基础设施,传统的架构开发者只需要保证一个应用正常运行,而现在却需要保证几十甚至上百道工序高效运转,这是一个艰巨的任务。

  2. DevOps要求 
    使用微服务架构后,开发团队需要保证一个Tomcat集群可用,保证一个数据库可用,这就意味着团队需要高品质的DevOps和自动化技术。而现在,这样的全栈式人才很少。

  3. 隐式接口 
    服务和服务之间通过接口来“联系”,当某一个服务更改接口格式时,可能涉及到此接口的所有服务都需要做调整。

  4. 重复劳动 
    在很多服务中可能都会使用到同一个功能,而这一功能点没有足够大到提供一个服务的程度,这个时候可能不同的服务团队都会单独开发这一功能,重复的业务逻辑,这违背了良好的软件工程中的很多原则。

  5. 分布式系统的复杂性 
    微服务通过REST API或消息来将不同的服务联系起来,这在之前可能只是一个简单的远程过程调用。分布式系统也就意味着开发者需要考虑网络延迟、容错、消息序列化、不可靠的网络、异步、版本控制、负载等,而面对如此多的微服务都需要分布式时,整个产品需要有一整套完整的机制来保证各个服务可以正常运转。

  6. 事务、异步、测试面临挑战 
    跨进程之间的事务、大量的异步处理、多个微服务之间的整体测试都需要有一整套的解决方案,而现在看起来,这些技术并没有成熟。

总而言之,微服务架构有很多吸引人的地方,不过在拥抱微服务之前要认清它所带来的挑战。而每一种架构都有其优缺点,我们需要根据项目业务和团队情况来选择合适的架构。



本文转自 www19 51CTO博客,原文链接:http://blog.51cto.com/doujh/1827618,如需转载请自行联系原作者

相关文章:

  • SonicWall防火墙IM禁止Skype软件
  • CentOS 5 (64位)下lnmp平台搭建
  • 总结ldap碰到的问题
  • java cms系统 springmvc mybatis UC浏览器文章相关功能
  • 使用应答文件安装域控制器
  • 布局 约束添加规则
  • 扭转思想seo不仅仅是排名
  • centos6.5安装tensorflow
  • Mac说——关闭SIP
  • 程序寄存器与指令寄存器
  • 测试管理之工作流程及技能!!!
  • 一致性哈希算法
  • web api 初体验 解决js调用跨域问题
  • 用 zotero 管理文献和个人知识库
  • 新功能:在负载均衡SLB控制台上查看DDoS安全防护阈值
  • 2019年如何成为全栈工程师?
  • HashMap ConcurrentHashMap
  • iOS小技巧之UIImagePickerController实现头像选择
  • JAVA_NIO系列——Channel和Buffer详解
  • python docx文档转html页面
  • Python连接Oracle
  • spring security oauth2 password授权模式
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 当SetTimeout遇到了字符串
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 检测对象或数组
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 提醒我喝水chrome插件开发指南
  • 通过git安装npm私有模块
  • 以太坊客户端Geth命令参数详解
  • nb
  • UI设计初学者应该如何入门?
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • #大学#套接字
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (k8s中)docker netty OOM问题记录
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (TOJ2804)Even? Odd?
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转)visual stdio 书签功能介绍
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .aanva
  • .net Signalr 使用笔记
  • .NET6实现破解Modbus poll点表配置文件
  • .net生成的类,跨工程调用显示注释
  • @Async注解的坑,小心
  • @EventListener注解使用说明
  • @Validated和@Valid校验参数区别
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • @vue/cli脚手架
  • [ 转载 ] SharePoint 资料
  • [\u4e00-\u9fa5] //匹配中文字符