9 月 13 日,2025 Inclusion・外滩大会「开源嘉年华」正在限量报名中! 了解详情
写点什么

为什么分布式应用程序需要依赖管理?

  • 2020-10-14
  • 本文字数:2487 字

    阅读完需:约 8 分钟

为什么分布式应用程序需要依赖管理?

分布式云应用程序(又名微服务)已将大量复杂性引入到云软件的设计和运营中。曾经的单体应用将复杂性隐藏在单个进程或运行时中,现在却分散在数十或数百个松耦合的服务中。尽管所有这些服务都可以使用不同的编程语言,并且可以彼此独立地进行扩展,但是分布式特性通常会使应用程序整体难以驾驭、难以部署并且很难保证安全。


这种新的复杂性使得管理和开发云原生应用程序变得越来越困难,并且引发了有关如何维护健康云软件的问题。我们如何才能利用面向服务设计的好处,而又不会在其他地方引入冲突和成本呢?


幸运的是,我们之前已经遇到过这个问题。微服务并不是第一种迫使开发人员弄清楚如何协作,并为无数互连组件操劳的模式。在过去的几十年中,这类问题的解决方案一直是相同的:依赖管理


我们每天都使用依赖管理来重复使用公有和私有软件包,并在他人工作的基础上,将我们自己的应用优雅的封装为可用格式提供给其他人。依赖管理是释放分布式软件能力的关键,背后的原因有很多;现在是时候向过去学习,为云原生开发的未来提供动力了。

1. 开发者协作

依赖管理工具(如NPMPipMaven等)最重要的功能之一是促进开发者之间的协作。通过提供一致的打包机制以无缝扩展代码,依赖管理工具使原本不相关的团队可以互相使用彼此的成果。我们可以在企业内部使用这些工具,以使团队能够在工作中协作并发布自己的成果;我们还看到,依赖管理工具得到了更广泛的应用,以在开源社区中促成协作。依赖管理工具的一致性以及较高的采用率使得社区能够创建功能非常强大且可自由访问的软件库,以供所有人使用并在此基础上继续发展。


虽然这种协作水平已经在社区中针对单个编程语言实现了(针对 Javascript 的 NPM,针对 Python 的 Pip 等),但尚未在云原生社区中完全实现。幸运的是,我们使用 Docker 打包云服务可以保证一致性,但是容器没有足够的有关服务之间关系的信息来解析和扩展依赖关系。如果我们想为微服务实现类似于其他单独编程语言中的依赖管理功能,则非常重要的环节是添加适当的依赖管理工具,以索引并解析与其他应用和服务的关系。

2. 自服务环境

依赖管理工具产生的协作作用并不是凭空产生的。一致的依赖解析器如此强大的主要原因是,世界各地的开发人员都可以使用相同的命令和流程来重现其效果。可重复性是依赖管理工具的关键要素。没有它,开发人员需要使用复杂的传统方式来自行下载和使用其他人创建的库,从而极大阻碍软件库的采用和分发。


在这方面,面向服务的应用程序与基于特定语言的应用并没有什么不同。我们扩展他人工作的能力取决于我们运行或访问我们希望调用的服务或应用。团队能够通过集中式的质量保证或沙箱环境来做出贡献,但无法复现这些环境会带来一系列新问题。工程师无法运营自己的开发环境,依赖其他应用的服务无法轻松交付,开发人员被迫编写自己的脚本以在本地和远程运行他们的应用,每个团队都需要关心生产级工具、网络的信息,以及网络安全性。通过一致的依赖管理工具,团队只需声明其服务的依赖,即可为组织中的每个人提供一致的方式来部署其服务栈及其依赖,从而使每个人都可以运营自己的环境。

3. 自动化

一致的依赖管理工具所具有的自服务优势不仅仅意味着开发人员可以运营自己的环境。这也意味着可以通过自动化的方式来产生和拆除环境。单个命令或过程(用于解决依赖关系、丰富网络和自动化安全性)的一致性是集成到 CI/CD 流水线的完美秘诀!


如果每个服务都可以一致地运行(例如在容器平台上运行)并且知道其自身的依赖,则可以为每个合并请求提供新的环境,并且在合并到相关分支后可以将更改无缝地升级到预发布和生产环境中。这意味着每个团队都可以为每个开发人员和添加到应用程序的每个新服务实现可扩展的GitOps

4. 安全性

微服务架构引入的风险之一是每个服务都需要公开对其功能进行访问的 API。 由于这些服务作为单独的进程存在,因此通过网络进行通信是它们彼此连接并接收处理请求的唯一方式。这意味着每个新服务都会公开一个可供其他人访问的接口,如果开发人员不注意,他们可能会不小心将其公开给错误的参与者。



防止网络接口意外暴露是另一个依赖管理工具可以提供支持的领域。通过开发人员提供其服务的依赖关系的结构化索引,我们不仅可以自动解决这些依赖,而且还可以丰富相应的网络策略来锁定服务调用关系——只有相互依赖的服务才能访问彼此。这种结构化方法极大地减少了开发人员理解网络安全工具的需求,并使他们可以自由的创建更多服务。

5. 灵活性

灵活性是微服务和分布式应用依赖管理工具的另一个好处。开发人员可以捕获依赖项的详细信息并将它们关联到自己的服务,这样解析器本身可以自由地以特定方式在部署环境中检测这些依赖关系。想要尝试不同的 API 网关或服务网格?想要追踪每一个服务的入站和出站的流量来实现分布式追踪?借助依赖管理工具的自动化功能,运营人员可以自由尝试新工具和配置,而不必改动现有服务的代码或干扰开发人员。

为什么它还不存在

依赖关系解析将是一个强大的工具,使开发人员能够进行协作并为云原生应用程序做出贡献,但是我们不能使用已经存在的大量软件包管理器来进行依赖管理吗?虽然使用现有工具会很好,但是解决网络应用程序的依赖关系与解决库与二进制文件之间的关系并不是同样的工作。


对于普通库,满足依赖要求的依赖下载全部在构建时进行,以创建一个主二进制文件/库。但是,微服务不是捆绑到单个二进制文件中,而是需要作为独立服务运行,然后通过网络进行连接。这意味着依赖解析策略还有额外的步骤,并且该步骤发生在与常规库完全不同的生命周期阶段。事实证明,在应用程序生命周期中,我们可以正确解决分布式应用程序依赖关系的最早时间是在部署时。此时,我们既了解堆栈中所有服务之间的关系,也了解目标环境的工具和详细信息,而这一目标环境需要正确配置并用以提供服务连接。


综上所述,很难为网络依赖关系创建大规模的解析器,但是这样做将为工程团队和整个云社区带来巨大好处。如果我们要正确地驾驭云原生工具的不断发展的局面,则需要从过去的依赖管理实践中学习经验。


原文链接:


https://www.architect.io/blog/why-distributed-apps-need-dependency-management


2020-10-14 14:111971
用户头像
陈思 InfoQ编辑

发布了 576 篇内容, 共 299.5 次阅读, 收获喜欢 1306 次。

关注

评论

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

数学建模学习资料

乌龟哥哥

5月月更

C++最佳实践 | 1. 工具

俞凡

c++ 最佳实践

PostgreSQL出现死锁怎么办?

慕枫技术笔记

数据库 5月月更

SpringMVC源码分析:POST请求中的文件处理

程序员欣宸

Java spring 5月月更

跨平台应用开发进阶(十二) :uni-app 实现应用桌面图标角标提示及应用跳转

No Silver Bullet

uni-app 5月月更 桌面角标

【C 语言】指针 Five 之 ["​⚔ 空指针 - NULL、💣 指针使用之前检查有效性、🗡 指针运算 💣 指针+- 整数、💣 指针 - 指针、指针关系运算、💣 标准规定、⚔ 指针和数组、⚔ 二级指针、⚔ 指针数组"]

謓泽

5月月更

[ CloudWeGo 社区动态 ] Kitex 电商项目案例

baiyutang

Go 微服务 5月月更

flask框架【入门学习笔记一】

恒山其若陋兮

5月月更

Linux 入门及常见Shell命令

宇宙之一粟

Linux Shell 5月月更

架构学习(一)

爱晒太阳的大白

5月月更

在线HTML转JSON工具

入门小站

工具

Amazon CodePipeline 与 GitHub 集成

亚马逊云科技 (Amazon Web Services)

GitHub Code

跨平台应用开发进阶(十一) :uni-app 实现IOS原生APP-云打包集成极光推送(JG-JPUSH)详细教程

No Silver Bullet

uni-app ios 5月月更 云打包 原生APP

规模化软件开发的必由之路—大规模自动化测试

刘冉

自动化测试

提效客户体验管理:结合 K-Means 聚类和 RFM 模型的客户分群

龙国富

RFM 客户分群 K-Means

react-router原理分析

正经工程师

React React-Router

Kubernetes 节点弹性扩展实践组件 Amazon Karpenter:部署 GPU 推理应用

亚马逊云科技 (Amazon Web Services)

Kubernetes 部署

架构实战营 - 第 6 期 模块六课后作业

天琪实刚亮

架构实战营

记一次 JMeter 压测 HTTPS 性能问题

阿里巴巴云原生

阿里云 云原生 https Jmeter 压测

密码学系列之:使用openssl检测网站是否支持ocsp

程序那些事

Java 密码学 程序那些事 5月月更

SAP OData V4 模型支持的一些数据绑定模式

汪子熙

JavaScript 前端开发 SAP ui5 5月月更

如何透过 Serverless 与 API 的方式异步搜寻数据湖中的数据

亚马逊云科技 (Amazon Web Services)

Serverless 数据 API

WordPress 编辑用户

海拥(haiyong.site)

WordPress 5月月更

Artery —— 单页面应用接口描述语言简介

全象云低代码

前端 低代码 流程 页面 artery

Linux环境编译静态库

Loken

音视频 5月月更

【刷题第16天】数组中出现次数超过一半的数字

白日梦

5月月更

LinkedList 源码分析-迭代器

zarmnosaj

5月月更

1.1 历史长河中的顶层设计

凌晞

数据结构-复杂度计算经典案例

芒果酱

数据结构 算法 5月月更

M_5: 设计微博系统中”微博评论“的高性能高可用计算架构。

Jadedev

架构训练营

从“数据”到“大数据”,激发数据潜力,深耕智能应用!

亚马逊云科技 (Amazon Web Services)

大数据 数据 智能开发

为什么分布式应用程序需要依赖管理?_架构_David Thor_InfoQ精选文章