速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

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

评论

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

【React源码系列】React Context原理,为什么我建议尽可能少的使用React Redux管理状态 审核中

爱切图的木子老师

react源码 react context react redux

直播商城系统——直播和电商的合理有效结合

开源直播系统源码

软件开发 直播系统源码 直播带货系统 直播商城系统 直播app系统

Web登录很简单?开玩笑!

TimeFriends

8月月更

云原生(二十) | 深入了解Kubernetes(k8s)Service

Lansonli

云原生 k8s 8月月更

圣庭医疗联合创始人谷红仓:高通量基因测序在药物研发和靶向治疗中的应用

阿里云弹性计算

HPC 高性能计算 生命科学 基因测序

Promise.allSettled 的 Polyfill 处理

汪子熙

JavaScript Promise Async 8月月更 web编程

【LeetCode】课程表Java题解

Albert

LeetCode 8月月更

我做了个《联机桌游合集: UNO+斗地主+五子棋》无需下载,点开即玩!叫上朋友,即刻开局!不看广告,不做任务,享受「纯粹」的游戏!

HullQin

CSS JavaScript html 前端 8月月更

低代码实现探索(四十八)后端服务

零道云-混合式低代码平台

组件解析:基础组件button的实现

独来独往

大前端 低代码 可视化 组件化 低代码平台

开源一夏 | 使用 JavaScript 将文本转换为文件

海拥(haiyong.site)

JavaScript GitHub 开源 前端 8月月更

预约直播 | 基于预训练模型的自然语言处理及EasyNLP算法框架

阿里云大数据AI技术

深度学习 阿里云 算法框架

设备管理|风机的日常运行与维护

PreMaint

企业设备管理 预测性维护 设备健康管理 风机的日常运维

借我 1 小时,与 1000 人一起参与开源

腾源会

开源 腾源会

少儿编程是智商税吗?不花钱让孩子赢在起跑线!

博文视点Broadview

阿里云鲍文乐:基于事件的自动化运维最佳实践

阿里云弹性计算

事件 自动化运维 CloudOps

寻找海量数据集用于大数据开发实战(维基百科网站统计数据)

程序员欣宸

大数据 数据集 8月月更

基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP

DS小龙哥

8月月更

五分钟给你的 gRPC 服务加上 HTTP 接口

万俊峰Kevin

Go 微服务 gRPC web开发 go-zero

腾讯发布第二季度财报,腾讯云数据库收入同比增长超过30%

科技热闻

什么是文件存储?与对象存储有什么区别?

wljslmz

文件存储 8月月更

GitHub标星139K的:“嵌入式Linux系统开发教程”

收到请回复

Java Linux 程序员 嵌入式 #运维

AntDB基于WAL日志的DML数据闪回实现

亚信AntDB数据库

AntDB 国产数据库 AISWare AIDB

悟了,应该都了解分布式架构下负载均衡器吧

知识浅谈

负载均衡 8月月更

3 分钟温故知新 RxJS 【创建实例操作符】

掘金安东尼

前端 函数式编程 8月月更

应用缺少POI数据,如何开发地点深度信息?

HarmonyOS SDK

迄今为止最完整的DDD实践

阿里技术

DDD 经验分享

付费会员之我见(43/100)

hackstoic

商业模式

计算机网络(二、物理层)

计算机网络 8月月更

Go-Excelize API源码阅读(十三)—— GetSheetVisible、SetSheetFormatPr

Regan Yue

Go 开源 源码解析 8月日更 8月月更

CSS

武师叔

8月月更

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