微服务意味着分布式系统

Sander Hoogendoorn认为,向微服务迁移就意味着向分布式系统进行迁移,在这里,我们必须要处理延迟、认证与授权、无法到达的消息。通过使用微服务,我们能够将大型系统拆分为更小的组件,从而实现对架构的重新掌控。借助于微服务,我们可以通过扩展并部署单个或一组组件的方式,实现小的变更或添加单独的特性。

Hoogendoorn会在9月12至13日举行的SwanseaCon 2016上做最终的主题演讲,这是在南威尔士举行的第二个有关敏捷开发和软件匠艺的会议。InfoQ对他进行了采访,我们讨论了多个话题,包括单体架构的软件产品的问题、如何使用微服务来构建最小化的可行产品、微服务的测试、微服务如何适应持续交付、微服务的优势和劣势,针对希望实现微服务的组织,他还给出了自己的建议。

有很多人针对微服务相关的话题撰写过文章,涵盖了如何使用和测试微服务、因使用微服务而创建的分布式系统所带来的额外复杂性该如何进行处理,并提供了在组织中实现微服务的建议。

InfoQ:在组织中,采用单体架构的软件产品的最大问题是什么?

Sander Hoogendoorn:单体的系统,不管是采用什么语言编写,运行在什么平台上,随着时间的推移都会不断增长。这意味着会有很多不同的人针对它们来开展工作,每个人在写代码的时候,都有其自己的风格。在系统存在的这些年中,会有特性的添加、修改和移除,这通常会导致不稳定架构的出现。另外,系统不是隔离运行的,通常会与更为广泛的系统进行集成,这样的话,会带来大量的外部接口。

因为很难集成新的特性,所以很多的组织在推出某项新特性的时候会耗费很长的时间才能将其推向市场。创新会减缓,经常会很难甚至根本不可能去拥抱新的技术。

InfoQ:微服务是如何为这些问题提供解决方案的呢?

Hoogendoorn:微服务架构的基本理念就是将大型的系统拆分为更小的组件,因此帮助组织实现对系统架构的重新掌控。这些组件之间的交流会通过易于使用的协议来实现,如基于HTTP的REST和JSON。这个词的前缀“微”意味着组件会按照代码行或服务端点的数量来进行衡量,但是我更喜欢采用领域驱动设计范式中的有界上下文(bounded context)来拆分系统,在这里每个组件会负责处理系统领域中一个独立的部分。

在InfoQ关于微服务反模式的文章中,Vijay Alagarasan阐述了微服务与面向服务架构(SOA)之间的关联关系:

如果你没有合适的人、文化和投入的话,SOA不会实现其业务价值。微服务架构与SOA没有本质的差异,它们的目标是一致的,但是微服务的方式更加精细,我可以这样说,微服务就是实现了可扩展性的SOA。

InfoQ:你们如何使用微服务构建最小化的可行产品(Minimum Viable Product)呢?

Hoogendoorn:按照最小化可行产品的思考方式,意味着要持续关注为产品新增价值,这需要通过提供该价值的最小版本来实现。微服务允许我们通过扩展一个或一组组件,为其添加独立的特性,并将它们(独立地)部署到系统之中。如果搭建了对应的持续交付功能,那么部署所修改组件的新版本就可以通过每日的基础代码来进行,当然这需要有相应的自动化测试。按照这种方式,在组织内部就可以持续地实现小的变更。

InfoQ:测试微服务可以采用什么方式呢?

Hoogendoorn:当你将整个系统拆分为很小的组件时,就需要在很多不同的级别来进行测试。首先,单元测试要覆盖到组件内部的所有内容。其次,服务接口需要进行测试,验证它是否会产生正确的输出或文档,比如JSON对象或PDF。下游的应用或其他的组件如果使用该组件所提供的服务,那么它们也需要进行测试,检验组件的输出是否依然正确。在微服务架构中,服务是松耦合的,通常会使用基于HTTP协议的REST和JSON,因此对于某个服务接口的变更,团队不一定马上就能意识得到。在组件的每次变更之后,都要运行自动化测试,这样的话,整个管道(pipeline)就能尽可能快地发现破坏性的变更。随着组件和服务数量的增长,测试的数量也会快速膨胀,在微服务架构中,我推荐让所有的测试都能实现自动化。

在一个关于微服务开发和测试的采访中,来自Redgate软件的Jose Lima则认为在微服务中,你并不需要将所有的测试都实现自动化,可以由其他的人实现功能检查,而不一定通过测试人员来完成:

有些人会认为测试自动化同样也是一项必备的技能,但我并不认同。首先,我不相信测试自动化,其次,检查自动化也可以由团队的其他人员来执行,并非一定要由测试人员来执行。并没有什么所谓的测试自动化,但肯定有检查自动化——对我而言,测试涵盖的内容要比检查更多,检查的过程可以进行自动化,不过只有你理解了要做什么以及这意味着什么之后,你才能够将功能检查做好(不管是否采用自动化),这样的话就能检查它的行为是否符合预期。

InfoQ:微服务是如何与持续交付协作的?

Hoogendoorn:借助持续交付,每项变更都会成为发布版本的备选内容。在微服务架构中,这意味着一个或一组组件会持续有新版本发布出来。因为这些组件会发布到分布式系统或互相协作的服务之中,所以设计良好部署管道就显得尤为重要,管道需要集成自动化测试的功能,这甚至比持续交付与单体架构结合使用时更为重要。你可能会说在理论上持续交付和微服务能够很好地进行协同。但在我的经验中,组织内将会面临大量的配置,这样做并不一定总能让事情变得更简单。

按照Alagarasan的说法,如果你想要采用微服务的话,持续部署和自动化测试是必需的:

如果你还没有采用持续部署的话,那么作为任意一家企业来讲都应该在这方面进行投资,并致力于实现相关的文化变更。至少,如果你无法实现自动化测试和部署的话,那么就不要采用微服务。微服务的目标在于驱动敏捷性,其中会伴随速度的变化;质量保证会涉及到每一个服务,每项服务都要具有自动化的单元、功能、安全以及性能测试。

InfoQ:微服务的优势和劣势是什么呢?

Hoogendoorn:往微服务架构迁移有助于将大型的系统拆分为更小的组件,从而实现对系统架构的重新掌控。这些独立的组件更加易于管理、替换、部署、扩展和测试。采用新的技术,如新语言、框架或数据库,也会变得更加容易,因为它们可以用于较少的一些组件中,而不必一次性地用到整个系统之中。但是,采用微服务也会带来其他的影响。这些小组件之间的通信会大幅增加。实际上,组织必须要意识到往微服务的迁移就意味着往分布式系统进行迁移,在得到它所有收益的同时,也伴随着分布式系统的所有缺点,包括必须要处理延迟、认证与授权、无法抵达的消息。

在InfoQ上一篇名为“微服务:分解应用以实现可部署性和可扩展性”的文章中,Chris Richardson也认为实现微服务就意味着创建分布式系统:

开发人员必须要处理创建分布式系统所带来的额外的复杂性。开发人员必须要实现进程间的通信机制。要实现跨多个服务的用例的话,如果不使用分布式事务是很难完成的。IDE以及其他的开发工具关注于开发单体架构的应用,并没有为开发分布式应用提供明确的支持。编写涉及到多个服务的自动化测试用例也是很有挑战的。在开发整体架构应用时,你无需处理这样的问题。

InfoQ:对于希望实现微服务的组织,你有什么建议要给他们吗?

Hoogendoorn:考虑采用微服务的组织应该有这样做的正当理由,而不仅仅因为这是当下最火的技术。这样做的理由可以包括当前的系统无法维护、新技术或平台需要纳入到系统中或者新特性推向市场的时间需要大幅减少。但是,当我们向微服务架构迁移的时候,还有很多的方面要考虑进来。它会改变我们设计、构建和测试软件的方式,它会改变我们搭建部署管道、认证与授权的方式,还会改变团队运维和协作的方式,这甚至会改变与组织内外利益相关者的交流方式。但是最为重要的是,需要意识到你将要构建的是分布式系统,这并不简单。有时候,另外一种方案就是采用与微服务相同的设计技术来拆分单体应用,然后依然在单体应用中重构和模块化我们的代码。

Alagarasan建议与总经理和高级主管一起协作,推动实现微服务所需的文化变更:

微服务的目标在于解决三个最常见的问题,也就是提升用户体验、应对新需求的高度敏捷性和降低成本,我们借助细粒度的服务来交付业务功能,就可以解决这三个问题。这并不是什么银弹,它需要训练有素的平台,在这里会以敏捷的方式来交付服务,从而使高质量成为了可能。(...)这是我们讨论容器化、云应用等内容之前所必需的一小步。(...)大多数的行为都会带来组织文化的变更,这是你自己所无法完成的,因此需要确保能够与你的总经理和高级主管进行协作。

原文地址:http://www.infoq.com/cn/news/2016/09/microservices-distributed-system


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

在Eclipse中使用JUnit4进行单元测试(初级篇)

转载自 在Eclipse中使用JUnit4进行单元测试(初级篇)本文绝大部分内容引自这篇文章:http://www.devx.com/Java/Article/31983/0/page/1我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大…

java包 类 方法_Java中包与包之间方法的调用及其关键字区分(基础)

最近在写应用时,对包与包之间方法的调用不太清楚,专门看视频和网站后整理了这篇文章,希望对刚入门的同志有所帮助,进入主题。首先我们先简单看看Java中private、protected、public和default的主要区别:(看不懂没关系&a…

GitHub开源贡献榜:微软超越Facebook和Google排第一

在新任CEO萨蒂亚纳德拉的领导下,封闭许久的微软已于过去几年在变得更加拥抱开源。根据知名代码协作项目网站GitHub上的最新数据,我们发现微软已经位列开源贡献榜的第一名(16419),超过了Facebook(15682&…

Eclipse下导入外部jar包的3种方式

转载自 Eclipse下导入外部jar包的3种方式我们在用Eclipse开发程序的时候,经常要用到第三方jar包。引入jar包不是一个小问题,由于jar包位置不清楚,而浪费时间。下面配图说明3种Eclipse引入jar包的方式。1.最常用的普通操作方式:基本步骤式右击…

java速学_5分钟快速入门Java,不看真的可惜了

你好,世界!源代码组织方式Java程序由packageclass组成,package对应目录的相对路径,class对应文件,如关于class有如下几点规则:文件的名字必须和class的名字一致(public级别的class名字)。文件必须只包含一个…

与微软.NET创始人Scott Guthrie面对面,“红衣教主”亲身传授推动成功转型的洪荒之力

金秋九月,是个即将收获的季节。微软 2016 企业技术决策论坛将于2016年9月21日在北京召开。届时,技术大咖Scott Guthrie 将现身论坛,和嘉宾们现场交流互动。 说起 Scott Guthrie,技术领域的人一定不陌生,Scott Guthrie …

第5步 配置pom.xml文件 pom文件好了就是jar包引入好了

<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><!-- 自动生成的部分…

Tomcat启动超时问题Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds

转载自 Tomcat启动超时问题Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds使用Eclipse启动Tomcat时出现启动超时的问题如下所示&#xff1a;Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds . If the server …

xrkmonitor监控mysql_xrkmonitor字符云监控系统

下面我们对xrkmonitor字符云监控系统文件阐述相关使用资料和xrkmonitor字符云监控系统文件的更新信息。xrkmonitor字符云监控系统xrkmonitor字符云监控系统是一个国产开源监控系统&#xff0c;专注于通过监控系统对软硬件系统进行掌控以及系统相关数据的可视化&#xff0c;通过…

IDE:Eclipse查看Servlet源码

转载自 IDE&#xff1a;Eclipse查看Servlet源码一、源码下载 1、打开tomcat官网&#xff1a;http://tomcat.apache.org/ , 点击右侧下载菜单&#xff08;以tomcat-7为例&#xff09;进入下载页面&#xff1a;http://tomcat.apache.org/download-70.cgi 2、在下载页面&…

eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法

转载自 eclipse中格式化代码快捷键CtrlShiftF失效的解决办法很长一段时间我的eclipse都有个毛病&#xff0c;就是当我要格式化代码的时候&#xff0c;右键-source-format能够起效&#xff0c;但ctrlshiftf不好使了。可以基本断定是快捷键与别的软件冲突了&#xff0c;但一直也…

解决eclipse中jsp没有代码提示问题

转载自 解决eclipse中jsp没有代码提示问题刚装的可以开发jsp的eclipse&#xff0c;结果写jsp的时候没有代码提示&#xff0c;在网上找了半天&#xff0c;各种解决办法都不行&#xff0c;后来在stackoverflow上看到一个解决办法解决了&#xff0c;其他的方法就不说了&#xff…

Cactus在jexus上安装

Cactus基于之前简单后台管理的改良版本&#xff0c;完善了权限管理&#xff0c;为后续的扩展和管理做了铺垫。 完全开放代码&#xff0c;可供学习交流 目前采用MVC4AutofacDapper制作而成&#xff0c;集成一个简单的Blog和权限系统 通过修改配置可以切换数据源&#xff08;目前…

第6步 项目包结构

dao->service->controller util&#xff1a;工具包 vo: value-object/view-object pojo(简单的数据库对象)->vo(value-object 封装简单对象)‘ ’pojo->bo(bussiness-object)->vo(view-object 视图对象) common&#xff1a;常量 全局异常的公共类

在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法

转载自 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法我们在配Spring 或者Hibernate 配置文件的时候&#xff0c;发觉在配置类路径的时候&#xff0c;在双引号下是无法提示包的路径的&#xff0c;这样子很麻烦&#xff0c;不过在MyEclipse中是有得提示…

第7步 mybatis-generator dao层生成器

自动生成 pojo mapper&#xff08;dao层实现&#xff09; dao 第一步 配置这个插件在pom中 第二步复制 generateConfig.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD M…

eclipse xml文件中按没有提示

转载自 eclipse xml文件中按没有提示 方案1:在xml文件上右击-->open with ,看一下xml文件的默认打开方式。我遇到的是在Layout下的xml文件里没有提示信息。查看了一下xml的默认打开方式不是Android Layout Editor&#xff0c;这时需要修改xml文件的默认打开方式&#xff1a…

第8步 第2剑客 mybatis plugin 第三剑客 page helper csdn每天最多发多少文章 是20篇,刚刚才试了。2014

安装插件 安装重启idea 分页插件 github 上有网址 https://github.com/pagehelper/Mybatis-PageHelper aop 将我们的sql再执行一次

解决“Maven项目中的Dynamic Web Module 3.0 requires Java 1.6 or newer”问题

转载自 解决“Maven项目中的Dynamic Web Module 3.0 requires Java 1.6 or newer”问题错误描述 当创建有动态web模块3.0支持的项目时&#xff0c;需要用到Java版本不低于1.6。 在Markers标签页中显示的错误为&#xff1a;Dynamic Web Module 3.0 requires Java 1.6 or newer…