??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV无码成人精品区大在线,亚洲精品福利在线观看,亚洲av纯肉无码精品动漫http://www.tkk7.com/huyi0616/articles/429705.html一杯清?/dc:creator>一杯清?/author>Thu, 17 Mar 2016 09:55:00 GMThttp://www.tkk7.com/huyi0616/articles/429705.htmlhttp://www.tkk7.com/huyi0616/comments/429705.htmlhttp://www.tkk7.com/huyi0616/articles/429705.html#Feedback0http://www.tkk7.com/huyi0616/comments/commentRss/429705.htmlhttp://www.tkk7.com/huyi0616/services/trackbacks/429705.html
【编者的话】本pd的第一介l了微服务架构模式。它讨论了采用微服务的优点和~点Q除了一些复杂的微服务,q种模式q是复杂应用的理想选择?/span>

当你军_应用作Zl微服务Ӟ需要决定应用客L如何与微服务交互。在单体式程序中Q通常只有一l冗余的或者负载均衡的服务提供炏V在微服务架构中Q每一个微服务暴露一l细_度的服务提供点。在本篇文章中,我们来看它如何媄响客L到服务端通信Q同时提ZUAPI Gateway的方法?/span>

介绍

假定你正在ؓ在线购物应用开发一个原生手机客L。你需要实C个品最l页来展C商品信息?/span>

例如Q下面的囑ֱCZ你在亚马逊Android客户端上滑动产品最l页时看到的信息?/span>
01.png

虽然q是一个智能手机应用,q个产品最l页展示了非常多的信息。例如,不仅q里有品基本信息(名字、描q和hQ,q有以下内容Q?/span>
  • 购物车中的物品数
  • 下单历史
  • 用户评论
  • 低库存警?/li>
  • 快递选项
  • 各式各样的推荐,包括l常跟这个物品一赯购买的品、购买该物品的其他顾客购买的产品以及购买该品的֮q浏览了哪些产品?/li>
  • 可选的购物选项

当采用一个单体式应用架构Q一个移动客L会通过一个RESThQGET api.company.com/productdetails/productIdQ来获取q些数据。一个负载均衡将h分发到多个应用实例之一。应用将查询各种数据库ƈq回hl客L?/span>

相对的,若是采用微服务架构,最l页上的数据会分布在不同的微服务上。下面列举了可能与品最l页数据有关的一些微服务Q?/span>
  • 购物车服?-- 购物车中的物品数
  • 下单服务 -- 下单历史
  • 分类服务 -- 基本产品信息Q如名字、图片和h
  • 评论服务 -- 用户评论
  • 库存服务 -- 低库存警?/li>
  • 快递服?-- 快递选项、截止时间、来自不同快递API的成本计?/li>
  • 推荐服务 -- 推荐产品

02.png

我们需要决定移动客L如何讉Kq些服务。请看下面这几种方式

客户端到微服务直接通信

理论上说Q一个客L可以直接l多个微服务中的M一个发赯求。每一个微服务都会有一个对外服务端(https://serviceName.api.company.name)。这个URL可能会映到微服务的负蝲均衡上,它再转发h到具体节点上。ؓ了搜索品细节,Ud端需要向上述微服务逐个发请求?/span>

不幸的是Q这个方案有很多困难和限制。其中一个问题是客户端的需求量与每个微服务暴露的细_度API数量的不匚w。如图中Q客L需?ơ单独请求。在更复杂的场景中,可能会需要更多次h。例如,亚马逊的产品最l页要请求数百个微服务。虽然一个客L可以通过LAN发v很多个请求,但是在公|上q样会很没有效率Q这个问题在Ud互联|上ؓH出。这个方案同时会D客户端代码非常复杂?/span>

另一个存在的问题是客L直接h微服务的协议可能q不是web友好型。一个服务可能是用Thrift的RPC协议Q而另一个服务可能是用AMQP消息协议。它们都不是览或防火墙友好的,q且最好是内部使用。应用应该在防火墙外采用cMHTTP或者WEBSocket协议?/span>

q个Ҏ的另一个缺Ҏ它很N构微服务。随着旉的推U,我们可能需要改变系l微服务目前的切分方案。例如,我们可能需要将两个服务合ƈ或者将一个服务拆分ؓ多个。但是,如果客户端直接与微服务交互,那么q种重构很隑֮施?/span>

׃上述三种问题的原因,客户端直接与服务器端通信的方式很在实际中用?/span>

采用一个API Gateway

通常来说Q一个更好的解决办法是采用API Gateway的方式。API Gateway是一个服务器Q也可以说是q入pȝ的唯一节点。这跟面向对象设计模式中的Facade模式很像。API Gateway装内部pȝ的架构,q且提供APIl各个客L。它q可能有其他功能Q如授权、监控、负载均衡、缓存、请求分片和理、静态响应处理等。下囑ֱCZ一个适应当前架构的API Gateway?/span>
03.png

API Gateway负责h转发、合成和协议转换。所有来自客L的请求都要先l过API GatewayQ然后\p些请求到对应的微服务。API Gateway经帔R过调用多个微服务来处理一个请求以及聚合多个服务的l果。它可以在web协议与内部用的非Web友好型协议间q行转换Q如HTTP协议、WebSocket协议?/span>

API Gateway可以提供l客L一个定制化的API。它暴露一个粗_度APIl移动客L。以产品最l页q个使用场景Z。API Gateway提供一个服务提供点Q?productdetails?productid=xxxQ得移动客L可以在一个请求中索到产品最l页的全部数据。API Gateway通过调用多个服务来处理这一个请求ƈq回l果Q涉及品信息、推荐、评论等?/span>

一个很好的API Gateway例子?/span>Netfix API Gateway。Netflix服务提供数百个不同的微服务Q包括电视、机盒、智能手机、游戏系l、^板电脑等。v初,Netflix视图提供一?/span>适用全场?/a>的API。但是,他们发现q种形式不好用,因ؓ涉及到各式各L讑֤以及它们独特的需求。现在,他们采用一个API Gateway来提供容错性高的APIQ针对不同类型设备有相应代码。事实上Q一个适配器处理一个请求^均要调用6?个后端服务。Netflix API Gateway每天处理数十亿的h?/span>

API Gateway的优点和~点

实现一个API Gateway

性能和可扩展?/h4>

采用反应性编E模?/h4>

对于有些hQAPI Gateway可以通过直接路由h到对应的后端服务上的方式来处理。对于另外一些请求,它需要调用多个后端服务ƈ合ƈl果来处理。对于一些请求,例如产品最l页面请求,发给后端服务的请求是怺独立的。ؓ了最化响应旉QAPI Gateway应该q发的处理相互独立的h。但是,有时候请求之间是有依赖的。API Gateway可能需要先通过授权服务来验证请求,然后在\由到后端服务。类似的Qؓ了获得客L产品愿望清单Q需要先获取该用L资料Q然后返回清单上产品的信息。这L一个API lg?/span>Netflix Video Grid?/span>

利用传统的同步回调方法来实现API合ƈ的代码会使得你进入回调函数的噩梦中。这U代码将非常隑ֺ且难以维护。一个优雅的解决Ҏ是采用反应性编E模式来实现。类似的反应抽象实现有Scala?/span>FutureQJava8?/span>CompletableFuture和JavaScript?/span>Promise。基于微?Netq_的有Reactive Extensions(Rx)。Netflix为JVM环境创徏了RxJava来用他们的API Gateway。同样地QJavaScriptq_有RxJSQ可以在览器和Node.jsq_上运行。采用反应编E方法可以帮助快速实C个高效的API Gateway代码?/span>

服务调用

一个基于微服务的应用是一个分布式pȝQƈ且必采用线E间通信的机制。有两种U程间通信的方法。一U是采用异步机制Q基于消息的Ҏ。这cȝ实现Ҏ有JMS和AMQP。另外的Q例如Zeromq属于服务间直接通信。还有一U线E间通信采用同步机制Q例如Thrift和HTTP。事实上一个系l会同时采用同步和异步两U机制。由于它的实现方式有很多U,因此API Gateway需要支持多U通信方式?/span>

服务发现

API Gateway需要知道每一个微服务的IP和端口。在传统应用中,你可能会编码这些地址Q但是在现在云基的微服务应用中,q将是个单的问题。基服务通常会采用静态地址Q可以采用操作系l环境变量来指定。但是,探测应用服务的地址没那么Ҏ了。应用服务通常动态分配地址和端口。同LQ由于扩展或者升U,服务的实例也会动态的改变。因此,API Gateway需要采用系l的服务发现机制Q要么采?/span>服务端发?/a>Q要么是客户端发?/a>。后l的一文章将会更详细的介l这部分。如果采用客L发现服务QAPI Gateway必须要去查询服务注册?/a>Q也是微服务实例地址的数据库?/span>

处理部分p|

在实现API Gatewayq程中,另外一个需要考虑的问题就是部分失败。这个问题发生在分布式系l中当一个服务调用另外一个服务超时或者不可用的情cAPI Gateway不应该被Lq处于无限期{待下游服务的状态。但是,如何处理q种p|依赖于特定的场景和具体服务。例如,如果是在产品详情늚推荐服务模块无响应,那么API Gateway应该q回剩下的其他信息给用户Q因些信息也是有用的。推荐部分可以返回空Q也可以q回固定的顶?0个给用户。但是,如果是品信息服务无响应Q那么API Gateway应该给客户端返回一个错误?/span>

在缓存有效的时候,API Gateway应该能够q回~存。例如,׃产品h变化q不频繁QAPI Gateway在h格服务不可用时应该返回缓存中的数倹{这cL据可以由API Gateway自n来缓存,也可以由Redis或Memcachedq类外部~存实现。通过q回~存数据或者默认数据,API Gateway来确保系l错误不影响到用户体验?/span>

Netflix Hystrix对于实现q程服务调用代码来说是一个非常好用的库。Hystrix记录那些过预设定的极限值的调用。它实现?/span>circuit break模式Q得可以将客户端从无响应服务的无尽{待中停止。如果一个服务的错误率超q预讑ր|Hystrix中断服务,q且在一D|间内所有请求立d效。Hystrix可以求失败定义一个fallback操作Q例如读取缓存或者返回默认倹{如果你在用JVMQ就应该考虑使用Hystrix。如果你采用的非JVM环境Q那么应该考虑采用cM功能的库?/span>

ȝ

对于大多数微服务基础的应用,实现一个API Gateway都是有意义的Q它像是进入系l的一个服务提供点。API Gateway负责h转发、请求合成和协议转换。它提供l应用客L一个自定义的API。API Gateway可以通过q回~存或者默认值的方式来掩盖后端服务的错误。在本系列的下一文章中Q我们将讨论服务间的通信问题?/span>

原文链接Q?a style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; background: 0px 0px;">Building Microservices: Using an API Gateway (译Q陈李ͼ审校Q杨?

===============================================
译者介l?/span>
陈杰Q北京理工大学计机学院在读博士Q研I方向是自然语言处理在企业网l信誉评h面的应用Q^时也乐于dC些突发的x。在疲于配置pȝ环境时发CDockerQ跟大家一起学习、用和研究Docker?/span>



]]>
微服务实战(一Q:微服务架构的优势与不?/title><link>http://www.tkk7.com/huyi0616/articles/429704.html</link><dc:creator>一杯清?/dc:creator><author>一杯清?/author><pubDate>Thu, 17 Mar 2016 09:54:00 GMT</pubDate><guid>http://www.tkk7.com/huyi0616/articles/429704.html</guid><wfw:comment>http://www.tkk7.com/huyi0616/comments/429704.html</wfw:comment><comments>http://www.tkk7.com/huyi0616/articles/429704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huyi0616/comments/commentRss/429704.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huyi0616/services/trackbacks/429704.html</trackback:ping><description><![CDATA[<span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">【编者的话】本文来自Nginx官方博客Q是微服务系列文章的W一,主要探讨了传l的单体式应用的不Q以及微服务架构的优势与挑战。正如作者所_微服务架构更适合用于构徏复杂的应用,管它也有自q不?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">q篇文章作者是Chris RichardsonQ他是早期基于Java的Amazonite EC2 PaaSq_CloudFoundry.com的创始h。现在他Z业提供如何开发和部v应用的咨询服务。他也经常在</span><a rel="nofollow" target="_blank" style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background: 0px 0px #ffffff;">http://microservices.io</a><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">上发表有兛_服务的文章?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">微服务正在博客、社交媒体讨论组和会议演讲中获得来多的关注,在Gartner?014 Hype Cycle上它的排名非帔R前。同Ӟ软gC֌中也有不持怀疑论者,认ؓ微服务不是什么新东西。Naysayers认ؓq就是SOA架构的重新包装。然而,管存在着不同的争论,微服务架构模式却正在为敏捷部|以及复杂企业应用实施提供巨大的帮助?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="box-sizing: border-box; font-weight: 700; color: #333333; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">q篇博客是关于如何设计、开发和部v微服务的七篇pd文章中的W一?/span><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">读者将会从中学到方法,q且?/span><a style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background: 0px 0px #ffffff;">单体式架构模?/a><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">Q译者注Q本文中会将 Monolithic译为单体)q行Ҏ。这一pd文章描q微服务架构中不同元素。你了解到微服务架构模式的优缺点,以便军_是否更好的将微服务架构应用到自己的项目中Q以及如何应用这一模式?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">首先我们看看Z么要考虑使用微服务?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><h4>开发单体式应用</h4><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">假设你正准备开发一ƾ与Uber和Hailo竞争的出UR调度软gQ经q初步会议和需求分析,你可能会手动或者用基于Rails、Spring Boot、Play或者Maven的生成器开始这个新目Q它的六边Ş架构是模块化?Q架构图如下Q?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><div active"="" style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><a target="_blank" data-fancybox-group="thumb" rel="lightbox" style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; background: 0px 0px;"><img src="http://dockerone.com/uploads/article/20150524/89d9bfed11ff35943269b24b23b866b1.png" title="1.png" alt="1.png" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 625px; margin-bottom: 15px;" /></a></div><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">应用核心是业务逻辑Q由定义服务、域对象和事件的模块完成。围l着核心的是与外界打交道的适配器。适配器包括数据库讉Klg、生产和处理消息的消息组Ӟ以及提供API或者UI讉K支持的web模块{?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">管也是模块化逻辑Q但是最l它q是会打包ƈ部v为单体式应用。具体的格式依赖于应用语a和框架。例如,许多Java应用会被打包为WAR格式Q部|在Tomcat或者Jetty上,而另外一些Java应用会被打包成自包含的JAR格式Q同PRails和Node.js会被打包成层U目录?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">q种应用开发风格很常见Q因为IDE和其它工具都擅长开发一个简单应用,q类应用也很易于调试Q只需要简单运行此应用Q用Selenium链接UI可以完成端到端试。单体式应用也易于部|Ԍ只需要把打包应用拯到服务器端,通过在负载均衡器后端q行多个拯可以轻村֮现应用扩展。在早期q类应用q行的很好?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><h4>单体式应用的不</h4><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">不幸的是Q这U简单方法却有很大的局限性。一个简单的应用会随着旉推移逐渐变大。在每次?/span><a style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background: 0px 0px #ffffff;">sprint</a><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">中,开发团队都会面Ҏ“故事”Q然后开发许多新代码。几q后Q这个小而简单的应用会变成了一个巨大的怪物。这儿有一个例子,我最q和一个开发者讨论,他正在写一个工P用来分析他们一个拥有数百万行代码的应用中JAR文g之间的依赖关pR我很确信这个代码正是很多开发者经q多q努力开发出来的一个怪物?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">一旦你的应用变成一个又大又复杂的怪物Q那开发团队肯定很痛苦。敏捷开发和部v举步l艰Q其中最主要问题是q个应用太复杂,以至于Q何单个开发者都不可能搞懂它。因此,修正bug和正的d新功能变的非常困难,q且很耗时。另外,团队士气也会C坡\。如果代码难于理解,׃可能被正的修改。最l会走向巨大的、不可理解的泥潭?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">单体式应用也会降低开发速度。应用越大,启动旉会越ѝ比如,最q的一个调查表明,有时候应用的启动旉居然过?2分钟。我q听说某些应用需?0分钟启动旉。如果开发者需要经帔R启应用,那么大部分时间就要在{待中渡q,生效率受到极大影响?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">另外Q复杂而巨大的单体式应用也不利于持l性开发。今天,SaaS应用常态就是每天会改变很多ơ,而这对于单体式应用模式非常困难。另外,q种变化带来的媄响ƈ没有很好的被理解Q所以不得不做很多手工测试。那么接下来Q持l部|也会很艰难?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">单体式应用在不同模块发生资源冲突Ӟ扩展会非常困难。比如,一个模块完成一个CPU敏感逻辑Q应该部|在AWS EC2 Compute Optimized instancesQ而另外一个内存数据库模块更合适于EC2 Memory-optimized instances。然而,׃q些模块部v在一P因此不得不在g选择上做一个妥协?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">单体式应用另外一个问题是可靠性。因为所有模块都q行在一个进E中QQ何一个模块中的一个bugQ比如内存泄Ԍ会有可能弄垮整个进E。除此之外,因ؓ所有应用实例都是唯一的,q个bug会影响到整个应用的可靠性?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">最后,单体式应用得采用新架构和语a非常困难。比如,设想你有两百万行采用XYZ框架写的代码。如果想ҎABC框架Q无论是旉q是成本都是非常昂贵的,即ABC框架更好。因此,q是一个无法逾越的`沟。你不得不在最初选择面前低头?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">ȝ一下:一开始你有一个很成功的关键业务应用,后来变成了一个巨大的Q无法理解的怪物。因为采用过时的Q效率低的技术,使得雇䄦有潜力的开发者很困难。应用无法扩展,可靠性很低,最l,敏捷性开发和部v变的无法完成?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">那么如何应对呢?</span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><h4>微处理架?#8212;—处理复杂事物</h4><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">许多公司Q比如Amazon、eBay和NetFlixQ通过采用微处理结构模式解决了上述问题。其思\不是开发一个巨大的单体式的应用Q而是应用分解ؓ的、互相连接的微服务?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">一个微服务一般完成某个特定的功能Q比如下单管理、客L理等{。每一个微服务都是微型六角形应用,都有自己的业务逻辑和适配器。一些微服务q会发布APIl其它微服务和应用客L使用。其它微服务完成一个Web UIQ运行时Q每一个实例可能是一个云VM或者是Docker容器?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">比如Q一个前面描q系l可能的分解如下Q?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><div active"="" style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><a target="_blank" data-fancybox-group="thumb" rel="lightbox" style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; background: 0px 0px;"><img src="http://dockerone.com/uploads/article/20150524/858f9ae6c861c8c93cd5379be54f9fc1.png" title="2.png" alt="2.png" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 625px; margin-bottom: 15px;" /></a></div><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">每一个应用功能区都用微服务完成Q另外,Web应用会被拆分成一pd单的Web应用Q比如一个对乘客Q一个对出租车驾驶员Q。这L拆分对于不同用户、设备和Ҏ应用场景部v都更Ҏ?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">每一个后台服务开放一个REST APIQ许多服务本w也采用了其它服务提供的API。比如,N员管理用了告知N员一个潜在需求的通知服务。UI服务Ȁzd它服务来更新Web面。所有服务都是采用异步的Q基于消息的通讯。微服务内部机制会在后l系列中讨论?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">一些REST API也对乘客和驾驶员采用的移动应用开放。这些应用ƈ不直接访问后台服务,而是通过API Gateway来传递中间消息。API Gateway负责负蝲均衡、缓存、访问控制、API 计费监控{等dQ可以通过NGINX方便实现Q后l文章将会介l到API Gateway?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><div active"="" style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><a target="_blank" data-fancybox-group="thumb" rel="lightbox" style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; background: 0px 0px;"><img src="http://dockerone.com/uploads/article/20150524/0714fcab4f6d5951014e5613657c8289.png" title="3.png" alt="3.png" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 625px; margin-bottom: 15px;" /></a></div><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">微服务架构模式在上图中对应于代表可扩展Scale Cube的Y_q是一个在《The Art of Scalability》书中描q过的三l扩展模型。另外两个可扩展_X轴由负蝲均衡器后端运行的多个应用副本l成QZ轴是需求\由到相关服务?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">应用基本可以用以上三个维度来表示QY轴代表将应用分解为微服务。运行时QX轴代表运行多个隐藏在负蝲均衡器之后的实例Q提供吞吐能力。一些应用可能还是用Z轴将服务分区。下面的图演CE管理服务如何部|在q行于AWS EC2上的Docker上?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><div active"="" style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><a target="_blank" data-fancybox-group="thumb" rel="lightbox" style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; background: 0px 0px;"><img src="http://dockerone.com/uploads/article/20150524/ca6ddafaa8b506ae4d45dde53ee5efb6.png" title="4.png" alt="4.png" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 625px; margin-bottom: 15px;" /></a></div><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">q行Ӟ行程理服务由多个服务实例构成。每一个服务实例都是一个Docker容器。ؓ了保证高可用Q这些容器一般都q行在多个云VM上。服务实例前是一层诸如NGINX的负载均衡器Q他们负责在各个实例间分发请求。负载均衡器也同时处理其它请求,例如~存、权限控制、APIl计和监控?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">q种微服务架构模式深d响了应用和数据库之间的关p,</span><span style="box-sizing: border-box; font-weight: 700; color: #333333; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">不像传统多个服务׃n一个数据库Q微服务架构每个服务都有自己的数据库</span><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">。另外,q种思\也媄响到了企业数据模式。同Ӟq种模式意味着多䆾数据Q但是,如果你想获得微服务带来的好处Q每个服务独有一个数据库是必ȝQ因U架构需要这U松耦合。下面的图演C示例应用数据库架构?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><div active"="" style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><a target="_blank" data-fancybox-group="thumb" rel="lightbox" style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; background: 0px 0px;"><img src="http://dockerone.com/uploads/article/20150524/384781ccf56d3057df5acd198e8d1f3d.png" title="5.png" alt="5.png" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 625px; margin-bottom: 15px;" /></a></div><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">每种服务都有自己的数据库Q另外,每种服务可以用更适合自己的数据库cdQ也被称作多语言一致性架构。比如,N员管理(发现哪个N员更靠近乘客Q,必须使用支持地理信息查询的数据库?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">表面上看来,微服务架构模式有点像SOAQ他们都由多个服务构成。但是,可以从另外一个角度看此问题,微服务架构模式是一个不包含Web服务QWS-Q和ESB服务的SOA。微服务应用乐于采用单轻量协议Q比如RESTQ而不是WS-Q在微服务内部避免用ESB以及ESBcM功能。微服务架构模式也拒l用canonical schema{SOA概念?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><h4>微服务架构的好处</h4><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">微服务架构模式有很多好处。首先,通过分解巨大单体式应用ؓ多个服务Ҏ解决了复杂性问题。在功能不变的情况下Q应用被分解为多个可理的分支或服务。每个服务都有一个用RPC-或者消息驱动API定义清楚的边界。微服务架构模式l采用单体式~码方式很难实现的功能提供了模块化的解决ҎQ由此,单个服务很容易开发、理解和l护?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">W二Q这U架构得每个服务都可以有专门开发团队来开发。开发者可以自由选择开发技术,提供API服务。当Ӟ许多公司试图避免混ؕQ只提供某些技术选择。然后,q种自由意味着开发者不需要被q用某目开始时采用的过时技术,他们可以选择现在的技术。甚至于Q因为服务都是相对简单,即用现在技术重写以前代码也不是很困隄事情?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">W三Q微服务架构模式是每个微服务独立的部|Ӏ开发者不再需要协调其它服务部|对本服务的影响。这U改变可以加快部|速度。UI团队可以采用AB试Q快速的部v变化。微服务架构模式使得持箋化部|成为可能?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">最后,微服务架构模式得每个服务独立扩展。你可以Ҏ每个服务的规模来部v满需求的规模。甚至于Q你可以使用更适合于服务资源需求的g。比如,你可以在EC2 Compute Optimized instances上部|CPU敏感的服务,而在EC2 memory-optimized instances上部|内存数据库?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><h4>微服务架构的不</h4><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">Fred Brooks?0q前写道Q?#8220;there are no silver bullets”Q像M其它U技一P微服务架构也有不뀂其中一个跟他的名字cMQ『微服务』强调了服务大小Q实际上Q有一些开发者鼓吹徏立稍微大一些的Q?0-100 LOC服务l。尽小服务更乐于被采用Q但是不要忘了这只是l端的选择而不是最l的目的。微服务的目的是有效的拆分应用,实现敏捷开发和部v?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">另外一个主要的不是,微服务应用是分布式系l,由此会带来固有的复杂性。开发者需要在RPC或者消息传递之间选择q完成进E间通讯机制。更甚于Q他们必d代码来处理消息传递中速度q慢或者不可用{局部失效问题。当然这q不是什么难事,但相对于单体式应用中通过语言层的方法或者进E调用,微服务下q种技术显得更复杂一些?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">另外一个关于微服务的挑战来自于分区的数据库架构。商业交易中同时l多个业务分M更新消息很普遍。这U交易对于单体式应用来说很容易,因ؓ只有一个数据库。在微服务架构应用中Q需要更C同服务所使用的不同的数据库。用分布式交易q不一定是好的选择Q不仅仅是因为CAP理论Q还因ؓ今天高扩展性的NoSQL数据库和消息传递中间gq不支持q一需求。最l你不得不用一个最l一致性的ҎQ从而对开发者提Z更高的要求和挑战?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">试一个基于微服务架构的应用也是很复杂的Q务。比如,采用行的Spring Boot架构Q对一个单体式web应用Q测试它的REST APIQ是很容易的事情。反q来Q同L服务试需要启动和它有关的所有服务(臛_需要这些服务的stubsQ。再重申一ơ,不能低估了采用微服务架构带来的复杂性?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">另外一个挑战在于,微服务架构模式应用的改变会波及多个服务。比如,假设你在完成一个案例,需要修Ҏ务A、B、CQ而A依赖BQB依赖C。在单体式应用中Q你只需要改变相x块,整合变化Q部|就好了。对比之下,微服务架构模式就需要考虑相关改变对不同服务的影响。比如,你需要更新服务CQ然后是BQ最后才是AQ幸q的是,许多改变一般只影响一个服务,而需要协调多服务的改变很?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">部v一个微服务应用也很复杂Q一个分布式应用只需要简单在复杂均衡器后面部|各自的服务器就好了。每个应用实例是需要配|诸如数据库和消息中间g{基服务。相ҎQ一个微服务应用一般由大批服务构成。例如,ҎAdrian CockcroftQ?/span><a style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background: 0px 0px #ffffff;">Hailo?60个不同服务构?/a><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">QNetFlix有大U?00个服务。每个服务都有多个实例。这造成许多需要配|、部|Ӏ扩展和监控的部分,除此之外Q你q需要完成一个服务发现机Ӟ后箋文章中发表)Q以用来发现与它通讯服务的地址Q包括服务器地址和端口)。传l的解决问题办法不能用于解决q么复杂的问题。接l而来Q成功部|一个微服务应用需要开发者有_的控刉|方法,q度自动化?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">一U自动化Ҏ是用PaaS服务Q例?/span><a style="box-sizing: border-box; color: #155faa; text-decoration: none; cursor: pointer; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background: 0px 0px #ffffff;">Cloud Foundry</a><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">。PaaSl开发者提供一个部|和理微服务的单方法,它把所有这些问题都打包内置解决了。同Ӟ配置PaaS的系l和|络专家可以采用最佛_践和{略来简化这些问题。另外一个自动部|微服务应用的方法是开发对于你来说最基础的PaaSpȝ。一个典型的开始点是用一个集化ҎQ比如配合Docker使用Mesos或者Kubernetes。后面的pd我们会看看如何基于Y仉|方法例如NGINXQ可以方便的在微服务层面提供~存、权限控制、APIl计和监控?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><h4>ȝ</h4><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">构徏复杂的应用真的是非常困难。单体式的架构更适合轻量U的单应用。如果你用它来开发复杂应用,那真的会很糟p。微服务架构模式可以用来构徏复杂应用Q当Ӟq种架构模型也有自己的缺点和挑战?/span><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="box-sizing: border-box; color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="color: #666666; font-family: 'Helvetica Neue', STHeiti, 'Microsoft YaHei', Helvetica, Arial, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">在后l的博客中,我会深入探烦微服务架构模式,q讨如服务发现、服务部|选择和如何分解一个分布式应用为多个服务的{略?/span><img src ="http://www.tkk7.com/huyi0616/aggbug/429704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huyi0616/" target="_blank">一杯清?/a> 2016-03-17 17:54 <a href="http://www.tkk7.com/huyi0616/articles/429704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://www-777730.com" target="_blank">ѹۿ</a>| <a href="http://www-554949.com" target="_blank">AV˾Ʒ</a>| <a href="http://popodino.com" target="_blank">պ߹ۿ</a>| <a href="http://gtja1668.com" target="_blank">ɫַ</a>| <a href="http://18jko.com" target="_blank">AëƬA</a>| <a href="http://wwwyy763.com" target="_blank">˳ŷĻ</a>| <a href="http://imfakaixin.com" target="_blank">ŷAۺһ </a>| <a href="http://vcnxa.com" target="_blank">벻޳?Ƭ</a>| <a href="http://6969aaa.com" target="_blank">һ</a>| <a href="http://yjjinfeng.com" target="_blank">2017һ</a>| <a href="http://9akk.com" target="_blank">A޾VƷ</a>| <a href="http://952268.com" target="_blank">AAƬ߹ۿ</a>| <a href="http://zzhjnmzp.com" target="_blank">ƷëٸAVѾþ</a>| <a href="http://oupur.com" target="_blank">ձһ߶ </a>| <a href="http://w6626.com" target="_blank">aѹۿƵ</a>| <a href="http://miya863.com" target="_blank">ɫͼƬС˵</a>| <a href="http://ruidamo.com" target="_blank">޳ɫۺվ</a>| <a href="http://wwwabxx.com" target="_blank">СƵѹۿ</a>| <a href="http://3333seav.com" target="_blank">Ļ벥</a>| <a href="http://www-474749.com" target="_blank">þþþƷ޳18վ </a>| <a href="http://155562.com" target="_blank">67194ֻѹۿ</a>| <a href="http://345504.com" target="_blank">ӾƷ</a>| <a href="http://gzmsijz.com" target="_blank">þþƷ˵</a>| <a href="http://www16am8.com" target="_blank">ƵƷ</a>| <a href="http://123994.com" target="_blank">ѹۿ</a>| <a href="http://qmoread.com" target="_blank">91޹˾þþƷ</a>| <a href="http://wogool.com" target="_blank">ۺ</a>| <a href="http://8xxon8.com" target="_blank">վɫѿ</a>| <a href="http://jsky163.com" target="_blank">ҹžƵ߹ۿ </a>| <a href="http://t66p.com" target="_blank">ݺɫۺվɫ</a>| <a href="http://chaikexin.com" target="_blank">þƵ</a>| <a href="http://taojin5.com" target="_blank">ҹ㽶Ƭ</a>| <a href="http://tccqdy.com" target="_blank">պƵ</a>| <a href="http://19b1.com" target="_blank">AVַ߹ۿ</a>| <a href="http://48eh.com" target="_blank">þþþþëƬѲ</a>| <a href="http://sshc5.com" target="_blank">Ƶ97Ӱ</a>| <a href="http://sdsupuchem.com" target="_blank">޾Ʒ</a>| <a href="http://1212777.com" target="_blank">պĻһ</a>| <a href="http://xamxx.com" target="_blank">޳avƬ</a>| <a href="http://lkzrgy.com" target="_blank">þþƷav鶹ɫ</a>| <a href="http://5c7m.com" target="_blank">޾Ʒav߹ۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>