【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

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

评论

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

使用 Amazon SageMaker 构建文本摘要应用

亚马逊云科技 (Amazon Web Services)

Mac音频采样器Kontakt 7最新版v7.3.0下载

Rose

mac音频采样器 Kontakt 7激活版 Native Instruments Kontakt 7 mac下载

图计算引擎分析--GridGraph

京东科技开发者

系统 磁盘 图计算引擎 企业号 4 月 PK 榜 GridGraph

好家伙!阿里新产Java性能优化(终极版),涵盖性能优化所有操作

程序员小毕

数据库 性能优化 JVM 多线程 java面试

企业微信接入系列-扫码绑定/登录

六月的雨在InfoQ

企业微信 三周年连更 企业微信扫码 企业微信接入

阿里P8面试官推荐学习的11大专题:java面试精讲框架文档

做梦都在改BUG

Java java面试 框架

关于软件测试领域的 Happy Path

Jerry Wang

软件测试 测试 自动化测试 测试自动化 三周年连更

基于Flutter实现跨平台离线大模型对话应用

轻口味

flutter ios android AI 三周年连更

Docker容器网络的七种武器

王玉川

Docker 容器 网络 VXLAN 网络虚拟化

产教融合| 赛意信息·讯方·深信息产教融合交流研讨会暨国产工业软件人才培养战略合作示范基地揭牌仪式圆满举办

科技热闻

近期Master分支代码编译异常的解决方案

坚果

OpenHarmony OpenHarmony3.2 三周年连更

基于树莓派设计的音视频播放器(从0开始)

DS小龙哥

三周年连更

2023年超全前端面试题-背完稳稳拿offer(欢迎补充)

肥晨

三周年连更

基于UDP协议的Socket通信

二哈侠

UDP协议 客户端配置 三周年连更

Unity 之 查找游戏物体的几种方式汇总解析

陈言必行

Unity 三周年连更

SpringBoot如何使用Jetty容器?超级详细,建议收藏

bug菌

springboot jetty 三周年连更

PicConvert for mac:以批处理模式转换,调整大小和重命名图像

Rose

苹果软件资源 图片格式转换 PicConvert mac mac图片编辑

告别祈祷式编程|单元测试在项目里的正确落地姿势

浅羽技术

Java 测试 单元测试 JUnit 三周年连更

跨平台应用开发进阶(五十一):HTML5(富文本内容)连续数字、字母不自动换行问题分析及解决

No Silver Bullet

html5 跨平台应用开发 三周年连更 问题分析及解决

PDF编辑软件Acrobat Pro DC 2023 最新版+如何取消Acrobat更新教程

Rose

Acrobat Pro DC 2023 Acrobat Pro DC更新 如何取消Acrobat 自动更新

中软国际亮相OpenHarmony开发者大会,荣获A类捐赠人授牌认可

科技热闻

Shell在日常工作中的应用实践

京东科技开发者

Linux Shell 服务器 shell脚本编程 企业号 4 月 PK 榜

Lambda 应用介绍及实现原理剖析

架构精进之路

Java 后端 Lamdba表达式 三周年连更

通俗易懂篇:贝叶斯网络和它的应用

Bob

网络 贝叶斯算法

如何让 Windows 应用程序在 Parallels Desktop 中启动得更快

Rose

pd虚拟机 pd18虚拟机 Parallels Desktop启动

强大易用的矢量图形设计工具Sketch v96.1最新中文版

Rose

苹果软件下载 Sketch中文版 Sketch V96.1 mac图形设计工具

浅论分布式训练中的recompute机制

百度Geek说

机器学习 深度学习 分布式 企业号 4 月 PK 榜

Java异常Exception详解

timerring

Java 三周年连更

vue3学习-Composition API

格斗家不爱在外太空沉思

Vue 3 三周年连更

一种面向后端的微服务低代码平台架构设计

京东科技开发者

架构 微服务 低代码 企业号 4 月 PK 榜

从多个数据源中提取数据进行ETL处理并导入数据仓库

海拥(haiyong.site)

三周年连更

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