代码编织梦想

作为测试从业者,想要做好微服务的质量保障,就需要对它产生的由来和特点有一个充分的认识,带着问题去理解它的特性,这样学习的思路就会很清晰。正所谓,知己知彼,百战百胜。希望通过本课时的内容,能够让你理解微服务架构,为保障微服务的质量打下一定的理论基础。

首先,我以我自身的两份工作经历,来让你感受下什么是微服务,以及微服务架构的优缺点。这样有利于你理解后面的课时内容,同时更加有代入感。

单体应用架构下的服务特性

我第一份工作是网络游戏的测试保障工作,在功能测试之外做了很多服务端相关的工作,如编译后分发、配置、部署、发布等。那时候的服务端应用程序是几个独立的几十兆、上百兆的文件。每个文件是一个可执行文件,包含一个系统的所有功能,这些功能被打包成一体化的文件,几乎没有外部依赖,可以独立部署在装有 Linux 系统的硬件服务器上。 这种应用程序通常被称为单体应用,单体应用的架构方法论,就是单体应用架构(Monolithic Architecture)。单体应用架构下,一个服务中包含了与用户交互的部分、业务逻辑处理层和数据访问层。如果存在数据库交互则与数据库直连,如下图所示。

Drawing 0.png

单体应用架构下,一个服务中,两个业务模块作为该服务的一部分存在同一进程中,它们通过方法调用的方式进行通信,如下图所示。

Drawing 2.png

通过在单体应用架构下,不同阶段的服务端相关工作,可以感知到单体应用的特性。

1. 日常研发测试阶段

  • 编译:完整编译一次需要 30 到 60 分钟不等,所以一般会限制编译时间,如晚上和午休各一次;

  • 分发:编译完成后,在内网远程复制分发给不同的团队,一般是研发和测试人员;

  • 部署:内网部署较简单,先将服务端文件复制到服务器本地目录,关闭运行中的服务器程序,将新服务器文件覆盖至运行目录,再启动服务器程序即可。

2. 对外发布阶段

服务器在线上进行发布时的操作与内网类似,但每一步会比内网更加严格。受制于公网速度和线上运行的服务器个数,更新服务器需要几个小时,且更新期间服务不可用,因此每次发布计划需要花费研发和测试团队的大量时间。为了确保应用程序不会由于新发布的功能而中断服务,研发团队和运营团队会达成共识,极大减少更新的频次,比如两周左右停服更新一次,除非有特别严重的 Bug 需要修复。

3. 线上运维阶段

因为所有的功能集中在少数的几个服务端文件中,一个 Bug 可能导致某个服务端文件产生崩溃,进而影响服务的使用。在线上运维过程中如果出现性能瓶颈,也不能单独对热点模块进行扩容,只好针对该热点模块所在的服务端文件进行整体的扩容。

4. 其他阶段

服务端的技术栈是在立项时的技术调研阶段,经过慎重评估后选定的。它是一种平衡的技术栈,可以很好地满足所有需求,因此每个团队成员都必须使用相同的开发语言、持久化存储及消息系统。

另外,随着时间的推移、需求的变更和技术人员的更替,服务应用中会形成许多技术债务。因为我完整经历了那个项目,期间经历了多次大规模的“重构”,每次重构对整个项目的人员来说都是“灾难”,但又不得不进行。由于只有几个单独的可执行文件,所以项目文件包含了太多模块,这也使得整个项目非常复杂,每次修改代码就需要非常小心,因为太容易引入新的 Bug 了。

现在应用程序日益复杂化,项目对于迭代速度的要求也越来越高,上述的不足会暴露得更加明显,在这种时代背景下,微服务架构开始在企业生根发芽。

微服务架构下的服务特性

后来我转到了互联网公司工作,所在项目的服务架构与过去经历过的单体应用架构下的服务差异巨大。同等规模的研发团队,服务的个数竟然有近百个,虽然数量众多,但每个服务都只负责一小块儿具体的业务功能,能独立地部署到环境中,服务间边界相对清晰,相互间通过轻量级的接口调用或消息队列进行通信,为用户提供最终价值。这样的服务称为微服务(Microservice)。 从本质上来说,微服务是一种架构模式,是面向服务型架构(SOA)的一种变体,如下图所示。

Drawing 4.png

上图所示,微服务架构下,业务逻辑层被分拆成不同的微服务,其中不需要与数据库交互的服务将不再与数据库连接,需要与数据库交互的服务则直接与数据库连接。

微服务架构下,因为两个服务分别在自己的进程中,所以它们不能通过方法调用进行通信,而是通过远程调用的方式进行通信,如下图所示。

Drawing 6.png

同样,通过在微服务架构下,不同阶段的服务端相关工作,可以感知到微服务的特性。

1. 日常研发测试阶段

因为微服务数量众多,研发和测试团队都有诉求构建一个良好的基础建设。如搭建持续交付工具,通过持续交付工具拉取某微服务代码,再进行编译、分发、部署到测试环境的机器上。再加上,微服务应用程序本身并不大,部署耗时短、影响范围小、风险低,整个编译分发部署的过程在几分钟之内就可以搞定,且几乎是自动完成,因此部署频率可以做到很高。

2. 对外发布阶段

每次功能的变更或缺陷的修复,在接口不变的情况下,不会影响整个应用的使用。即使某个微服务应用出现缺陷,在事先做好熔断机制的情况下,不会导致整个应用的崩溃,这无疑增加了应用整体的可靠性。再加上部署效率高的特点,一个微服务每天可以发布数次,使得用户能快速感受到新特性和产品价值。

3. 线上运维阶段

在线上运维过程中,如果出现了性能瓶颈,只需对热点服务进行线性扩容。如果某服务的服务器资源利用率不高,可以对其进行线性缩容,这都极大提升了资源利用率。

4. 其他阶段

架构设计方面,微服务可以使用不同的语言,采用不同的架构,部署到不同的环境。同时可以采用适合微服务业务场景的技术,来构建合理的微服务模块。

由此可见,微服务的确解决了单体应用架构下服务的诸多短板。单体应用与微服务对比总结如下。

Drawing 8.png

微服务的缺点

当然,事物都有两面性,任何一项技术都不可能十全十美,在解决一定问题的同时,也会引入新的问题。 那么,微服务架构下服务有哪些缺点呢?

从微服务架构设计角度来看。

  • 分布式特性:微服务系统通常也是分布式系统,那么在系统容错、网络延迟、分布式事务等方面容易产生各类问题,这也需要投入较多的人力物力去应对。

  • 技术栈多样性:不同的组件选择不同的技术栈,会导致应用程序设计和体系结构不一致的问题,一定程度上也会产生额外的维护成本。

  • Dev-Ops:微服务架构下需要有一个成熟的 DevOps 团队来处理维护基于微服务的应用程序所涉及的复杂性,同时还需要配备相应的工具。

  • 网络的可靠性:独立运行的微服务使用网络进行交互,这需要可靠且快速的网络连接,同时还需要避免服务间的网络通信存在安全漏洞。

从微服务数量规模角度来看。

  • 线上运维方面:更多的服务意味着要投入更多的运维人力和物力,如服务器硬件资源、运行时容器、数据存储和带宽成本、人力维护成本、线上监控成本等。

  • 团队协作成本:微服务之间主要通过接口进行通信,当修改某一个微服务的接口时,所有用到这个接口的微服务都需要进行调整,当核心接口调整时,工作量更为显著。

  • 团队沟通成本:为了确保一个团队的服务发生更新时,不会破坏另一个团队的功能,就需要相关团队进行大量的沟通、确认工作。

总结

说了这么多,我想使用两个类比,帮助你简单理解微服务架构和单体应用架构的差异:微服务架构更像是活字印刷,单体应用更像是刻版印刷。

本课时通过我两份工作中的实际项目情况,带你领略了单体应用项目和微服务项目的工作日程,以及微服务架构下服务的优缺点。那么针对微服务的诸多特点,会给软件质量保障工作带来怎样的挑战,我将在下一课时中详细介绍。

你是否接触过微服务架构的项目和服务?如果有,欢迎在留言区评论,说说它们有哪些特点,以及这样的特点对你的测试工作带来了哪些困扰和影响? 同时欢迎你把这篇文章分享给你的同学、朋友和同事,大家共同探讨。

参考资料

单体应用架构:https://microservices.io/patterns/cn/monolithic.html
面向服务型架构(SOA):https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E6%9C%8D%E5%8A%A1%E7%9A%84%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84
微服务架构:https://microservices.io/patterns/cn/microservices.html


精选评论

*稳:

单体应用架构下的服务特性讲得非常全面,之前一份工作也是这个流程,遇到的问题非常类似,代码不易读不敢改😓

**涛:

之前一直都是单体,每次重构,测试都是心惊胆战,但又不得不执行。

**5589:

之前公司是单体,现在才明白原来我的换文件换包重启服务就是部署了现在公司是微服务,看了对比之后,有种清晰很多的感觉很适用现在阶段的我这一节已经值这个价格了,期待以后的精彩内容

**英:

期待更新后面的课程

*锦:

经历过单体到微服务改造之路,微服务带来可扩容性,发布快等特点,也给质量保障带来很多挑战,服务间的同步调用和异步通信,整个调用链变得极其复杂

*言:

作者第一家公司是游戏类的,单就游戏来说,很多并不适合使用微服务架构,因为游戏对延迟数要求很高,而这一点恰恰是微服务的缺点。举个例子,王者荣耀这款游戏,假如在团战的时候有点儿延迟。。。。

    讲师回复:

    你说的没错,之前的游戏项目都是单体应用架构。
曾经项目的研发同事后来去了腾讯,经了解腾讯现有的游戏项目服务器早些年也是单体应用,现在也只是部分做了微服务化。

**倩:

对微服务架构感觉肚子里有一肚子疑问,又不知道问什么好

    讲师回复:

    每一点疑问都可以提问哦~

**9564:

公司现在用的微服务,单体架构没怎么接触,学习到了,听了这节课,茅塞顿开,更加深印象😀

*兄:

前排

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sucaiwa/article/details/129611102

微服务架构:是什么?何时用?如何用?-爱代码爱编程

K8s已经成为一线大厂分布式平台的标配技术。你是不是还在惆怅怎么掌握它?来这里,大型互联网公司一线工程师亲授,不来虚的,直接上手实战,3天时间带你搭建K8s平台,快速学会K8s,点击下方图片可了解培训详情。 引言 微服务近年来受到了极大的关注并成为趋势,不信的话可以查看 Google Trends。 可以看到从2014年开始人们对它产生

微服务升级优点_微服务架构有什么优势?-爱代码爱编程

就目前来看微服务并没有一个严格的定义,每一个人对微服务的理解都是不一样的. Martin Fowler 在它的博客中是这样表述微服务的 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每一个服务运行在自己的进程中,服务间通信采用的轻量级通信机制(通常用 HTTP 资源 API)。 这些服务围绕业务能力构建并且可通过全自动部署机制独

什么是微服务架构?微服务架构有什么特性?为什么选择Spring Cloud?-爱代码爱编程

文章目录 1.学习目标2.什么是微服务架构?3.微服务架构有什么特性?服务 组件化按业务 组织团队做“产品”的态度智能端点与哑管道去中心化 治理去中心化 管理数据基础设施自动化容错设计演进式设计4.为什么要用SpringCloudSpring Cloud 简介 1.学习目标 ​ 无论是初学者还是有很久工作经验的工作者,希望大家能明白以下几个问

你知道微服务架构深度解析:微服务的主要特性有哪些吗?-爱代码爱编程

微服务主要特性 粒度更细的服务 微服务架构相比SOA分布式架构强调按业务边界做细粒度的服务拆分。SOA架构使用粗粒度的服务模式来封装业务和技术能力,减少服务交互,但同时带来了业务耦合的复杂性。而微服务架构本质上是一个做减法的架构,将规模庞大的单体系统进行服务拆分,每个细粒度服务的功能和职责单一。当然,服务的粒度并不是拆得越细越好,如果拆分不当,还会造成

微服务架构与SpringCloud:微服务架构的特点-爱代码爱编程

微服务架构与Spring Cloud 近几年大家都在谈论云原生和微服务,例如 © 云原生技术能够帮助公司和机构在私有云、公有云和混有云等新型动态环境中,构建和运行可弹性扩展的应用。 微服务架构是一项在云端部署应用和服务的新技术。 诸如此类,不一而足。 而在实际中,我们也同样可以看到,越来越多的企业和机构都使用了基于 Spring Cloud架的技

架构解密从分布式到微服务:微服务架构到底是什么?_java小白速成记的博客-爱代码爱编程

微服务架构 微服务架构是当前很热门的一个概念,是技术发展的必然结果。微服务架构也不是一个缥缈、空洞的术语,它的核心理念与架构原则是实实在在的,虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合项目的特点来选择某个合适的微服务架构平台,稳妥地实施项目的微服务化改造或开发进程。 微

开发者,微服务架构到底是什么?_王 子的博客-爱代码爱编程

🧑‍💻作者:大二计算机学生 🏠主页:关注学习更多技术 📌关键:微服务 软件开发 架构 概念 大家好,今天分享的是企业香饽饽的架构,微服务架构,读完本文,相信你会对微服务的概念清晰很多,我是小周,如果觉得文章写的不错,记得三联支持可怜的博主呀 文章目录 单体架构服务化微服务架构微服务框架Java 微服务框架Go 语言微服务框架Phy

微服务架构九大特性_kuo-teng的博客-爱代码爱编程

微服务架构九大特性 1. 服务组件化2. 按业务组织团队3. 做“产品”的态度4. 智能端点与哑管道5. 去中心化治理6. 去中心化管理数据7. 基础设施自动化8. 容错设计9. 演进式设计 Martin Fowler在Microservices一文中,提炼出了微服务架构的九大特性,用于指导大家设计架构。 1. 服务组件化 组件,是一个可以

微服务架构中各个组件都需要使用哪些技术?_blue92120的博客-爱代码爱编程

在微服务架构中,不同的组件(包括微服务实例、注册中心和API网关等组件)需要根据不同的情况来选取相应的技术,那么我们可以使用哪些技术呢?本节将对微服务架构中各个组件可使用的技术进行简单介绍。 1.微服务实例的开发 微服务的开发可以选用的框架技术有Spring 团队的Spring Boot、Jboss公司的WildFlySwarm 和Java EE官方的

【从零开始学微服务】04.微服务架构的特点-爱代码爱编程

大家好,欢迎来到万猫学社,跟我一起学,你也能成为微服务专家。 微服务架构被技术大牛们总结出了以下九个特点: 服务组件化围绕业务功能产品而不是项目强终端弱管道去中心化管理去中心化数据管理基础设施自动化容错性设计演

linux kernel内核整体架构(图文详解)_内核结构图-爱代码爱编程

1,前言 本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。 注:本文和其它的“Linux内核分析”文章都基于如下约定: a) 内核版本为Linux 3.10.29(该版本是一个long