您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

实践微服务六年,我获得了这些心得体会

时间:2020-10-30 09:59:07  来源:  作者:

使用微服务架构将导致基础架构的需求、成本和复杂性激增,但会提高企业服务的连续性和弹性,进而影响企业整体运行文化。在采用微服务之前,企业需要花费时间和精力去了解微服务架构,以及架构与企业自身的相关性。作为一名软件工程师,本文作者给出了对采用微服务架构的切身体会。

本文最初发布于 Medium,经原作者授权由 InfoQ 中文站翻译并分享。

我是一名微服务架构的忠心拥趸,虽然有时也会对其感到不爽。使用微服务时,我时常能感受到“小中见大”、“稳中有快”等理念,另一方面也会警惕“厨子太多烧坏了汤”。

回顾 2014 年,当时我任一家公司的软件工程主管,该公司正在通过采用微服务架构实施数字化转型。那时数字化、转型和微服务这些词对我就是天籁之音。作为一名工程主管(虽然我目前是一位解决方案架构师),我非常希望能了解这种新模式。为了跟上技术前沿趋势,我阅读了大量微服务架构相关的文章,与我的网络技术负责人交流,并研究了一些适用的用例。那时我发自内心地相信微服务架构,确信单体应用将会消亡。此后,我服务过的每家公司都已采用或正在采用微服务架构。虽然其中一些公司的领导团队并没能说服组织为什么要选择微服务,一个普遍的回答是:“其他公司都在这样做,在每次会议上大家都说微服务是一种改变游戏规则的方式,所以我们也这样做吧。”通过为各个业务领域中的多家公司提供体系结构和设计支持,我发现将现有的单体应用重新架构为微服务架构需要付出大量的耐心、时间和经验。

在给出我在采用微服务中的五点切身体会之前,首先重新审视一下什么是微服务?有说法提出,这种架构样式事实并没有一个的标准定义,只是存在一些“围绕组织和业务能力、自动部署,端点智能、对语言和数据分散控制”的特征。在我看来,如果一个组织必须具备上述所有特征才能去使用微服务,那么我们就不仅是在谈论技术变革,而是在推动组织内的重大文化变革。

下面给出我在实践微服务中的五点主要体会。

跳出项目,拥抱产品

实践微服务六年,我获得了这些心得体会

 

传统的软件开发方式中,开发团队一起构建一个单体应用软件,进而由生产支持团队管理该软件。在这种方式中,生产支持团队作为软件的新所有者,通常并不完全了解组件的构建过程,例如代码的逻辑,所使用的技术等。他们的核心工作是确保满足业务需求的生产系统能正常地运行,团队之间通常也没有定义有效的沟通途径。生产系统中出现的问题将导致开发回滚到某个还原点,或是给出快速的短期修补。有时,生产代码中的一个微小问题将触发整个过程全部重新开始。而问题通常必须由原始开发团队解决,这导致整体延迟。

如果以瀑布式开发方式(即前期设计、集中式的版本发布流程、构建和部署)处理微服务,则存在巨大的风险。最终得到的可能是一个更复杂的系统,无法享受微服务所承诺的任何好处。

在微服务中,经常提及的是“产品”,而非“项目”。使用微服务方法,利益相关者(包括用户、程序、产品和技术人员)致力于产品这一共同目标。在投资、软件交付到维护的整个过程上,产品模式都不同于项目模式。产品直接影响所提供的业务功能。不同于传统方法中构建单体应用需要多个团队参与,微服务模式支持单个团队完全负责构建和管理某一小部分软件。团队在产品模式下是稳定的、跨职能的,并以结果为导向的,独立完成“设计 - 构建 - 运行”全过程。每个团队都是遵循统一报告层级的独立部门,根据路线图去分块构建独立的软件单元。某一层上的团队可将另一层上的团队视为他们的(内部)客户,相互协作去解决业务问题,而不是以权责交付的方式工作。由于工程团队以产品模式工作,他们了解软件在生产中的行为,因此可以立即解决所有问题,避免产生延误。

CapitalOne 秉持 YBYO(You Build You Own,自己构建)理念,团队全权负责设计、构建、测试和部署生产环境中的软件。工程团队直接参与产品,并与用户互动。用户不断提供反馈,帮助团队构建高质量的产品。

要点:控制范围使团队可以更好地构建和管理微服务。产品模式支持与终端用户建立更紧密的合作、管理和构建关系。

更具责任感和自由度:思考宏观,服务“微”构建

实践微服务六年,我获得了这些心得体会

 

我在加入 CapitalOne 之前曾任职另一家公司的团队,为公司的电子商务网站建立产品目录服务。该公司采用了微服务方法,产品目录服务以请求为准则,向最终用户提供产品列表。由于我的团队控制着数据和目录数据库,因此选择 JAVA 和 SpringBoot 构建服务。这些编程语言支持丰富的软件库,我们对此非常满意。服务最终公开提供在面向最终用户的 API 网关上。

公司中同样还有其他几个团队,使用各自的技术来构建自己的服务。从产品的角度来看,每个功能都受到构建在异构平台上的各个服务的支持。这样的模型解决了一个重要的问题,那就是在招募和培训团队中,不必使用相同的技术堆栈构建单体应用。在微服务模型中,每个团队都可以选择适合自身业务需求的工具,据此招聘新的团队成员。

微服务是一种通过服务构建其中业务应用组件的体系架构。每个服务都是业务流程中的一个独立于其他服务的逻辑软件单元。这种不依赖于其他服务和技术选择的自由度,打开了探索新技术、构建本地软件组件以及基于服务定义范围进行设计的大门。

在 CapitalOne,软件产品与业务功能是保持一致的。各个业务线(lines of businesses,LOB)构建和管理自己的产品。跨职能的业务线主要是用于构建和管理企业产品的,例如满足所有 LOB 需求的数据湖和平台。

要点:松耦合和紧关联的原则,支持团队构建各种解决更大业务问题的产品。

关键在于实现:RESTful 一劳永逸

实践微服务六年,我获得了这些心得体会

 

微服务架构实际上是一种微组件架构。“微”指组件的粒度细,而不是指所暴露接口的粒度。微服务是以 API 为接口的组件,但并非所有的微服务组件都暴露 API。在从单体应用向微服务架构过渡中,我们可以保持暴露的 API 数量不变。在这一过渡过程中,确定初始计划将需要几天甚至几个月的时间,反过来增加了初始阶段的前期成本。大型应用分解为微服务,可能需要更多团队的协作。其中持续存在着过度工程的风险,导致创建了比需求更多的微服务,增加了体系结构的复杂性。

我在加入 CapitalOne 之前曾任职的一个公司,确定了一些可迁移到微服务架构的单体业务应用。产品的愿景并没有发生改变,因为整体的业务功能没有改变。公司招聘了更多的团队,期望这些团队担当起服务的所有者。公司根据发布时间表部署服务,但基础架构团队并未受到计划的影响,仍然掌控着生产系统。计划在启动两年后的进展不大,花光了预算。

如上的许多实例表明,公司内部团队应对微服务的实现做更好的沟通。实现数字化转型的不仅仅是应用的开发和新的技术,还需要在产品分析、预算估算、架构、部署程序的重新设计、基础架构扩展等过程上做大量的工作。过渡到微服务,需要时间、金钱,以及对业务问题看法上的重大转变。

要点:微服务并非只是一种架构方式,而是一种会影响到组织中每个团队的文化变迁。

收益是长期的:虽然复杂代价大,但是弹性可扩展

实践微服务六年,我获得了这些心得体会

 

采用微服务需要建立多个产品、服务和团队。在采用这种复杂的体系结构之前,组织必须确立一个扎实的路线图。企业需要采用强大的企业级产品,支持各个团队以微服务方式工作,凝聚在一起。其中包括支持 API 文档的工具,以及源代码管理、问题追踪器和实现自动部署的工具等协作工具。

服务由工程团队构建,以 API 方式暴露在 API 网关上。API 网关类似于一个 REST API 的市场,是组织日常业务运营的骨干。一旦组织步入微服务方法的正轨,持续的服务流就能得以创建、升级、替换等。工程师可能并不知道每个服务的确切位置,由服务发现系统支持服务的自动检测,使得服务之间可以互相发现。

为了获得更好的性能和故障隔离,微服务组件需要一个专门的基础架构。每个微服务应具有自己的发布时间表,无需依赖于其他服务而随时部署到生产环境。因此,选择有效工具持续并实时监视和分析微服务的是至关重要的。API 是微服务世界的接口,因此 API 的日志记录、性能监视和安全性也是组织中 IT 服务过程的关键。

构建有弹性的微服务,可遵循多种设计模式,例如,“重试模式”(Retry Pattern)通过透明地重试失败操作尝试连接到服务或网络资源,支持应用处理瞬态故障;“断路器模式”(Circuit Breaker pattern)支持应用在连接远程服务或资源时发生错误时能很好地处理故障。这样避免了微服务生态系统中出现级联故障,进而提高应用的稳定性和弹性。在微服务中,每个服务都是独立的组件,每个功能和服务都可以扩展,而不必扩展整个应用。关键服务可部署多个实例,实现高可用性和更好的性能,而不会影响其他服务的性能。

要点:尽管过渡到微服务需在前期需投入大量的资源和工作,但随着时间和工作上的付出,以及自动化工具的使用,业务将从中受益,可快速向市场交付有质量产品。

微服务并不普适

实践微服务六年,我获得了这些心得体会

 

并非所有的业务和用例都适用微服务。例如,团队必须构建具有很少功能的简单应用,或是大型单体应用无法拆分成较小的模块,或是不了解微服务体架构所带来的权衡。此外,某些企业可能尚未具备快速开发和部署应用的能力,或是不需要持续监视应用或业务,因为发生故障的恢复时间较长对业务影响不大。

和所有其他工具一样,微服务只是一种工具,并非普适于所有业务问题的解决方案。业务优先于一切,底层系统则可以适应任何体系架构模式,无论是单体应用还是微服务。在决定使用微服务之前,每家企业必须首先了解自身的业务需求,权衡利弊后再决定是否转向微服务。

CapitalOne 在完全采用云和微服务架构之前,投入了大量时间和精力研究微服务应用。有能力的领导、富有远见的产品团队和技术精湛的工程团队通力合作,使得 CapitalOne 实现了银行技术领导者这一目标。

要点:使用微服务并非免费的午餐。

使用微服务架构将导致基础架构的需求、成本和复杂性激增,那么企业为什么要采用微服务?具有大客户群的大公司,将通过在短时间内向客户提供优质的产品而蓬勃发展。他们的系统需要始终保持运行的状态,为分布在各个地区的客户提供服务。微服务是一种有助于实现此目标的解决方案。在当今的世界中,随着云原生基础架构的出现、DevOps 交付管道的自动化以及容器的采用,公司应该研究一下微服务的优势。

需要指出的是,企业决定选用某种技术,并非完全因为别人用着很酷。相反,在采用微服务之前,我们需要花费时间和精力去了解这种架构模式,该架构与企业自身的相关性。希望我的切身体会能有助于读者深入了解微服务。

原文链接

https://medium.com/capital-one-tech/5-key-takeaways-from-my-experience-with-microservices-3b40a57b136d



Tags:微服务   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  Tags: 微服务  点击:(8)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  Tags: 微服务  点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  Tags: 微服务  点击:(35)  评论:(0)  加入收藏
实施微服务架构,我们一直在遵循一个实践原则:每个微服务要有自己独立的数据库,避免数据库层面的耦合。这种理所当然感觉好像不需要多加思考,就是应该这样做; 图片来源:James Lewi...【详细内容】
2021-10-11  Tags: 微服务  点击:(42)  评论:(0)  加入收藏
在今年的NGINX Sprint 2.0虚拟大会上,NGINX(来自流行的开源web服务器/负载均衡器和反向代理背后的公司F5),发布了NGINX现代应用参考架构(MARA)。该公司在一篇博客文章中说,这将帮...【详细内容】
2021-09-26  Tags: 微服务  点击:(60)  评论:(0)  加入收藏
今天,字节跳动正式宣布开源 CloudWeGo。这是一套以 Go 语言为核心、专注于微服务通信与治理的中间件集合,具有高性能、可扩展、高可靠的特点。项目地址:https://github.com/clo...【详细内容】
2021-09-08  Tags: 微服务  点击:(93)  评论:(0)  加入收藏
1. Spring Boot 与 Spring Cloud Spring Boot 是用于编写微服务的 Java 基础框架。在Spring Cloud 提供了各种构建全栈微服务的功能。构建小型和大型系统都适合。由于控制反...【详细内容】
2021-08-31  Tags: 微服务  点击:(162)  评论:(0)  加入收藏
现有问题在 EFK 日志收集 篇中,我们讲解了如何利用 EFK 收集 Kubernetes 集群日志。但是,还存在如下问题。 Elasticsearch 以单节点的形式部署,不能满足生产环境的要求 Fluentd...【详细内容】
2021-08-13  Tags: 微服务  点击:(102)  评论:(0)  加入收藏
在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。 名称 版本 发布时间 开发商 GitHub ...【详细内容】
2021-08-06  Tags: 微服务  点击:(173)  评论:(0)  加入收藏
一、微服务的现状及未来1.服务架构的演变1.1 单体架构  单体架构应该是我们最先接触到的架构实现了,在单体架构中使用经典的三层模型,即表现层,业务逻辑层和数据访问...【详细内容】
2021-07-22  Tags: 微服务  点击:(125)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(3)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(8)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(20)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(16)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条