50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

如何管理云原生应用程序的依赖关系

  • 2022-11-24
    北京
  • 本文字数:4094 字

    阅读完需:约 13 分钟

如何管理云原生应用程序的依赖关系

许多企业正在将他们的业务转移到云端,这使得他们能够更灵活、更迅速地响应市场的变化,并且更易于拓展自己的业务。但由于要进行大量的规划和实施,所以向云端迁移可能也是一项非常艰巨的任务。术语“云原生”是一种利用云计算交付范式的优势进行开发和运行应用程序的方式。

“云原生”意味着什么?


应用程序在哪里被托管并不重要,重要的是如何开发和部署它们。云原生开发既可以使用公共云,也可以使用私有云。任何云存储都具有存储功能并支持来自全球任意一个公共网关的访问,而无需考虑实际地理位置。它们能够为软件开发者提供按需访问的处理能力以及最新的数据和应用服务。云原生应用是使用微服务开发的,而微服务是小型、独立的服务,它们共同组成了一个更大的应用程序。


微服务是一种能够让开发者更轻松地构建和维护大型应用程序的软件架构。在微服务架构中,将一个应用分成几个独立的小块,即为服务。每一个服务都可以独立开发和部署,整个过程具有更大的灵活性和可扩展性。


微服务可以在几个方面使云基础设施受益。首先,它们允许对应用程序的各个部分进行更细化地控制,云中的应用程序可以轻松地进行部署和管理。其次,微服务使应用程序扩展变得更加容易。当一个应用程序需要扩展或缩减规模时,只对需要改变的服务进行更新即可。最后,微服务可以通过允许滚动更新和部署来提高可用性。当某个服务发生故障时,其他服务会持续运行,从而提高整个系统的弹性。


当一个数据请求被提交后,它会被路由到一些不同的 Docker 容器,每个容器都在运行一套单独的微服务,为消费者提供服务。创建它们的目的是提供被广泛认可的业务价值,比如快速纳入用户反馈以实现持续改进的能力。每个容器负责操作一个针对服务客户的单一服务,这些容器能够为用户提供可扩展性和足够的保护水平。

依赖关系如何适应?



依赖关系是一段代码和另一段代码之间的隐性或显性关系,可以认为是为了正确运行,一段代码对另一段代码的要求。


有两种主要类型的依赖关系:硬依赖和软依赖。硬依赖是指不破坏依赖于它们的代码就无法更改的依赖关系,软依赖关系则可以在不破坏依赖代码的情况下就能被更改。


依赖关系可以是内部的,也可以是外部的。内部依赖是指同一软件系统中两段代码之间的依赖关系,外部依赖是指位于不同软件系统中的两段代码之间的依赖关系。


在云原生应用中,每个微服务都有自己的依赖关系,这些依赖关系由运行微服务的容器来管理,容器负责确保使用正确版本的依赖关系,并使其保持最新。


由于从头开始开发这些特性需要大量的时间,并且设计颇具复杂性,因此使用现有的解决方案要高效得多。既然需要这么多的依赖,也就需要管理这些依赖的解决方案,因此就有了 Maven 或 NPM 这样的包管理器。例如,NPM 要求在部署前将各种依赖关系加载到容器中。许多依赖关系是开源的,各种研究人员都能接触并发现其中的漏洞,这也是它们持续更新的原因之一。


依赖关系是开发者非常关心的问题,一旦被忽视,就会演变为安全问题。开发者如果不够谨慎,便会通过依赖存在已知漏洞的代码,很容易将漏洞引入它们的代码库中。这就是为什么在安装第三方依赖关系之前需要对它们进行扫描,并在它们可用时应用安全补丁是很重要的。


举个例子,NodeJS 通常每月更新一次,每次更新都会修复几个漏洞。因此,必须定期更新这些系统,以确保可以尽可能多地避免与依赖有关的漏洞。

依赖关系管理的最佳实践

当谈论依赖关系管理时,我们会谈论很多不同的策略和考虑事项,例如使用自动依赖关系管理工具或软件包管理器。为了确保依赖关系得到有效管理,以下是一些可以利用的最佳实践。

检测所有未使用的依赖关系

你可以使用 depcheck 来检查是否存在任何没有被使用的依赖关系。需要使用以下命令来安装 depcheck。


npm install depcheck -g
复制代码


安装完毕后,你可以运行下面的命令来检查是否存在未使用的依赖关系。


depcheck
复制代码



检测所有过期的依赖关系

大多数依赖关系是开源的,通常在安全研究人员发现漏洞或增加新的特性时,会在一段时间内更新一次。因此,你的依赖关系可能存在过期的风险。因此,验证和更新过期的依赖关系非常关键。


要检查过时的依赖关系,你可以通过导航到 NPM 文件夹打开终端,运行以下命令:



你也可以使用一个简单的依赖关系检查脚本,它将检查一个 repo 或软件包的所有依赖关系。


#!/bin/bashDIRNAME=${1:-.}cd $DIRNAME
FILES=$(mktemp)PACKAGES=$(mktemp)
find . \ -path ./node_modules -prune -or \ -path ./build -prune -or \ \( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print > $FILES
function check { cat package.json \ | jq "{} + .$1 | keys" \ | sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES
echo "--------------------------" echo "Checking $1..." while read PACKAGE do RES=$(cat $FILES | xargs -I {} egrep -i "(import|require).*['\\"]$PACKAGE[\\"']" '{}' | wc -l) if [ $RES = 0 ] then echo -e "UNUSED\t\t $PACKAGE" else echo -e "USED ($RES)\\t $PACKAGE" fi done < $PACKAGES}
check "dependencies"check "devDependencies"check "peerDependencies"
复制代码

保持所需的依赖关系更新


由于所使用的依赖关系种类繁多,因此有必要确保所需的依赖关系始终保持最新,以确保最佳性能。手动检查和升级这些依赖关系通常需要大量的时间。因此,各种各样的组织利用自动化的依赖关系管理工具,以确保他们的依赖关系在一致的基础上及时地保持更新。NPM 应用程序中的依赖关系是在仓库的 package.json 文件中定义的。这些文件具有以下类型的内容:


{  "name": "herodevs-packages",  "version": "0.0.0",  "scripts": {    "ng": "ng",    "precommit": "lint-staged",    "start": "ng serve",    "build": "ng build",    "test": "ng test",    "lint": "ng lint",    "e2e": "ng e2e",    "build-lazy": "ng build lazy",    "build-dynamic": "ng build dynamicService",    "npm-pack-lazy": "cd dist/loader && npm pack",    "npm-pack-dynamic": "cd dist/dynamic && npm pack",    "package-lazy": "npm run build-lazy && npm run npm-pack-lazy",    "package-dynamic": "npm run build-dynamic && npm run npm-pack-dynamic",    "package": "rm -rf dist/ && npm run package-dynamic && npm run package-lazy"  },  "private": false,  "dependencies": {    "@angular/animations": "^8.0.0",    "@angular/common": "^8.0.0",    "@angular/compiler": "^8.0.0",    "@angular/core": "^8.0.0",    "@angular/forms": "^8.0.0",    "@angular/platform-browser": "^8.0.0",    "@angular/platform-browser-dynamic": "^8.0.0",    "@angular/router": "^8.0.0",    "core-js": "^2.5.4",    "rxjs": "~6.5.2",    "zone.js": "~0.9.1"  },  "devDependencies": {    "@angular-devkit/build-angular": "~0.800.0",    "@angular-devkit/build-ng-packagr": "~0.800.0",    "@angular/cli": "~8.0.2",    "@angular/compiler-cli": "^8.0.0",    "@angular/language-service": "^8.0.0",    "@types/jasmine": "~2.8.8",    "@types/jasminewd2": "~2.0.3",    "@types/node": "~8.9.4",    "codelyzer": "^5.0.1",    "husky": "1.3.1",    "jasmine-core": "~2.99.1",    "jasmine-spec-reporter": "~4.2.1",    "karma": "~3.0.0",    "karma-chrome-launcher": "~2.2.0",    "karma-coverage-istanbul-reporter": "~2.0.1",    "karma-jasmine": "~1.1.2",    "karma-jasmine-html-reporter": "^0.2.2",    "lint-staged": "8.1.0",    "ng-packagr": "^5.1.0",    "prettier": "1.16.1",    "protractor": "~5.4.0",    "ts-node": "~7.0.0",    "tsickle": "^0.35.0",    "tslib": "^1.9.0",    "tslint": "~5.11.0",    "typescript": "~3.4.5"  },  "lint-staged": {    "*.{ts,tsx}": [      "prettier --parser typescript --writeprettier --parser typescript --write",      "git add"    ]  }}Footer© 2022 GitHub, Inc.Footer navigationTermsPrivacySecurity
复制代码

使用自动化依赖关系管理工具

依赖关系管理的自动化有助于以下几个方面。它不仅可以加快你的开发过程,而且还可以确保你的团队中的每个人都在使用相同版本的依赖关系。自动化工具的工作原理是查看你在代码中声明的依赖关系,并将它们与可用的版本进行比较。如果有一个较新的版本可用,该工具将更新你的项目以使用它。


与依赖关系相关的更新日志通常包括在拉取请求中。在配置依赖关系管理工具时,你有很多不同的选项可以选择,比如更新时间,哪个依赖关系必须被更新,如果拉取请求需要自动合并,需要满足什么条件,以及其他许多事项。


Mend Renovate 就是一个例子,它是一个开源工具,为所有类型的依赖关系更新自动创建拉取请求。Renovate 与其他依赖关系更新工具不同,因为它是完全可配置的,可以设置为定期自动更新依赖关系,或者只在有新的安全更新时自动更新。它提供的功能包括:完全自动化地拉取请求创建和合并,基于软件包流行度和测试数据的依赖关系选择,支持多个软件包管理器,包括 npm、yarn、composer,以及为每个仓库定制的更新规则。

结语


在云原生世界中,一个典型的环境是由各种各样的依赖关系支持的。全面地测试这些依赖关系对任何云原生应用的成功都至关重要。然而,手动更新所有的依赖关系可能很困难,也很耗时。自动化的依赖管理工具可以帮助减少花在管理依赖关系上的时间,也可以提高代码的质量。


作者简介:


Guy Bar-Gil,一位经验丰富的产品驱动增长(Product-Led Growth,PLG)主管,在 Mend 公司领导产品驱动增长。在加入 Mend 公司之前,曾在研发团队中任职,并在以色列国防军中担任过战斗操作员。


原文链接:


https://www.mend.io/free-developer-tools/blog/cloud-native-applications-and-managing-their-dependencies/

2022-11-24 09:095567

评论

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

一看就是AI做的网页?ClaudeCode+5句提示词5分钟告别「蓝紫色」AI味儿

阿星AI工作室

AI 产品经理 AI编程 aicoding vibecoding

爬虫新神器:基于MCP的智能体,让数据获取“一键通关”

阿Q说代码

数据分析 智能体 数据获取 MCP 亮数据

仓颉之编译和构建的奇妙旅程

华为云开发者联盟

编译 构建 仓颉 华为开发者空间

工业数字化 信息化经验总结(4)

万里无云万里天

数字化转型 信息化 工业 工厂运维

《2025年,传统企业如何低成本引入AI?》

石头哥谈架构

非传统创新者奖学金:从校园“麻烦制造者”到网络安全领航者

qife122

网络安全 黑客精神

在AI技术唾手可得的时代,挖掘新需求成为创新关键——某知名向量搜索框架需求洞察

qife122

需求分析 AI技术

当DevOps落地实施撞上技术债务,如何量化债务突破困局

禅道项目管理

DevOps 软件开发 技术债务 效能管理 禅道项目管理软件

2025 年主流低代码开发平台推荐与特点分析

科技热闻

(CAPP集成CAD)网页CAD二次开发图纸表格提取功能

WEB CAD SDK

网页CAD 在线CAD WEB CAD CAD表格提取

当AI有了温度,三星正在重新定义生活的边界

Alter

AI

区块链RWA系统的外包开发费

北京木奇移动技术有限公司

区块链开发 软件外包公司 RWA开发

CST基础教程:如何从SYZ参数提取电容C和电感L --- 单端口

思茂信息

cst cst操作 cst电磁仿真 CST软件 CST Studio Suite

什么是低代码平台?2025低代码平台选型指南

万界星空科技

低代码 低代码平台 mes 万界星空科技低代码平台 AI低代码MES

Playwright与PyTest结合指南

测吧(北京)科技有限公司

#人工智能

掘金AI时代计算产业红利的商业伙伴,为什么跟华为组队?

脑极体

AI

企业如何选型:业务系统带低代码更好,还是不带更好?

星云低代码中间件

低代码 企业系统

基于Cursor连接华为开发者空间-云开发环境,部署Dify+MaaS构建智能问答助手

华为云开发者联盟

LLM AIAgent DeepSeek 华为开发者空间 cursor

OpenAI杀进服装店!ChatGPT指挥RFID看店

斯科信息

ChatGPT 斯科信息 RFID技术 OpenAl RFID相控阵门禁

工业数字化 信息化经验总结(5)

万里无云万里天

数字化转型 信息化 工业 工厂运维

大模型那么懂你,为什么(白话篇)

石头哥谈架构

2025中国算力大会:中昊芯英自研TPU全栈能力获权威认可,获评“创新先锋案例”

科技热闻

区块链RWA外包开发

北京木奇移动技术有限公司

区块链开发 软件外包公司 RWA开发

AppsFlyer 电商 App 营销现状报告:从 iOS 买量到再营销,中国电商重塑全球投放逻辑

财见

小红书商品详情API数据解析(附代码)

tbapi

小红书API 小红书数据采集 小红书商品详情API 小红书数据分析

仓颉之I/O 操作的交互奥秘

华为云开发者联盟

I/O 仓颉 华为开发者空间

小红书商品列表API数据解析(附代码)

tbapi

小红书API 小红书商品列表API 小红书商品数据采集 小红书商品数据分析

2025年中国楼宇对讲企业排名前十榜单

新消费日报

元图 CAD 插件化革命:突破效率瓶颈,重构智能协作新范式

元图CAD

插件化 场景化解决方案 元图cad 模块化赋能

AI技术落地IT运维!贝锐向日葵智能审计与脚本功能提效显著

科技热闻

中昊芯英亮相 CCF HPC China 2025:入选“WEC 2025 算力产业全景图”,解码国产 TPU 算力新范式

科技热闻

如何管理云原生应用程序的依赖关系_文化 & 方法_Guy Bar-Gil_InfoQ精选文章