微服务架构成功之路

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/07/success-of-microservices


近年来,在软件开发领域关于微服务的讨论呈现出火爆的局面,有人倾向于在系统设计与开发中採用微服务方式实现软件系统的松耦合、跨部门开发;同一时候,反对之声也非常强烈,持反对观点的人表示微服务添加了系统维护、部署的难度,导致一些功能模块或代码无法复用。同一时候微服务同意使用不同的语言和框架来开发各个系统模块。这又会添加系统集成与測试的难度,而且随着系统规模的日渐增长,微服务在一定程度上也会导致系统变得越来越复杂。

虽然一些公司已经在生产系统中採用了微服务架构,而且取得了良好的效果。但很多其它公司还是处在观望的态度。

Christian Posta是Red Hat的中间件专家与架构师、开源爱好者。同一时候也是Apache ActiveMQ、Apache Camel、Fabric8、HawtIO等诸多项目的提交者。

近日。Posta撰文谈到了微服务架构的一些成功故事,揭示出微服务架构成功的内在表现。同一时候还谈到了对成功的微服务架构的理解。

我们都非常清晰微服务架构所带来的优点,非常多人也建议我们为何以及怎样要採用微服务。同一时候。我们也知道诸如Amazon、Netflix以及Gilt等公司成功应用微服务架构的故事。

只是,就像我之前在文章You’re not going to do microservices中所谈及的那样。正确使用微服务,而且让公司或组织成功实施微服务是一件非常困难的事情。决定使用Dropwizard/SpringBoot/WildflySwarm/Docker并不意味着你就在使用微服务,能够说二者之间并没有什么直接的关系。其实。过早地将应用或服务拆分为更加小型的服务是须要採取一种折衷的办法的。在这一点上,我与Martin Fowler的观点是一致的。

非常多开发团队觉得微服务架构风格要比单体架构更加优秀。只是,另一些团队觉得微服务会导致生产力的减少。就像其它不论什么架构风格一样,微服务也会带来成本和收益。要想做出明智的选择。你须要对其有清晰、透彻的理解,然后将其应用到详细的上下文中。

微服务带来的优点有:

  • 明白的模块边界:微服务强化了模块化结构。这对于大型系统来说尤为重要。

  • 独立部署:简单的服务非常easy部署,因为是自治的,因此当某个模块本身出现故障时一般不会导致系统崩溃。
  • 技术多样性:借助于微服务。你能够混合使用多种语言、开发框架和数据存储技术。

微服务的代价有:

  • 分布式:分布式系统难以编写,远程调用会慢一些,而且总是存在着失败的风险。

  • 终于一致性:对于一个分布式系统来说,保持强一致性是非常困难的事情。这意味着每一个组件都须要管理终于一致性。
  • 运维复杂性:你须要一个成熟的运维团队来管理大量的服务,而这些服务部署的频率可能会非常高。

因此,当我们在一些业界大会上,在开发人员博客上谈论微服务的成功故事时。我觉得我们并没有抓住要点。是否成功与採用了什么依赖管理器、类载入器结构、Linux容器或是云服务并没有直接的关系。而是与一些更加基础、与Docker/Kubernetes/SpringBoot相比不那么潮的东西有关。

真正的成功?

微服务架构真正的成功之处在于组织该怎样拥抱小型、跨职能团队,而且鼓舞扁平、自我管理的组织,他们能够以传统组织结构无法匹敌的速度进行创新,而且高速成功。

两披萨团队

我以前有幸与Amazon团队一同工作,从而了解到了他们的组织文化。

Amazon的一个规定是组织团队必须要遵循“两批萨”原则。简单来说就是一个团队的成员有两个披萨就能吃饱了。这背后的想法能够通过Amazon CEO Jeff Bezos的话总结为:

管理者:我们须要保持团队间很多其它的沟通和交流。



Bezos:不,沟通是件非常糟糕的事情。

要想打造并保持自治、创新性的团队,你不须要“很多其它的沟通”,你须要的是“有效的沟通”。

说起来easy做起来难,只是首先我们就须要确保团队的人数要足够少。这样,团队成员之间就能更好地了解彼此。他们会形成良好的人际关系、保持信任和动力。J Richard Hackman研究了团队与集体动态,发现成员之间的沟通链会随着团队成员的添加而添加。

跨职能

我觉得以下这句话能够非常好地说明为何一个团队应该是跨职能的:

当将人们从一系列行为动作中分离开来时,坏行为就出现了。

创建很多其它的职能部门会产生“鼓舞坏行为”的结果。

比方说。开发人员应该关注于编写并交付高质量代码这件事。他们还应该考虑非功能方面,如安全、性能、可伸缩性、高可用等等。只是,假设開始创建应用数据库团队、QA团队,或是单独的运维团队,那么开发人员就仅仅会关注于“重要的事情”,将其它事情抛给别人。

以下这些话熟悉吗?

  • 我没时间測试,QA会做的。
  • 我无需了解数据库的工作方式,DBA会做的。
  • 我仅仅负责写代码,运维会搞定高可用的。

与上面做法相反的是形成跨职能团队:让一个团队的人搞定数据库、运维和測试等工作。或是让一个人担任多个角色。这正是当下非常多互联网公司的做法,如Amazon、Netflix、Facebook和Google等。通过这样的方式,你就会负责团队的一切事情,没有机会将事情抛给别人去做。

SOA与微服务

重申一次。我觉得我们所听到的关于微服务的成功故事不一定是技术上的成功。我们实际上冒着抓不住要点的风险。而且可能会重蹈SOA的覆辙。SOA的非常多原则都是微服务的基石,只是SOA并没有走向终点。非常多人使用SOA的原因就是为了用而用。厂商、委员会与协会一起过来告诉我们什么是我们“须要”的。终于。SOA也提出了关于组织结构的同样目标。只是却迷失在了WS-*规范中。

开源社区

细致想想,你会发现这些小型、跨职能的微服务团队看起来像是小型开源项目一样。

大家一起工作。不怕与别人分享自己的观点;每一个人都热衷于构建高质量软件,因为团队规模足够小而且聚焦,因此能够构建出模块化软件。他们是开发人员、測试、运维,一切工作都有着同样的目标,而这正是DevOps与微服务的真谛之所在。

亲爱的InfoQ读者,你对于近几年来火热的微服务讨论有何看法,你觉得在当下所从事的项目中有必要採用微服务架构么?採用微服务架构会对当前的开发、測试与运维带来那些变化,欢迎写下你的观点与大家一同交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读《一个程序猿的生命周期》有感

《一个程序猿的生命周期》中的作者来自贫困家庭,可以说是一个从大山里走出来的人。他深知,只有刻苦学习才能改变现状,所以他学习非常努力。 但人生总不是这样一帆风顺的,总会在我们的人生路上给与我们一些打击。意想不到的事情发生…

ymPrompt

ymPrompt消息提示组件4.0 组件调用方式1(传统参数传入方式):示例调用方法 ymPrompt.alert(http://www.qq.com,null,null,确认要提交吗?,handler) ymPrompt.succeedInfo(document.getElementById(txt).innerHTML,400,260,null,handler2) ymPrompt.errorInfo(操作失败…

html点击关闭代码,怎样开放和关闭html代码?

如何使ASP输出结果不支持html语法?整理编辑:China ASP网友aspboy1原创有时候我们会为这样一个问题而烦恼,就是如何在asp页面中避免支持html语法.例如: 下面一句话"这是一个表单语句"当我们在ASP文件中用response.write"这是一个表单语句&…

linux之如何复制文件夹所有文件到其它文件夹

1、复制文件夹所有文件到其他文件夹 比如复制文件夹test1里面的所有文件到文件夹test2里面去,test1和test2都在同一个路径下面 cd test1cp * ../test2/ 如果是复制文件夹里面的所有内容到另外一个文件夹 cp -rf Android/* ../../chenyu/ 2、如果解决一开始运行项目没问题&…

使用 FieldMask 提高 C# gRpc 服务性能

前言想象一下,有一个服务提供个多个客户端调用,但不是所有客户端都需要全部的返回参数:比如商品列表服务返回商品的所有信息,而订单服务调用商品列表服务,但它其实只需要商品的编码和名称就够了。当然,我们可以为这个需…

HTML accesskey 属性

2019独角兽企业重金招聘Python工程师标准>>> 带有指定快捷键的超链接&#xff1a; <a href"http://www.w3school.com.cn/html/" accesskey"h">HTML</a><br /> <a href"http://www.w3school.com.cn/css/" access…

python 生成排列、组合以及选择

from <python cookbook> 19.15 任务 需要对一个序列的排列&#xff08;permutation&#xff09;、组合&#xff08;combination&#xff09;或选择&#xff08;selection&#xff09;进行迭代操作。即使初始的序列长度并不长&#xff0c;组合计算的规则却显示生成的序列可…

html5制作线路图,HTML5绘制上海地铁线路图

某市政项目用到地铁图展示&#xff0c;展示地铁站点以及相关信息流&#xff0c;使用Qunee组件可以很好的解决这类需求&#xff0c;做出优美的展现&#xff0c;下面以上海2012地铁图为例&#xff0c;效果如下&#xff1a;上海2012地铁图效果示例讲解首先需要解决数据问题&#x…

Cocos2d-x VS. OGEngine,联盟与部落的战争

在近期的全球移动开发者大会上&#xff0c;Unity发布了2D引擎&#xff0c;触控在同时发布了Cocos 3D引擎&#xff1b;而在差不多同时间&#xff0c;以安卓为主的OGEngine也发布了新版本&#xff0c;并宣布将支持跨平台。各大引擎频频大动作并不是巧合&#xff0c;这代表着移动游…

Android之获取设备的型号和手机厂商

1. 获取手机型号&#xff1a; String model android.os.Build.MODEL; 2. 获取手机厂商&#xff1a; String carrier android.os.Build.MANUFACTURER;

C#中的var理解

从 C# 3.0 开始&#xff0c;在方法范围内声明的变量可以具有隐式“类型”var。隐式类型本地变量为强类型&#xff0c;就像用户已经自行声明该类型&#xff0c;但编译器决定类型一样。i 的以下两个声明在功能上是等效的&#xff1a;var i 10; int i 10;var 关键字的常见用途是…

发布版本步骤

1&#xff0c;修改版本号 -eclipse中安卓工程的AndroidManifest.xml文件中修改 android:versionName"V1.0.1.170413.31"<日期-版本号1>2.获得软件APK &#xff0c;eclipse下windows-Android-build-取消勾选Atomatically refresh Force Skip packag…

Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html?cadrs-cn-0125 Linux 调度器简史 早期的 Linux 调度器使用了最低的设计&#xff0c;它显然不关注具有非常多处理器的大型架构&#xff0c;更不用说是超线程了。1.2 Linux 调度器使用了…

在计算机技术方面用英语怎么说,“计算机应用技术”用英语怎么说?

计算机应用技术 :1. Computer Applications Technology中国搜学网-学苑论坛 - 教育话题 - 学习交流 ... ...专利文献检索 The Searches of Patent Literature计算机应用技术 Computer Applications Technology精密电磁测量 Precise Electromagnetic Measurement ...2. Computer…

同页面多UpdatePanel的单独刷新

<!--UpdateMode"Conditional"设置为不共用的UpdatePanel--><asp:UpdatePanel runat"server" ID"up1" UpdateMode"Conditional"><ContentTemplate><asp:Button runat"server" ID"Button1" On…

linux之nautilus .命令浏览当前文件目录

1、比如我们在终端目前想打开这个路径下的文件目录&#xff0c;我们如果再去更加路径一个一个的打&#xff0c;就太浪费时间了&#xff0c;我们可以在终端这个路径下输入下面的命令就可以 ~/Desktop$ nautilus . 2、效果如下图

C# 异步与Windows应用程序

把 async 关键字用于 UWP 应用程序&#xff0c;需要注意&#xff0c;在 UI 线程中调用 await 之后&#xff0c;当异步方法返回时&#xff0c;将默认返回到 UI 线程中。这便于在异步方法完成后更新 UI 元素。注意为了创建 UWP 应用程序&#xff0c;需要 Windows 10&#xff0c;W…

重装系统后恢复oracle数据

2019独角兽企业重金招聘Python工程师标准>>> 由于前段时间重装了系统&#xff0c;今天重装了数据库oracle XE版本&#xff0c;用“移花接木”的手段将新装oracle的目录用原有目录直接给覆盖&#xff0c;于是顺利的启动了oracle服务&#xff0c;然后又打开plsql deve…

使用eclipse运行mapreduce程序

今天使用http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html上的方式搭建一个基于Eclipse的mapreduce开发环境&#xff0c;在运行WordCount例子时出现错误&#xff0c;经过检查后才发现&#xff0c;装了hadoop2.0插件的Eclipse在右击选择“run on hadoop”时不会…

java Split 用法

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2、如果用“|”作为分隔的话,必…