“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

微服务意味着分布式系统

  • 2016-09-17
  • 本文字数:3404 字

    阅读完需:约 11 分钟

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 建议与总经理和高级主管一起协作,推动实现微服务所需的文化变更:

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

查看英文原文 Microservices Imply a Distributed System

2016-09-17 19:006293

评论

发布
暂无评论
发现更多内容

国产接口调试工具ApiPost中的内置变量

Proud lion

大前端 测试 后端 Postman 开发工具

最小二乘法,了解一下?

华为云开发者联盟

数据 数据处理 计算 最小二乘法 数学工具

使用mock.js给前端生成需要的数据

与风逐梦

大前端 后端 开发工具

🏆「作者推荐」Java技术专题-JDK/JVM的新储君—GraalVM和Quarkus

洛神灬殇

Java JVM GraalVM 8月日更

带头撸抽奖系统,DDD + RPC 开发分布式架构!

小傅哥

DDD 小傅哥 架构设计 springboot 抽奖系统

Java NIO在接口自动化中应用

FunTester

Java nio 接口测试 测试开发

多样数字人民币钱包来袭,阻力与动力并存

CECBC

PageHelper原理深度剖析(集成+源码)

阿Q说代码

ThreadLocal 分页 PageHelper 8月日更 mybatis的拦截器

智能运维系列直播间开讲啦,就在今天!

浪潮云

6种常用Bean拷贝工具一览

码农参上

8月日更 对象拷贝

来了!《中国移动2021智能硬件质量报告》正式发布

Go- 函数参数和返回值

HelloBug

函数 参数 返回值 Go 语言

带你梳理Jetty自定义ProxyServlet实现反向代理服务

华为云开发者联盟

容器 k8s jetty Servlet引擎 ProxyServlet

传统到敏捷的转型中,谁更适合做Scrum Master?

华为云开发者联盟

Scrum 敏捷 团队 项目经理 Scrum Master

云小课 | 详解华为云独享型负载均衡如何计费

华为云开发者联盟

负载均衡 华为云 弹性负载均衡 独享型ELB实例 独享型负载均衡

后Kubernetes时代的虚拟机管理技术之kubevirt篇

谐云

虚拟机 #Kubernetes#

手撸二叉树之二叉树的坡度

HelloWorld杰少

8月日更

从lowcode看下一代前端应用框架

百度Geek说

大前端 lowcode

Golang:再谈生产者消费者模型

Regan Yue

协程 Go 语言 8月日更

区块链+物联网设备,能产生什么反应?

CECBC

一分钟学会使用ApiPost中的全局参数和目录参数

CodeNongXiaoW

大前端 测试 后端 接口工具

NameServer 核心原理解析

leonsh

RocketMQ 消息队列 NameServer

protocol buffer的高效编码方式

程序那些事

Java protobuf 程序那些事

在?进来看看新一季周边到底做点啥?【话题讨论】

气气

话题讨论

零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能

JackJiang

音视频 WebRTC 即时通讯 IM

以区块链为基础 通证经济是下一代互联网的数字经济

CECBC

KubeCube开源:魔方六面,降阶Kubernetes落地应用

网易数帆

开源 Kubernetes 容器 KubeCube

Android模块化开发实践

vivo互联网技术

android 架构 开发 项目实战 模块

打造数字人民币的大运应用场景

CECBC

web技术分析| 一篇前端图像处理秘籍

anyRTC开发者

大前端 音视频 WebRTC web技术分享

GraphQL设计思想

Ryan Zheng

graphql

微服务意味着分布式系统_SOA_Ben Linders_InfoQ精选文章