架构16-向微服务迈进
零、文章目录
架构16-向微服务迈进
1、向微服务迈进
(1)软件开发中的“银弹”概念
- **背景:**软件开发过程中常常出现工期延误、预算超支、产品质量低劣等问题,这使得管理者、程序员和用户都渴望找到一种能够显著降低成本的“银弹”。
- **定义:**所谓“银弹”,是指能够一劳永逸解决所有问题的灵丹妙药。
- Fred Brooks 的观点
- **著作:**Fred Brooks 在其著作《没有银弹:软件工程的本质性与附属性工作》和《人月神话:软件项目管理之道》中反复强调,软件研发中没有任何一项技术、方法或架构能够成为“银弹”。
- **验证:**这一观点已被软件工程领域的无数事实所验证,适用于包括微服务在内的各种技术。
(2)微服务架构的适用性和局限性
- 适用场景:
- **复杂系统:**适用于大型、复杂且需要高度可扩展性的系统。
- **独立团队:**适合多个独立团队并行开发的情况。
- **高可用性:**需要高可用性和容错能力的系统。
- 不适用场景:
- **小型项目:**小型项目中引入微服务可能会增加不必要的复杂性和开销。
- **低耦合需求:**如果系统模块之间的耦合度很低,微服务的优势可能不明显。
- **技术栈单一:**技术栈单一的项目可能不需要微服务带来的灵活性。
2、目的:微服务的驱动力
(1)目的
- 微服务的主要目的是对系统进行有效的拆分,实现物理层面的隔离,从而实现敏捷开发和部署。
- 通过拆分,局部的单个服务可以独立地进行卸载、部署、开发和升级,使系统整体具备更高的灵活性和可维护性。
(2)驱动力
- 外部因素
- 技术多样性:
- 系统可能需要使用多种编程语言和技术栈来实现不同的功能。例如,Java 语言虽然广泛使用,但在某些领域如人工智能和深度学习中,Python 更为适合;在分布式协调工具方面,Etcd 逐渐取代了 ZooKeeper;在缓存方面,Redis 是首选。这种技术多样性的需求使得分布式部署成为必然选择。
- 人力资源限制:
- 在某些地区,高质量的开发者资源稀缺,微服务架构可以通过将复杂系统分解为多个小型服务,降低对单一开发者的技术要求,使得普通水平的开发者或外包团队也能参与系统开发,同时由少数技术专家把控关键服务的质量。
- 商业需求:
- 客户或甲方的要求可能会推动系统向微服务架构转变。例如,招标文件中明确要求系统支持微服务架构和分布式部署,这种情况下,系统必须满足这些技术规范。
- 技术多样性:
- 内部因素
- 快速迭代和创新:
- 对于变化迅速的创新业务系统,微服务架构可以加速功能的上线和迭代。开发、运维和需求团队可以通过微服务实现快速响应市场变化,提高系统的可观测性和自愈能力。
- 系统复杂性和历史遗留问题:
- 大规模、业务复杂的系统可能会因历史遗留问题变得难以维护。微服务架构可以通过逐步拆分系统,将不同模块独立出来,实现部分模块的更新和替换,从而延长系统的生命周期。Netflix 就是一个成功案例,通过微服务架构解决了系统复杂性和历史遗留问题。
- 快速迭代和创新:
3、前提:微服务需要的条件
(1)决策者与执行者理解康威定律
- **核心观点:**沟通决定设计(Communication Dictates Design)。
- **组织与产品匹配:**产品和组织最终会自发调整成互相匹配的状态。
- **挑战:**调整组织架构以适应微服务化通常不是一件容易的事,需要良好的社交能力和高层决策者的支持。
(2)组织中具备微服务技术专家
- **技术复杂性:**微服务架构带来了额外的复杂性,需要深刻理解微服务的技术专家来设计和维护。
- **专家角色:**设计健壮的基础设施,持续运维 Kubernetes、Istio、Spring Cloud、Dubbo 等开源工具。
- **人才需求:**技术专家不一定很多,但必须有,尤其是有大型系统经验的专家。
(3)系统具备自动化与监控能力
- 自动化前提:
- **环境预置:**迅速启动新的服务器。
- **基础监控:**迅速捕捉系统中的技术问题和业务问题。
- **快速部署:**通过全自动化的部署管道迅速部署服务变更。
- **自治目标:**构建可持续的生态系统,避免自动化与监控措施成为负担。
(4)复杂性成为主要矛盾
- **单体架构适用性:**对于小型系统,单体架构是最好的架构。
- **生产力曲线:**业务发展到一定程度,单体架构与微服务架构的生产力曲线交叉,此时微服务化才有收益。
- **演进式设计:**系统设计应能够被报废,而非一味追求一步到位。
4、边界:微服务的粒度
(1)微服务粒度的下界
- 微服务粒度的下界是指微服务的最小合理规模。以下是确定下界的关键因素:
- **独立性:**微服务应能够独立发布、独立部署、独立运行与独立测试。
- **内聚性:**强相关的功能与数据应在同一个服务中处理,以保证数据的一致性和减少跨服务调用的复杂性。
- **完备性:**一个服务应包含至少一项业务实体及其完整的操作,避免客户端频繁调用多个服务完成一项业务操作。
(2)微服务粒度的上界
- 微服务粒度的上界是指微服务的最大合理规模。以下是确定上界的关键因素:
- **团队规模:**康威定律指出,软件架构应与组织架构保持一致。2 Pizza Team(6-12 人)被认为是理想的团队规模,能够有效管理和沟通。
- **研发周期:**微服务的规模应与团队的研发周期相匹配,确保在一个研发周期内能够完成全部需求。不同研发模式(如瀑布模型、Scrum、精益开发等)会影响上界的大小。
(3)实际应用中的灵活性
- 在确定微服务的具体粒度时,架构师应根据以下几点进行灵活调整:
- **业务逻辑:**考虑业务操作之间的逻辑关系,合理划分微服务。
- **团队能力:**评估团队的技术水平和协作能力,选择合适的微服务规模。
- **研发模式:**根据团队采用的研发模式,调整微服务的粒度以适应不同的迭代周期。
5、治理:理解系统复杂性
(1)概念
- 治理(Governance) 是确保和验证架构中的资产和工件按预期运行并保持一定质量水平的过程。
- 具体来说,治理包括两个层次的要求:
- **正确执行:**确保软件按预期运行。
- **持续保持:**确保软件能够持续保持在一定的质量水平上。
(2)微服务架构的复杂性
- 微服务架构虽然强大,但也带来了显著的复杂性。本文从以下几个角度探讨了这种复杂性:
- 静态治理
- 认知负荷(Cognitive Load):
- 认知负荷是指在软件研发中接受业务、概念、模型、设计、接口、代码等信息所带来的负担。
- 微服务架构的认知负荷较高,因为分布式系统提倡的理念往往偏向机器而非人,例如异步通信、粗粒度服务接口、容错处理等。
- 协作成本(Collaboration Cost):
- 协作成本是指团队共同研发时付出的沟通、管理成本。
- 微服务架构通过组织的拆分与产品的拆分对齐(康威定律),将沟通成本从 O(N^2) 降低到 O(NlogN)。
- 复杂度量化:
- 微服务架构的复杂度在软件规模小时高于单体系统,但在规模大时低于单体系统。
- 这是因为微服务的认知负荷较高,但协作成本较低。
- 认知负荷(Cognitive Load):
- 动态治理
- 架构腐化(Architectural Decay):
- 架构腐化是指随着时间的推移,软件系统的质量逐渐下降。
- 原因包括团队成员的变动、代码逐渐失控、技术债务的积累等。
- 演进式设计:
- 演进式设计是应对架构腐化的有效方法,类似于生物族群的延续。
- 它强调在软件发展的过程中不断改进和优化,而不是一次性完成所有设计。
- 架构腐化(Architectural Decay):
- 静态治理
(3)治理的重要性
- **静态治理:**静态治理措施有助于确保软件在初始阶段能够按预期运行,但无法完全避免架构腐化。
- **动态治理:**动态治理通过演进式设计,使软件系统能够在不断变化的需求中保持高质量。
相关文章:
架构16-向微服务迈进
零、文章目录 架构16-向微服务迈进 1、向微服务迈进 (1)软件开发中的“银弹”概念 **背景:**软件开发过程中常常出现工期延误、预算超支、产品质量低劣等问题,这使得管理者、程序员和用户都渴望找到一种能够显著降低成本的“银…...
基于Springboot汽车资讯网站【附源码】
基于Springboot汽车资讯网站 效果如下: 系统主页面 汽车信息页面 系统登陆页面 汽车信息推荐页面 经销商页面 留言反馈页面 用户管理页面 汽车信息页面 研究背景 随着信息技术的快速发展和互联网的普及,互联网已成为人们查找信息的重要场所。汽车资讯…...
Tomcat项目本地部署
今天分享一下如何在本地,不依赖于idea部署聚合项目,以我做过的哈米音乐项目为例,项目结构如下: ham-core模块为公共模块,我们只需将另外三个模块:前台、后台、文件服务器打包,将打好的jar、war包…...
【OpenCV】直方图
理论 可以将直方图视为图形或曲线图,从而使您对图像的强度分布有一个整体的了解。它是在X轴上具有像素值(不总是从0到255的范围),在Y轴上具有图像中相应像素数的图。 这只是理解图像的另一种方式。通过查看图像的直方图,您可以直观地了解该…...
pika:适用于大数据量持久化的类redis组件|jedis集成pika(二)
文章目录 0. 引言1. pika客户端支持2. jedis集成pika3. pika性能测试 0. 引言 上节我们讲解了pika的搭建,这节我们来看下如何在java项目中利用jedis集成pika 1. pika客户端支持 pika支持的客户端与redis完全一致,所以理论上redis支持的客户端pika也都…...
Linux 进程间通信
Linux进程间通信 进程间通信(IPC,Inter-Process Communication)在 Linux 下常用的方法包括: 1)管道(Pipe) 2)有名管道(FIFO) 3)消息队列&#x…...
【C++】快速排序详解与优化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯快速排序的核心思想1. 算法原理2. 算法复杂度分析时间复杂度空间复杂度 💯快速排序的代码实现与解析代码实现代码解析1. 递归终止条件2. 动态分配子数组3. 分区…...
【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制
在高并发系统中,限流是一项非常重要的技术手段,用于保护后端服务,防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流,以及其原理、使用场景和完整代码示例。 目录 一、什么是限流…...
NanoLog起步笔记-1
nonolog起步笔记-1 背景与上下文写在前面Nanolog与一般的实时log的异同现代log的一般特性Nanolog的选择 背景与上下文 因为工作中用到了NanoLog。有必要研究一下。 前段时间研究了许多内容,以为写了比较详实的笔记,今天找了找,不仅笔记没找到…...
vs打开unity项目 新建文件后无法自动补全
问题 第一次双击c#文件自动打开vs编辑器的时候能自动补全,再一次在unity中新建c#文件后双击打开发现vs不能自动补全了。每次都要重新打开vs编辑器才能自动补全,导致效率很低,后面发现是没有安装扩展,注意扩展和工具的区别。 解决…...
HDFS的Federation机制的实现原理和Erasure Coding节省存储空间的原理
目录 Federation机制的实现原理1.HDFS的分层图解(1)NameSpace(2)Block Storage1)Block Management2)Storage 2.Federation机制的优点3.Federation机制的缺点4.Federation机制的实现(1࿰…...
经验笔记:使用 PyTorch 计算多分类问题中Dice Loss 的正确方法
经验笔记:使用 PyTorch 计算多分类问题中Dice Loss 的正确方法 概述 Dice Loss 是一种广泛应用于图像分割任务中的损失函数,它基于 Dice 系数(也称为 F1-score),用于衡量预测结果与真实标签之间的相似度。在 PyTorch…...
如何在 Ubuntu 22.04 上安装 PostgreSQL
简介 PostgreSQL(或简称Postgres)是一个关系型数据库管理系统,它提供了SQL查询语言的实现。它符合标准,并且拥有许多高级特性,比如可靠的事务处理和无需读锁的并发控制。 本指南将展示如何在Ubuntu 22.04服务器上快速…...
正则表达式的高级方法
正则表达式的高级方法 正则表达式(regex)不仅仅是简单的模式匹配工具,它还提供了一系列高级功能,使得处理复杂文本任务变得更加灵活和强大。以下是一些Python中正则表达式的高级用法: 1. 命名捕获组 命名捕获组允许…...
axios的get和post请求,关于携带参数相关的讲解一下
在使用 Axios 发送 HTTP 请求时,GET 和 POST 请求携带参数的方式有所不同。以下是关于这两种请求方法携带参数的详细讲解: GET 请求携带参数 对于 GET 请求,参数通常附加在 URL 之后,以查询字符串的形式传递。 直接在 URL 中拼接…...
中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)
一、概述 MongoDB是一种常见的Nosql数据库(非关系型数据库),以文档(Document)的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。 在 MongoDB 官方镜像部署介绍中ÿ…...
基于SpringBoot框架的民宿连锁店业务系统(计算机毕业设计)+万字说明文档
系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 IDE环境: Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境: Tomcat 7.x,8.x,9.x版本均可 操作系统…...
PHP8 动态属性被弃用兼容方案
PHP 类中可以动态设置和获取没有声明过的类属性。这些属性不遵循具体的规则,并且需要使用 __get() 和 __set() 魔术方法对动态属性如何读写进行有效控制。 class User {private int $uid; }$user new User(); $user->name Foo; 上述代码中,User 类…...
Spring Boot 3.0 + MySQL 8.0 + kkFileView 实现完整文件服务
Spring Boot 3.0 MySQL 8.0 kkFileView 实现完整文件服务 背景:比较常见的需求,做成公共的服务,后期维护比较简单,可扩展多个存储介质,上传逻辑简单,上传后提供一个文件id,后期可直接通过此i…...
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
本文内容来自YashanDB官网,原文内容请见:https://www.yashandb.com/newsinfo/7488290.html?templateId1718516 问题现象 如下图,php使用odbc数据源,查询表数据,mysql可以显示出来,yashan显示数据被截断。…...
为什么ETH 3.0需要Lumoz的ZK算力网络?
1.Lumoz 模块化计算层 Lumoz 协议是一个全球分布式模块化计算协议,致力于提供先进的零知识证明(ZKP)服务,支持ZK技术的发展,为ZK、AI等前沿技术提供强大的算力支撑。面对当前零知识计算领域计算成本的挑战,…...
反向代理-缓存篇
文章目录 强缓存一、Expires(http1.0 规范)二、cache-control(http1.1 出现的 header 信息)Cache-Control 的常用选项Cache-Control 常用选项的选择三、弊端协商缓存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since浏览器的三种刷新方式静态资源部署策略…...
(重点来啦!)MySql基础增删查改操作(详细)
目录 一、客户端和数据库操作: 二、表操作 1.查看当前数据库中有哪些表 2.创建一张新表 3.查看表结构: 4.删除表 三、CRUD增删查改 1.新增——插入 2.查询操作 a.全列查询: b.指定列查询: c.列名为表达式的查询&#…...
WPF编写工业相机镜头选型程序
该程序满足面阵和线阵的要求。 前端代码 <Window x:Class"相机镜头选型.MainWindow" Loaded"Window_Loaded"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml…...
阿里云轻量应用服务器开放端口,图文教程分享
阿里云轻量应用服务器如何开放端口?在轻量服务器管理控制台的防火墙中添加规则即可开通端口,开通80端口就填80,开通443就填443端口,开通3306端口就填3306。阿里云百科网aliyunbaike.com整理阿里云轻量应用服务器端口号开通图文教程…...
分布式 CAP理论 总结
前言 相关系列 《分布式 & 目录》《分布式 & CAP理论 & 总结》《分布式 & CAP理论 & 问题》 分布式 分布式的核心是将大型业务拆解成多个子业务以使之在不同的机器上执行。分布式是用于解决单个物理机容量&性能瓶颈问题而采用的优化手段…...
【UNION 和 UNION ALL 】关键字在MySql中的用法,以及注意事项
在 MySQL 中,UNION 和 UNION ALL 都用于将多个 SELECT 语句的结果合并到一个结果集中。它们的主要区别在于 UNION 去除重复 的行UNION ALL 保留所有 的行 示例 …...
GauHuman阅读笔记【3D Human Modelling】
笔记目录 1. 基本信息2. 理解(个人初步理解,随时更改)3. 精读SummaryResearch Objective(s)Background / Problem StatementMethod(s)EvaluationConclusionReferences1. 基本信息 题目:GauHuman: Articulated Gaussian Splatting from Monocular Human Videos时间:2023.12…...
SkyWalking 和 ELK 链路追踪实战
一、背景 最近在给项目搭建日志平台的时候,采用的方案是 SkyWalking ELK 日志平台,但发现 ELK 日志平台中的日志没有 Trace ID,导致无法追踪代码报错的整体链路。 空哥提示:Trace ID 是分布式追踪中用来唯一标识一个服务请求或事…...
深度学习中的损失函数
损失函数是深度学习模型训练过程中不可或缺的一部分,是模型预测值与真实值之间差异的客观衡量标准。它们是模型训练的基础,指导算法调整模型参数,以最小化损失并提高预测准确性。它们衡量了模型预测值与真实值的吻合程度。通过最小化这种损失…...
android编译assets集成某文件太大更新导致git仓库变大
不知道大家有没有类似的困扰,你的工程assets文件过大,我曾经在某度车机地图团队工作过一段时间时候,每次发包会集成一个上百MB的文件。工作一段时间你的git仓库将会增加特别多。最后,你会发现你如果重新git clone这个仓库会非常大…...
技术支持人员发现跨域问题,该如何处理
跨域问题通常是由于浏览器的同源策略(Same-Origin Policy)引起的。简而言之,浏览器阻止了一个域上的网页访问另一个域的资源,目的是为了安全性。跨域问题通常发生在以下场景: 在一个网站的前端应用程序(如…...
有 SpringBoot 助力,广场舞团解锁花式舞步密码
3 系统分析 3.1 系统可行性分析 3.1.1 经济可行性 由于本系统是作为毕业设计系统,且系统本身存在一些技术层面的缺陷,并不能直接用于商业用途,只想要通过该系统的开发提高自身学术水平,不需要特定服务器等额外花费。所有创造及工作…...
【推荐算法】单目标精排模型——FiBiNET
key word: 学术论文 Motivation: 传统的Embedding&MLP算法是通过内积和Hadamard product实现特征交互的,这篇文章的作者提出了采用SENET实现动态学习特征的重要性;作者认为简单的内积和Hadamard product无法有效对稀疏特征进行特征交互&a…...
从零开始学TiDB(3)TiKV 持久化机制
如图,每个TiKV有两个rocksdb实例,rocksdbKV复制存储键值对,rocksdb raft负责存储复制的日志 。 每个region及其副本构成了raft group。这个OB的Zone其实有点类似,在OB中每个Unit及其副本构成了paxos组,在TiDB中叫raft…...
集合ArrayList
黑马程序员Java的个人笔记 BV17F411T7Ao p111~p115 目录 集合存储数据类型的特点 创建对象 ArrayList 成员方法 .add 增加元素 .remove 删除元素 .set 修改元素 .get 查询元素 .size 获取长度 基本数据类型对应的包装类 Character 练习 返回多个数据 集合存储…...
后端API接口设计标准(Java)
Controller 层(API接口) 无论是传统的三层架构还是现在的COLA架构,Controller 层依旧有一席之地,说明他的必要性;说它是配角是因为 Controller 层的代码一般是不负责具体的逻辑业务逻辑实现,但是它负责接收…...
Oracle Recovery Tools工具一键解决ORA-00376 ORA-01110故障(文件offline)---惜分飞
客户在win上面迁移数据文件,由于原库非归档,结果导致有两个文件scn不一致,无法打开库,结果他们选择offline文件,然后打开数据库 Wed Dec 04 14:06:04 2024 alter database open Errors in file d:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_6056.trc: ORA-01113:…...
Python制做一个简易PDF编辑器——关于PDF文字编辑实现的思路
在Python零基础快速入门最后一篇,我们一起做了一个PDF编辑小工具,里面只实现的PDF翻页浏览等,并没有实现PDF的文字在线编辑,是因为在PDF编辑器中实现文字编辑功能是一个相对复杂的过程,因为PDF格式本质上是一个用于呈现…...
RabbitMQ如何保证消息不被重复消费
前言: 正常情况下,消费者在消费消息后,会给消息队列发送一个确认,消息队列接收后就知道消息已经被成功消费了,然后就从队列中删除该消息,也就不会将该消息再发送给其他消费者了。不同消息队列发出的确认消…...
Windows Terminal ssh到linux
1. windows store安装 Windows Terminal 2. 打开json文件配置 {"$help": "https://aka.ms/terminal-documentation","$schema": "https://aka.ms/terminal-profiles-schema","actions": [{"command": {"ac…...
vue实现页面自动滚动,鼠标悬浮暂停,移开继续
1、给div一个id <div class"kb_nei_new_left" id"chartsContainer">2、定义一个自动滚动的方法 autoSroll(Id) {// flag 为true时停止滚动var flag false;// 定时器var timer;function roll() {var h -1;timer setInterval(function () {flag …...
第3章:文本样式 --[CSS零基础入门]
CSS(层叠样式表)允许你以多种方式定制文本的外观。以下是一些常用的文本和字体相关的CSS属性: 1.字体 字体系列 当然,下面是两个使用不同字体系列的CSS示例。每个示例都展示了如何指定一个字体系列,并提供备用字体以确保在用户的系统中找不到首选字体时仍有合适的字体可…...
从视觉到雷达:多模态感知如何引领自动驾驶安全革命
文章目录 摘要引言多模态感知融合的原理与架构感知技术的特点多模态感知融合的目标 数据融合实现示例代码结构与主要组件模型定义 MultimodalFusionModel前向传播(forward 方法)模型细节剖析实践应用 QA环节总结参考资料 摘要 本文探讨了多模态感知技术…...
若依集成更好用的easyexcel
背景 若依使用的是apach poi并在此基础上进行封装apach poi的原生的api是很复杂的,若依简化了了此操作apach poi的上传速率和下载速率都是没有优化的,依赖于文件大小的限制在此前提下,如果没法满足客户的需求(超大型文件的上传&am…...
大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
线段树模板
单点修改 #include <bits/stdc.h> using namespace std; #define IOS ios::sync_with_stdio(false),cin.tie(nullptr); #define rep(i, x, y) for(int i(x), _(y);i<_;i) #define rrep(i, x, y) for(int i(x), _(y);i>_;i--) #define all(x) x.begin(),x.end() #d…...
算法刷题Day15: BM37 二叉搜索树的最近公共祖先
题目链接 描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以…...
正则表达式去除文本中括号()<>[]里的内容
一行文本中包含有各种括号,如()、<>、[],我们希望把括号及括号内的内容0去除,可以通过正则表达式来实现。 匹配() pattern r\([^)]*\) # 匹配()匹配一个左括号(,然后匹配0个或多个不是右括号的任意字符[^)]*,…...
Environment Modules安装配置
Environment Modules安装配置 Environment Modules是一款用来管理计算机软件环境的软件,通过简单的命令来控制计算机环境变量。本文接受该软件的安装和配置方法 系统: Linux OpenSUSE 15.6 软件版本: modules 5.5 依赖: gcc 7.5…...