springcloud简单了解及上手

springcloud微服务框架简单上手

文章目录

  • springcloud微服务框架简单上手
    • 一、SpringCloud简单介绍
      • 1.1 单体架构
      • 1.2 分布式架构
      • 1.3 微服务
    • 二、SpringCloud与SpringBoot的版本对应关系
      • 2022.x 分支
      • 2021.x 分支
      • 2.2.x 分支
    • 三、Nacos注册中心
      • 3.1 认识和安装Nacos
      • 3.2 配置Nacos
      • 3.3 nacos部署springboot项目
    • 四、http客户端Feign
      • 4.1 Feign的介绍
      • 4.2 自定义实现Feign
      • 4.3 Feign实践
    • 五、统一网关Gateway
      • 5.1 为什么要使用网关
      • 5.2 搭建网关服务
      • 5.3 测试网关GateWay

前言:作者是通过自己的项目所运用作为讲解,分享只是作者用到的方面

一、SpringCloud简单介绍

  • SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud。
  • SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验:

在这里插入图片描述

1.1 单体架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

**优点 **:
架构简单
部署成本低

缺点
耦合度高

如下就是简单的单体架构图

在这里插入图片描述

1.2 分布式架构

分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。
优点
降低服务耦合
有利于服务升级拓展

如下就是简单的分布式架构图

在这里插入图片描述

1.3 微服务

微服务:是一种经过良好架构设计的分布式架构方案

微服务架构特征
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
面向服务:微服务对外暴露业务接口
自治:团队独立、技术独立、数据独立、部署独立
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

如下就是简单的微服务架构图

在这里插入图片描述

二、SpringCloud与SpringBoot的版本对应关系

2022.x 分支

适配 Spring Boot 3.0,Spring Cloud 2022.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记): (注意,该分支 Spring Cloud Alibaba 版本命名方式进行了调整,未来将对应 Spring Cloud 版本,前三位为 Spring Cloud 版本,最后一位为扩展版本,比如适配 Spring Cloud 2022.0.0 版本对应的 Spring Cloud Alibaba 第一个版本为:2022.0.0.0,第个二版本为:2022.0.0.1,依此类推)

Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version
2022.0.0.0*Spring Cloud 2022.0.03.0.2
2022.0.0.0-RC2Spring Cloud 2022.0.03.0.2
2022.0.0.0-RC1Spring Cloud 2022.0.03.0.0

2021.x 分支

适配 Spring Boot 2.4,Spring Cloud 2021.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):

Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version
2021.0.5.0*Spring Cloud 2021.0.52.6.13
2021.0.4.0Spring Cloud 2021.0.42.6.11
2021.0.1.0Spring Cloud 2021.0.12.6.3
2021.1Spring Cloud 2020.0.12.4.2

2.2.x 分支

适配 Spring Boot 为 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):

Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version
2.2.10-RC1*Spring Cloud Hoxton.SR122.3.12.RELEASE
2.2.9.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE
2.2.8.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE
2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE
2.2.6.RELEASESpring Cloud Hoxton.SR92.3.2.RELEASE
2.2.1.RELEASESpring Cloud Hoxton.SR32.2.5.RELEASE
2.2.0.RELEASESpring Cloud Hoxton.RELEASE2.2.X.RELEASE
2.1.4.RELEASESpring Cloud Greenwich.SR62.1.13.RELEASE
2.1.2.RELEASESpring Cloud Greenwich2.1.X.RELEASE
2.0.4.RELEASE(停止维护,建议升级)Spring Cloud Finchley2.0.X.RELEASE
1.5.1.RELEASE(停止维护,建议升级)Spring Cloud Edgware1.5.X.RELEASE
spring cloud alibaba、spring cloud、spring boot版本对应:来自 gitHub 中的spring cloud alibaba官方说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明spring官网:https://spring.io/spring历史官方文档:https://docs.spring.io/spring-cloud/docs/spring离线依赖及文档下载地址:https://repo.spring.io/ui/native/libs-release-local/org/springframework/

三、Nacos注册中心

3.1 认识和安装Nacos

Nacos 是一个开源的分布式服务发现、配置管理和服务管理平台。它提供了服务注册与发现、配置管理、服务健康监测等功能,可以帮助开发者构建和管理云原生微服务架构。

具体来说,Nacos 提供了以下核心功能:

  1. 服务注册与发现(Service Discovery):允许服务实例注册到 Nacos,并通过 Nacos 客户端发现其他服务实例。这样,服务之间可以动态地发现和通信,实现了微服务架构中的服务发现功能。
  2. 配置管理(Configuration Management):Nacos 提供了统一的配置管理平台,允许开发者集中管理微服务的配置信息,支持配置的动态变更和实时推送,从而提高了配置管理的灵活性和可靠性。
  3. 服务健康监测(Health Check):Nacos 会定期检查服务实例的健康状态,确保只有健康的服务实例会被注册到服务发现中,并且及时地将不健康的实例移除,从而提高了整个系统的稳定性和可用性。

Nacos下载

链接:https://pan.baidu.com/s/1gwHPkvylWLtrjQYQCwmqqw?pwd=T401
提取码:T401

3.2 配置Nacos

Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:

在这里插入图片描述

修改其中的内容为其他端口

在这里插入图片描述

启动nacos,进入bin目录, 然后 cmd 进入该目录执行命令

./startup.cmd -m standalone

出现下面内容即可

在这里插入图片描述

如果觉得在cmd输入命令麻烦可以修改脚本, 编辑start.cmd脚本,将集群模式修改为单机模式,在bin目录下右击startup.cmd文件,用记事本的方式打开,将MODE改成standalone即可,如下图所示

在这里插入图片描述

这样直接双击startup.cmd即可运行nacos

在这里插入图片描述

ctrl+左键点击命令窗口给的地址

在这里插入图片描述

nacos账号: nacos

nacos密码: nacos

在这里插入图片描述

到此nacos安装完成

3.3 nacos部署springboot项目

父工程

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>

添加nacos的客户端依赖

 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.6.RELEASE</version></dependency>

修改需要更改服务的中的application.yml文件

spring:  application:  # 应用配置项name: dataAccountService  # 应用名称为 dataAccountServicecloud:  nacos: server-addr: localhost:8848  # Nacos 服务端地址为 localhost:8848discovery:  # Nacos 服务发现配置项cluster-name: CQ  # 使用的 Nacos 集群名称为 CQ

启动springboot项目和nacos,出现自己配置的服务,及完成nacos的简单部署,在我的项目中,nacos主要做的是服务注册与发现,并没有其他内容,如果有需要可以参考其他博客

在这里插入图片描述

四、http客户端Feign

4.1 Feign的介绍

Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。

Feign 的主要优势在于:

  1. 声明式 API 定义:Feign 允许开发者使用接口和注解来定义 RESTful 服务的请求和响应,而无需关心底层的 HTTP 请求和响应处理逻辑。通过编写简单的 Java 接口和添加 Feign 注解,就可以定义服务调用的各种细节,比如 URL、HTTP 方法、请求参数、请求头等。
  2. 模板化请求:Feign 提供了一套模板化的请求构建和发送机制,使得开发者可以轻松地构造 HTTP 请求并发送到目标服务端点。Feign 会根据接口定义和注解配置,自动构造出对应的 HTTP 请求,并将请求参数、请求头等信息注入到请求中。
  3. 集成了负载均衡和服务发现:Feign 可以与 Spring Cloud 中的服务发现组件(如 Eureka、Consul 等)和负载均衡组件(如 Ribbon)集成,从而实现服务之间的负载均衡和自动服务发现。开发者可以直接通过服务名来调用其他微服务,而无需硬编码服务的地址和端口。
  4. 可扩展性:Feign 提供了丰富的扩展点,开发者可以通过自定义编码器、解码器、拦截器等来扩展 Feign 的功能,从而满足各种特定的业务需求。

在这里插入图片描述

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:

类型作用说明
feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign. Contract支持的注解格式默认是SpringMVC的注解
feign. Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

4.2 自定义实现Feign

导入依赖

如果服务A需要调用服务B的方法,则将依赖写入服务A的pom文件中,既服务A是消费者

        <!--        feign消费者--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency>

配置Feign日志有两种方式:
方式一:配置文件方式
全局生效:

feign:httpclient:enabled: trueclient:config:default:  # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置logger-level: NONE #日志级别

局部生效

feign:httpclient:enabled: trueclient:config:dataAssetService:  # 这里用dataAssetService就是局部配置,只对dataAssetService服务生效logger-level: NONE #日志级别

方式二:编程方式,先声明一个Bean:

public class FeignClientConfiguration {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC; }
}

而后如果是全局配置,则把它放到@EnableFeignClients这个注解中

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class) 

如果是局部配置,则把它放到@FeignClient这个注解中:

@FeignClient(value = "dataAssetService", configuration = FeignClientConfiguration.class) 

4.3 Feign实践

方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。

  • 服务紧耦合

  • 父接口参数列表中的映射不会被继承

    自定义Feign 客户端接口


//被消费的服务名称
@FeignClient(name = "dataManagementService")
public interface dataAssetClient {/*** 获取数据标准信息* @param dataStandardCode * @return* /dataStandard/getDataStandardInfo为被消费的接口路径*/@GetMapping("/dataStandard/getDataStandardInfo")R getDataStandard(@RequestParam("dataStandardCode") String dataStandardCode);
}

消费者的controller


/*** <p>* 数据资产表 前端控制器* </p>** @author 不入青山入我怀* @since 2024-03-21*/
@RestController
@RequestMapping("/dataAsset")
public class DataAssetController {@Autowiredprivate dataAssetClient dataassetClient;//数据标准目录/*** 远程调用其他接口* /dataAsset/getDataStandard 在该服务调用其他服务的接口路径* @return*/@GetMapping("getDataStandard")public R getDataStandard() {return dataassetClient.getDataStandard("");}}

被消费者controller(正常写就行)

    /*** 获取数据标准信息* @param dataStandardCode* @return*/@GetMapping("getDataStandardInfo")public R getDataStandardInfo(@RequestParam("dataStandardCode") String dataStandardCode){return dataStandardService.getDataStandardInfo(dataStandardCode);//实现具体逻辑}

作者的Feign的实现逻辑

在这里插入图片描述

你也可以将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用,如下图

在这里插入图片描述

五、统一网关Gateway

5.1 为什么要使用网关

  1. 路由与负载均衡:网关可以作为请求的入口,根据请求的路径或者其他条件将请求路由到不同的后端服务。这样可以实现请求的负载均衡,将流量合理地分发到不同的服务实例上,从而提高整个系统的性能和可扩展性。
  2. 安全性:网关可以作为安全屏障,用于保护后端服务免受恶意攻击或者非法访问。通过网关可以实现访问控制、身份认证、权限验证等安全功能,确保只有合法的请求可以访问后端服务。
  3. 监控与统计:网关可以对请求进行监控和统计,记录请求的响应时间、成功率、失败率等指标,并生成相应的监控报告和统计数据。这样可以帮助开发者实时了解系统的运行状况,及时发现和解决问题。
  4. 日志与审计:网关可以记录请求的日志,包括请求的来源、目的地、参数、响应状态等信息,用于后续的审计和分析。这对于排查问题、追踪请求流程、分析用户行为等都非常有帮助。
  5. 服务聚合与协议转换:网关可以将多个后端服务的接口聚合成一个统一的接口供客户端调用,从而简化客户端的调用逻辑。同时,网关还可以实现不同协议之间的转换,比如将 HTTP 请求转换为 WebSocket 请求,或者将 RESTful 接口转换为 GraphQL 接口等。

5.2 搭建网关服务

创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:

   <!--        网关gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>2.2.6.RELEASE</version></dependency><!--        nacos服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.6.RELEASE</version></dependency>

编写路由配置及nacos地址

网关路由可以配置的内容包括:

  • 路由id:路由唯一标示
  • uri:路由目的地,支持lb和http两种
  • predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
  • filters:路由过滤器,处理请求或响应
spring:  application:  name: gateway  # 应用名称为 gatewaycloud: nacos: discovery: server-addr: localhost:8848  # Nacos 服务端地址为 localhost:8848gateway: routes:  # 网关路由配置项,定义了多个路由规则- id: server-provice  # 第一个路由规则的标识符uri: lb://serve-provide  # 路由到服务名为 serve-provide 的服务predicates:  # 定义了路由匹配的条件- Path=/api/serve/**  # 匹配路径以 /api/serve/ 开头的请求filters:  # 定义了对请求和响应的处理规则- RewritePath=/api/(?<segment>/?.*),/$\{segment}  # 重写请求路径,将 /api/ 后面的路径段作为参数传递给后端服务- id: data-asset-service  # 第二个路由规则的标识符uri: lb://dataAssetService  # 路由到服务名为 dataAssetService 的服务predicates:  # 定义了路由匹配的条件- Path=/api/dataAsset/** ,/api/dataAssetField/** ,/api/dataAssetRelationCategory/**  # 匹配多个路径的请求filters:  # 定义了对请求和响应的处理规则- RewritePath=/api/(?<segment>/?.*),/$\{segment}  # 重写请求路径,将 /api/ 后面的路径段作为参数传递给后端服务server:port: 8989 

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

在这里插入图片描述

5.3 测试网关GateWay

利用Postman来测试,通过访问网关的端口8989,成功把接口转发到对应的服务中去

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/327393.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【simulink】Scrambling 加扰

https://ww2.mathworks.cn/help/comm/ug/additive-scrambling-of-input-data-in-simulink.html 草图 simulink 代码图

web入门练手案例(二)

下面是一下web入门案例和实现的代码&#xff0c;带有部分注释&#xff0c;倘若代码中有任何问题或疑问&#xff0c;欢迎留言交流~ 数字变色Logo 案例描述 “Logo”是“商标”的英文说法&#xff0c;是企业最基本的视觉识别形象&#xff0c;通过商标的推广可以让消费者了解企…

号外!IP SSL证书申请只需十分钟!

IP SSL证书是一种专为IP地址设计的SSL证书&#xff0c;它使得基于IP地址的网站或服务能够实现HTTPS加密&#xff0c;确保数据在传输过程中的安全性和完整性。以下是关于IP SSL证书的一些技术性要点和申请流程概述&#xff1a; 一、IP SSL证书技术要点 1、适用场景&#xff1a…

ASP.NET银行大厅自助信息系统的开发与实现

摘 要 本毕业设计在基于银行业务大厅现有业务的基础上&#xff0c;针对自助银行的概念和其独有特点&#xff0c;通过.NETSQL技术&#xff0c;开发一个简单的银行大厅自助信息系统&#xff0c;完成一些自助银行的业务需求如帐户信息查询、帐户挂失、自助交费、留言、新闻查询…

【HDFS】关于HDFS-17497:在commit block时更新quota

链接:https://github.com/apache/hadoop/pull/6765 Ticket标题:The number of bytes of the last committed block should be calculated into the file length。 HDFS里,一个在写入的文件可能包含多个commited状态的块。 但是计算文件大小的时候,最后一个commited block并…

菲律宾签证照片尺寸要求,用手机生成

菲律宾签证照片尺寸要求如下图所示&#xff0c;可以用手机在微信搜索随时照小程序&#xff0c;快速生成哦。

C语言:指针(3)

1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; 本质是把字符串 hello bit. ⾸字符的地址放到了pstr中。上⾯代码的意思是把⼀个常量字符串的⾸字符 h 的地址存放到指针变量 pstr 中。 2. 数组指针变量 2.1 数组指针变量是什么&#xff1f; 答案…

Shuffle Cards (STL rope平衡树库)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例1&#xff1a; 输入 5 1 2 3 输出 2 3 4 1 5 样例2&#xff1a; 输入 5 2 2 3 2 3 输出 3 4 1 2 5 样例3&#xff1a; 输入 5 3 2 3 1 4 2 4输出 3 4 1 5 2 思路&#xff1a; 这道题&…

Element-UI 快速入门指南

文章目录 一、安装 Element-UI1.1 使用 npm 安装1.2 使用 yarn 安装 二、引入 Element-UI三、使用 Element-UI 组件3.1 按钮组件3.2 输入框组件3.3 表单组件3.4 表格组件3.5 弹框组件 四、自定义主题4.1 安装主题工具4.2 初始化变量文件4.3 编译主题 五、总结 &#x1f389;欢迎…

网络编程套接字(一) 【简单的Udp网络程序】

网络编程套接字<一> 理解源端口号和目的端口号PORT VS PID认识TCP协议和UDP协议网络字节序socket编程接口sockaddr结构简单的UDP网络程序服务端创建套接字服务端绑定运行服务器客户端创建套接字关于客户端的绑定问题启动客户端启动客户端本地测试INADDR_ANY 理解源端口号…

Nginx解决跨域问题

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 W3C标准&#xff1…

Flutter实战记录-协作开发遇到的问题

一.前言 Android项目使用了混合架构&#xff0c;部分模块使用Flutter进行开发。在电脑A上开发的项目提交到git仓库&#xff0c;电脑B拉取后进行操作&#xff0c;遇到两个问题&#xff0c;特此做一下记录&#xff1b; 二.问题A Settings file ‘D:\xxx\settings.gradle’ line…

游戏专用设备指纹方案解析

如同人类拥有独一无二的指纹&#xff0c;设备也有设备的指纹&#xff0c;我们可以把设备指纹理解为设备的唯一识别码。 构建设备指纹需要采集设备硬件信息、软件信息、环境信息、网络信息等维度信息&#xff0c;进行加密/压缩&#xff0c;再通过算法处理&#xff0c;赋予设备唯…

【数据结构】栈和队列专题

前言 上篇博客我们讨论了栈和队列的有关结构&#xff0c;本篇博客我们继续来讨论有关栈和队列习题 这些题算是经典了 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d…

【c++】全面理解C++多态:虚函数表深度剖析与实践应用

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;通过本篇文章&#xff0c;来详细理解多态的内容 目录 1.多态的定义及实现1.1多态的构成条件1.2虚函数的重写1.3 C11 override 和 final1.4重载、覆盖(重写)、隐藏…

什么品牌洗地机最好?怎么选?2024家用洗地机推荐攻略

随着科技的不断发展&#xff0c;家用洗地机已经成为人们家庭清洁任务重非常重要的辅助工具。家用洗地机集吸尘、扫地、拖地等功能于一体&#xff0c;通过高速旋转的滚刷和强力的吸力&#xff0c;将地面上的污渍、细菌和毛发等吸入污水箱&#xff0c;从而达到清洁地面的目的。但…

网络库-POCO介绍

1.简介 POCO C Libraries 提供一套 C 的类库用以开发基于网络的可移植的应用程序&#xff0c;它提供了许多模块&#xff0c;包括网络编程、文件系统访问、线程和并发、数据库访问、XML处理、配置管理、日志记录等功能。Poco库的设计目标是易于使用、高度可定制和可扩展。 包含…

java项目之英语知识应用网站源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的英语知识应用网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 英语知识应用网站的主要…

React 第三十章 React 和 Vue 描述页面的区别

面试题&#xff1a;React 和 Vue 是如何描述 UI 界面的&#xff1f;有一些什么样的区别&#xff1f; 标准且浅显的回答&#xff1a; React 中使用的是 JSX&#xff0c;Vue 中使用的是模板来描述界面 前端领域经过长期的发展&#xff0c;目前有两种主流的描述 UI 的方案&#xf…

node和npm版本太高导致项目无法正常安装依赖以及正常运行的解决办法:如何使用nvm对node和npm版本进行切换和管理

1&#xff0c;点击下载 nvm 并且安装 进入nvm的github&#xff1a; GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go. 这里下载发行版&#xff0c;Releases coreybutler/nvm-windows GitHub 找到 这个 nv…