时隔16年Jeff Barr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

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

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

评论

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

IDC 2022上半年中国IT安全软件市场15.1亿美元,行云管家为企业信息安全持续赋能

行云管家

信息安全 数据安全 企业安全

用户文章 | 原来Steam和Perforce有这种关系?!

龙智—DevSecOps解决方案

版本控制 版本管理工具 版本管理

ITSM | 企业如何管理变更、响应事件以及创立知识库——专访龙智技术专家与顾问

龙智—DevSecOps解决方案

CleanMyMac2023体验版苹果电脑管家

茶色酒

CleanMyMac CleanMyMac2023

java的这些多线程面试专题,你都知道吗?

钟奕礼

Java 程序员 java面试 java编程

阿里云存储负责人吴结生:重新定义下一代云存储

云布道师

云存储 云栖大会

浅析分布式事务的底层实现模型

移动云大数据

2022年秋招成功斩获offer秘籍:九大核心知识+1000道大厂面试真题

程序知音

Java java面试 大厂面试 java架构 Java面试八股文

万级并发分布式全链路压测工具 autotest 实践

车江毅

自动化测试 全链路测试 性能压测 生产环境全链路压测

代码质量与安全 | “吃狗粮”能够影响到代码质量?来了解一下!

龙智—DevSecOps解决方案

代码质量 代码安全 静态代码安全

深度学习框架新手快速上手指南

MegEngineBot

深度学习 开源 教程 MegEngine 新手入门

现在啥软件都有开源,BI 呢?

陈橘又青

数据库

「美团」Java岗150道面试题:集合+JVM+设计模式+spring+Redis等

钟奕礼

Java java程序员 java面试 java编程

行业首个测试开发技术大赛开始报名啦~ 10万现金奖励等你来挑战

测试人

软件测试 自动化测试 测试开发 测试比赛

2022 Java 企业面试题汇总

钟奕礼

Java java程序员 java面试 java编程

Fruity Loops Studio2023最新版水果编曲软件下载

茶色酒

Fruity Loops Studio

Nacos 中的配置文件如何实现加密传输

小小怪下士

Java 程序员 微服务 SpringCloud

Rancher 全球化部署最佳实践

Rancher

Kubernetes k8s rancher

Zookeeper安装与基础命令操作

石臻臻的杂货铺

zookeeper 11月月更

JAVA面试基础经典百问,拿下大厂offer

钟奕礼

Java java程序员 java面试 java编程

5年Java开发4面阿里挂在JVM,临走时面试官给了我一份JVM手册

钟奕礼

Java java程序员 java面试 java编程

剖析一下"抢茅台"脚本底层逻辑

京东科技开发者

接口 后端 脚本 风险识别 风险控制

BI工具中哪一种使用体验更好?

夏日星河

Java 反射 (二) Class类

浅辄

Java 反射 11月月更

2020最新阿里P7岗面试真题、简历模板,搞懂吊打面试官不是问题

钟奕礼

Java Java 面试 java程序员 java编程

影响LED显示屏使用的因素有哪些?

Dylan

LED显示屏 led显示屏厂家

什么是组织孤岛?它会带来哪些影响?可以这样去对付它

Baklib

静态WEB容器镜像最小化实践

mengzyou

DevOps Web Docker 镜像

Camtasia2023如下免费下载?有啥新功能

茶色酒

Camtasia Camtasia2023

深圳等级保护测评机构新名单看这里!

行云管家

等保 深圳 等级保护 等级保护机构

Java面试读这一篇就够了:100个互联网大厂Java面试真题整理

钟奕礼

Java Java 面试 java程序员 java编程

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