写点什么

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

  • 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:094891

评论

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

解密可观测行业中的语义规范 — 代码世界中的“语言艺术”

Greptime 格睿科技

数据库 可观测性 代码 系统可观测性 语义规范

蓝易云 - Ubuntu搭建NFS服务

百度搜索:蓝易云

全能数据分析工具:ableau Desktop 2019 for Mac 中文激活版

你的猪会飞吗

Mac软件 mac软件下载

Zilliz 推出 Spark Connector:简化非结构化数据处理流程

Zilliz

程序员 AI Milvus Zilliz 向量数据库

实战教程:利用淘宝API接口批量抓取商品列表数据

tbapi

淘宝商品列表数据接口 淘宝商品数据采集 淘宝商品列表数据采集 淘宝商品列表接口 淘宝商品API

PIRF-404

EchoZhou

English

VMware vCenter Server 6.7 U3u (安全更新) - ESXi 集中管理软件

sysin

vSphere vmware vcenter esxi

MobPush Android常见问题

MobTech袤博科技

开发者 产品动态

冒烟测试与宇宙飞船

FunTester

天猫商品详情数据接口 | 天猫商品数据采集 | 天猫API接口指南

tbapi

天猫商品详情数据接口 天猫API 天猫商品数据采集 天猫商品详情采集

天谋科技成为中国工业大数据创新发展联盟专业委员会副主任单位

Apache IoTDB

数业智能心大陆:数字化心理健康的未来

心大陆多智能体

智能体 AI大模型 心理健康 数字心理

技术干货丨InspirePolyFoam 高级应用:发泡仿真

Altair RapidMiner

制造业 仿真 智能制造 新材料 altair

蓝易云 - wininet,winhttp,xmlhttprequest,各版本区别

百度搜索:蓝易云

LeetCode题解:1233. 删除子文件夹,排序,JavaScript,详细注释

Lee Chen

LeetCode题解:2073. 买票需要的时间,模拟,JavaScript,详细注释

Lee Chen

安吉尔:净水科技的“自转”革命,守护每一滴纯净

科技热闻

第三届中国 PM&PMO 前沿大会即将开幕!

新消费日报

淘宝天猫商品详情API:商品描述与图片的获取方法

技术冰糖葫芦

API Explorer api 货币化 API 文档 pinduoduo API

ShareSDK ios端 扩展功能业务设置

MobTech袤博科技

Java 开发者 产品动态

蓝易云 - Linux CentOS7 awk的反转功能

百度搜索:蓝易云

蓝易云 - Linux系统gdb调试常用命令

百度搜索:蓝易云

淘宝店铺商品API返回值分析:优化商品展示与推荐

技术冰糖葫芦

API Explorer API 编排 API 文档 pinduoduo API

【YashanDB知识库】离线升级一章22.2不支持直接升级到23.1

YashanDB

yashandb 崖山数据库 崖山DB

《Programming from the Ground Up》阅读笔记:p75-p87

codists

assembly 编程人

蓝易云 - Unity中pivot和center的区别

百度搜索:蓝易云

LeetCode题解:290. 单词规律,哈希表,JavaScript,详细注释

Lee Chen

【YashanDB知识库】汇聚库23.1环境发生coredump

YashanDB

yashandb 崖山数据库 崖山DB

古画新韵——李逸弘国画作品赏析

科技热闻

淘宝商品详情数据接口| 淘宝API接口

tbapi

淘宝商品详情接口 淘宝商品API接口 淘宝API 淘宝商品详情数据

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