文档章节

微服务架构模式系列文章之二:微服务架构

 普元云计算
发布于 2016/11/14 10:06
字数 2352
阅读 11
收藏 0
点赞 0
评论 0

背景

在开发服务端企业应用时,应用需要支持各种不同类型的客户端,比如桌面浏览器、移动浏览器以及原生移动应用。应用还需要向第三方提供可访问的API,并通过Web Service或者消息代理与其它应用实现集成。应用通过执行业务逻辑、访问数据库、与其它系统交换信息、并返回一条HTML/JSON/XML响应,来处理请求(HTTP请求与消息)。

应用采用多层架构或者六角架构,主要由以下几类不同组件构成:

  • 展现组件——负责处理HTTP请求并响应HTML或者JSON/XML(对于web Services APIs)
  • 业务逻辑——应用的业务逻辑
  • 数据库访问逻辑——用于访问数据库的数据访问对象
  • 应用集成逻辑——消息层,例如基于Spring Integration

不同逻辑组件分别响应应用中的不同功能模块。

问题

应用的部署架构是什么?

需求

  • 应用需要由一个开发者团队专门负责
  • 团队新成员需要快速上手
  • 应用应该易于理解和修改
  • 对应用能够进行持续部署
  • 需要在多台设备上运行应用副本,从而满足可扩展性与可用性的要求
  • 使用各种新技术(框架、编程语言等)

方案

用Scale Cube方法(特别是Y轴扩展)设计应用架构,将应用程序按功能拆分为一组互相协作的服务。每个服务实现一组特定、相关的功能。举例来说,一个应用程序可能由订单管理服务、客户管理服务等多个服务构成。

服务间的通信则可由HTTP/REST等同步协议或者AMQP等异步协议实现。

服务可以彼此独立开发与部署。

每个服务皆有自己的数据库,从而保证其与其它服务解耦。在必要时,可利用数据库复制机制或者应用层事件机制,维护数据库之间的数据一致性。

示例

假设需要构建一款电子商务应用程序,使其能够接收来自客户的订单、验证库存信息与可用信用额度,而后进行发货。该应用程序会包含多个组件,其中StoreFrontUI负责实现用户界面,而其它后端服务则分别负责检查信用额度、维护库存信息以及发送订单。

此应用程序被部署为一组服务集合。

结果

此类解决方案拥有以下优势:

  • 每项微服务相对较小
    • 易于开发者理解
    • IDE处理速度更快,可提高开发者生产效率
    • Web容器启动速度更快,提高开发者生产效率并可加快部署速度
  • 每项服务皆可独立于其它服务进行部署——简化频繁部署新服务版本的流程
  • 易于实现规模化开发。多团队可以共同进行开发工作。每个(双披萨,即团队成员规模控制在订购两块披萨即可吃饱的程度)团队负责其中一项服务。各团队可独立于其他团队,进行开发、部署工作及扩展自身服务。
  • 改善故障隔离。举例来说,如果某一服务出现内存外溢,则只有该服务本身受到影响。其它服务将继续正常处理请求。相比之下,单体架构中的故障组件会令整套系统陷入瘫痪。
  • 每项服务可独立进行开发与部署
  • 无需长期使用同一套技术堆栈

但这类解决方案中也存在着以下弊端:

  • 开发者必须应对创建分布式系统所产生的额外的复杂因素。
    • 现有开发者工具/IDE主要面向单体应用程序,因此无法显式支持分布式应用的开发。
    • 测试工作更加困难。
    • 开发者必须采取服务间通信机制。
    • 很难在不使用分布式事务机制的情况下跨服务实现功能。
    • 跨服务实现功能要求各团队进行密切协作。
  • 部署复杂。在生产环境下,对这类多种服务类型构建而成的系统进行部署与管理十分困难。
  • 内存占用量更高。微服务架构使用N*M个服务实例替代N个单体应用实例,如果每项服务运行自己的JVM(或者其它类似机制),且各实例之间需要进行隔离,那将导致M倍JVM运行时的额外开销。另外,如果每项服务都在自己的虚拟机(例如EC2实例)上运行,如同Netflix一样,那么额外开销会更高。

应用此类方案带来的挑战在于如何把握好时机。在开发应用程序的最初版本时,大家往往不会面临需要使用微服务架构才能解决的问题。另外,使用复杂的分布式架构会拖慢开发流程。对于初创企业,其面临的最大挑战往往在于如何快速发展商业模式及附属应用。微服务架构中的Y轴拆分方式可能使应用更加难以迅速迭代。但是,如果当面临需要解决扩展性问题的时候再去进行功能拆分,单体应用的复杂依赖性使其很难被分解为服务集合。

另一项挑战在于如何将系统拆分为多个微服务。这虽然很棘手但还是有些可行之策。方法之一是根据“动词”或者用例进行服务划分。举例来说,我们经常会在电子商务应用中发现有单独的“发货”服务用于处理已完成订单。另一种常见的“动词”划分方式是实现登录用例的“登录”服务。

另外一种划分方式是根据“名词”或者资源进行系统划分。这类服务负责利用特定的实体/资源完成一系列操作。举例来说,大家可能会在电子商务系统当中发现有“库存”服务用于跟踪货物的库存。

在理想情况下,每项服务都应只面向一小部分职责。Bob Martin曾提出根据单一责任原则(Single Responsibility Principle,简称SRP)进行类的设计。SRP会用单一变更理由去定义一个类的职责:一个类的状态变更只能由一个原因导致。同理,我们也可以在微服务设计当中引入SRP。

另一项可用于指导服务设计的是Unix工具的设计思路。Unix提供大量工具选项,包括grep、cat以及find等等。每种工具都只负责实现一项功能,而且功能良好,它们可以通过Shell脚本与其它工具结合进而执行复杂的任务。

相关模式

微服务相关模式有很多,其中包括:

  • 单体架构是微服务架构的备选方案。
  • 由API Gateway模式定义客户端如何在微服务架构中访问对应服务。
  • 客户端发现模式与服务器端发现模式,用于将客户端的请求路由至微服务架构中的可用服务实例。
  • 消息收发与远程流程调用模式是两种不同的服务通信方式。
  • 每主机一服务模式与每主机多服务模式是两种不同的部署策略。
  • 每服务一数据库模式表示每项服务拥有自己的数据库。
  • 微服务底盘模式是指利用一套可以处理横切关注点的框架来构建微服务。

已知案例

众多大型网站将单体架构发展为微服务架构,其中包括Netflix、Amazon与eBay等。

作为一个热门视频流服务,Netflix利用一套大规模的SOA架构承载着高于30%的互联网流量。该公司每天需要处理来自800多种设备的10亿多次视频流API请求。平均每次API调用会在后端服务中产生6次后续调用。

Amazon.com 最初采用一套双层架构。为了扩展业务规模,其决定迁移至一套由数百项后端服务构成的SOA架构。多个应用调用这些服务,其中包括Amazon.com网站和Web服务API。Amazon.com网站需要调用100到150个服务方可获取到构建一个Web页面所需的全部数据。

作为拍卖网站,eBay.com也是从单体架构逐步转向SOA架构的。其应用层由多个独立应用构成。每个应用负责实现完成一组特定功能的业务逻辑,例如购买或者出售。每个应用皆利用X轴进行拆分,部分应用(例如搜索)以Z轴进行拆分。eBay.com还在数据库层采用了X、Y与Z轴相结合的扩展方式。

原文链接

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 23
码字总数 18356
作品 0
海淀
程序猿DD/SpringCloud-Learning

Spring Cloud教程 本项目内容为Spring Cloud教程的程序样例。如您觉得该项目对您有用,欢迎点击右上方的Star按钮,给予支持!! 我的博客:http://blog.didispace.com 我的小密圈(深度交流与...

程序猿DD ⋅ 2016/11/03 ⋅ 0

微服务实战(一):微服务架构的优势与不足

最近一直在关注关于微服务的知识,偶然在dockone上看到了翻译的系列文章,偷个懒就直接搬到这里了,传说集齐7个可以召唤神龙,哈哈~有兴趣的就看看吧~ 本系列七篇文章列表如下: 微服务实战...

CraneH ⋅ 2016/06/30 ⋅ 0

微服务指南走北(一):微服务是什么

微服务“Microservices”已经成为软件架构最流行的热词之一。网络上看到很多关于微服务的文章,但是感觉很多离我们还很遥远,并且没有找到多少真正在企业场景中应用的实例。此处省略一万字于...

gsying1474 ⋅ 2016/08/10 ⋅ 0

微服务架构的优势与不足(及与SOA区别)

微服务实战(一):微服务架构的优势与不足 作者: Chris Richardson. 来源: dockone.io 发布时间: 2015-05-28 19:58 阅读: 23974 次 推荐: 7 原文链接 [收藏] 摘要:本文来自Nginx官方博客,...

tantexian ⋅ 2016/04/01 ⋅ 0

微服务架构的优势与不足

作者介绍:Chris Richardson,是世界著名的软件大师,经典技术著作《POJOS IN ACTION》一书的作者,也是 cloudfoundry.com 最初的创始人,Chris Richardson 与 Martin Fowler、Sam Newman、A...

银月光海 ⋅ 2016/07/27 ⋅ 0

微服务实战(一):微服务架构的优势与不足

作者: Chris Richardson. 来源: dockone.io 发布时间: 2015-05-28 19:58 阅读: 82751 次 推荐: 24 原文链接 [收藏] 摘要:本文来自Nginx官方博客,是微服务系列文章的第一篇,主要探讨了传统...

Q317075064 ⋅ 2016/11/10 ⋅ 0

微服务实战(一):微服务架构的优势与不足

微服务实战(一):微服务架构的优势与不足【编者的话】本文来自Nginx官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战。正如作者所说,...

天天顺利 ⋅ 2015/05/27 ⋅ 0

微服务指南走北(五):什么样的服务才可以说是微服务?

最近有朋友提出了问题:“是不是拥有了服务发现就是微服务了?”,对于这个问题,很难回答,毕竟微服务的定义在每个人心里都是不一样的,就像“互联网思维”一样,我们说得清“互联网”,却总...

gsying1474 ⋅ 2017/04/23 ⋅ 0

微服务架构的优势与不足

英文原文:Introduction to Microservices   这篇文章作者是Chris Richardson,他是早期基于Java的Amazonite EC2 PaaS平台CloudFoundry.com的创始人。现在他为企业提供如何开发和部署应用的...

huojiao2006 ⋅ 2017/03/06 ⋅ 0

微服务实践(七):从单体式架构迁移到微服务架构

本系列七篇文章列表如下: 微服务实战(一):微服务架构的优势与不足 微服务实战(二):使用API Gateway 微服务实战(三):深入微服务架构的进程间通信 微服务实战(四):服务发现的可行...

CraneH ⋅ 2016/06/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部