《2016ThoughtWorks技术雷达峰会----微服务架构》
微服务架构 王键,ThoughtWorks, 首席咨询师
首先微服务架构的定义,thoughtWorks在2012年3月的技术雷达中这样定义:
“微服务架构是一种架构,它提倡将单一应用程序划分为一组小的服务,每个服务运行在其独立的进程中,服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。”
从这个定义中可以知道,如何甄别一个一个架构是不是微服务架构,可以从2点来判断。
一个是服务跑在单独的进程,另一个是可以独立部署。
那么Microservices有什么优点,以至于它近年来如此的热?
它有以下的四个优点:
1、弹性架构
什么叫弹性架构,可以设想以下场景。我们的系统是由一些小的服务构成,然后在通过容器这种非常灵活的基础设施,放入云的环境。假如现在双11.客户蜂拥而至,
这时候系统会自动监控到系统的响应非常的紧张,系统会弹性的开启成千上万的服务。在高峰过去之后,系统会自动把这些服务取消,从开始到结束完全没有人在干扰,
完全是自动化的。其实这种微服务架构结合Docker,结合云就为实现以上场景提供了一种可能。
2、组件化
传统的组件化是库和应用都运行在进程中,组件的任何局部变化都意味着应用的重新部署。但是通过服务来实现组件化,单个服务运行在单个进程中,某个服务的局部变动只影响该服务,而不影响整体的应用。并且因为要把应用拆分为多个微服务,对于跨进程间的调用,必须要定义清晰的职责和边界,这促进了组件的更清晰的边界。
3、去中心化
应用往往依赖于应用一开始对于技术的选择,比如你选择了.net,后几年的发展全是基于.net,因为这是一个大的应用。选择了Oracle,以后很难改变。但是微服务架构实现了一个耕细粒度的服务划分,可以在不同的服务里用不同的技术,不同的数据库,可以真正做到架构所追求的用最适合的技术解决
4、快速响应
所有以上的特点,其实都是为了快速响应需求的变化,响应市场的变化。快速响应意味着增加了竞争力
但是微服务架构是带刺的玫瑰花,不是只有美丽。
1、微服务架构会带来附加成本

如图所示,系统复杂度低时,单一应用的生产效率更好。随着系统复杂度的增加,微服务架构的生产效率慢慢超过单一应用。这说明并不是任何时候应用微服务架构,就能取得较高的生产效率,因为它会带来附加的成本。
2、很多团队在部署微服务的时候,要花费很长的时间。微服务的架构不该是更容易部署的么?
根据技术雷达2014年7月版中提到的康威定律,“一个组织的设计成果,其结构往往对应于这个组织中的沟通结构”,它从正反两面支持了《敏捷宣言》的一个核心理念"个体与交互高于过程和工具"。
要充分发挥微服务架构的能量,团队必须在构建、测试、集成以及管理方面进行良好的训练。所以,结论就是这些团队没有一个适合微服务架构的组织结构。逐渐改进你的团队和组织结构来促进你所渴望的技术架构。
今年的技术雷达对于微服务给出的关键词是:Microservice envy
Fist law of Distributed Object Design :"don't distribute your objects",一方面很多应用微服务架构的团队,其实没有达到应用微服务架构的能力,个子不够高,还不足以达到微服务架构的要求。另一个方面好的架构是进化来的,不是设计来的,不要为了微服务而微服务。
建议:单体应用优先,不要一开始就应用微服务,在演进中可以迁移到微服务。

注:微服务架构只是一种架构风格,需要很多的技术来支持,技术雷达2014年列出了微服务很多相关的技术。
《2016ThoughtWorks技术雷达峰会----微服务架构》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- MasonJS – 创建完美的砌体结构网页布局
MasonJS 插件用来解决目前大多数的网格系统使用中的问题——间距.当使用 Masonry,Isotope 或任何其他网格插件时,布局中会出现空白或边缘参差不齐的情况.MasonJS 可以帮助你填补 ...
- hibernate 入门([数据访问中间件] 开源框架)
1.内容: hibernate 也是一个经典的[数据访问中间件] 开源框架. 2.hibernate核心组件 SessionFactory[整个数据的操作]重量级组件 ...
- Web前端开发工具总结
前端开发工具: web前端开发乃及其它的相关开发, 推荐sublime text, webstorm(jetbrains公司系列产品)这两个的原因在于,有个技术叫emmet, http://docs. ...
- 【Bootstrap】2.作品展示站点
假设我们已经想好了要给自己的作品弄一个在线站点.一如既往,时间紧迫.我们需要快一点,但作品展示效果又必须专业.当然,站点还得是响应式的,能够在各种设备上正常浏览,因为这是我们向目标客户推销时的卖点.这 ...
- SharePoint 部署解决方案Feature ID冲突
中文报错: 部署步骤“添加解决方案”中出现错误: 已在此服务器场中安装 ID 为 735efe4e-8b50-4310-b588-c6ae2ba0759f 的功能.请使用强制属性显式地重新安装此功能. ...
- Understanding theory (1)
Source: verysmartbrothas.com It has been confusing since my first day as a PhD student about theory ...
- iOS开发-canOpenURL: failed for URL: "xx" - error:"This app is not allowed to query for scheme xx"
转载自:http://www.jianshu.com/p/e38a609f786e
- 在Android中引入Java8的lambda表达式
我用的是retrolambda这个插件,下面来说下如何添加它. 项目地址:https://github.com/evant/gradle-retrolambda 在根项目的build.gradle中添 ...
- 我的第一节Android课
我的第一节安卓课程,今天非比寻常的一天,我开始了我程序猿之路的第一节安卓课程,安卓课程只是我的一个兴趣班,我的本专业是java开发,因为喜欢做一个属于自己的一个手机APP,就选多个一样技能,毕竟十八般 ...
- NSValue&NSNumber
void testForNSValue(void) { int i=10; // NSLog(@"encode(int)=%s",@encode(int)); // N ...