当前位置: 首页 > news >正文

微服务常用的基础知识

1.微服务介绍

1.1 产生背景

       随着互联网的发展,网站应用的规模不断扩大,传统单体架构逐渐难以应对大型网站高并发、高扩展性等需求,于是分布式系统架构应运而生。Spring Cloud 就是在这种背景下诞生的,它利用 Spring Boot 的开发便利性,简化了分布式系统的开发。

1.2 主要功能

1.服务发现与注册 :在分布式系统中,各个微服务需要相互调用,服务发现与注册功能可以动态地发现和注册服务的地址,使得服务之间能够方便地进行通信。例如,Eureka 是 Spring Cloud 中常用的服务发现与注册组件,它提供了一个服务注册中心,各个微服务启动时会向注册中心注册自己的信息,当其他服务需要调用它时,通过查询注册中心就可以获取到其地址进行通信。
2.配置中心:集中管理应用程序的配置信息,方便统一修改和管理配置。Config 是 Spring Cloud 的配置中心组件,它支持配置信息存储在多种后端,如本地文件系统、数据库、Git 仓库等。当配置信息发生变化时,可以及时通知各个微服务进行更新。
3.熔断器:在分布式系统中,某些服务可能会因为各种原因出现故障或响应缓慢,熔断器可以快速熔断故障服务的调用,避免故障蔓延,提高系统的稳定性和可用性。Hystrix 是 Spring Cloud 常用的熔断器组件,它能够实时监控服务调用的健康状况,当故障率达到一定程度时,自动熔断后续的调用请求,并可以设置熔断后的降级策略。
4.API 网关:作为系统的统一入口,对外提供 API 接口的路由转发、负载均衡、鉴权认证等功能。Zuul 是 Spring Cloud 的 API 网关组件,它可以对进入系统的请求进行过滤、路由和转发,根据不同的条件将请求分发到不同的后端微服务,并且可以实现一些安全控制和流量控制等功能。

1.3 架构优势

1.微服务架构支持:Spring Cloud 完全契合微服务架构理念,能够帮助开发者快速构建松耦合、易扩展的微服务应用,使得各个服务可以独立开发、部署和扩展。
2.开发便捷性:基于 Spring Boot 的自动配置特性,Spring Cloud 大大简化了分布式系统开发的复杂性,开发者可以使用简单的注解和配置快速搭建和集成各个功能组件。
3.良好的扩展性:Spring Cloud 的各个组件相互独立又可以协同工作,开发者可以根据项目需求灵活选择和组合不同的组件,方便地对系统进行扩展和升级。

2.常用中间件

2.1 Nacos

2.1.1 Nacos功能

1.服务发现与服务健康检查

2.动态配置管理

3.动态DNS服务

4.服务与元数据管理

2.1.2 Nacos注册中心原理

Nacos注册中心分为server与client,server采用Java编写,为client提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,nacos提供sdk和openApi,如果没有sdk也可以根据openApi手动写服务注册与发现和配置拉取的逻辑

Nacos注册概括来说有6个步骤:

1、服务容器负责启动,加载,运行服务提供者。

2、服务提供者在启动时,向注册中心注册自己提供的服务。

3、服务消费者在启动时,向注册中心订阅自己所需的服务。

4、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

5、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

6、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Nacos 服务注册与订阅的完整流程

Nacos 客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是像服务端发送心跳包,这两个操作都是通过 NamingProxy 和服务端进行数据交互的。

Nacos 客户端进行服务订阅时也有两部分组成,一个是不断从服务端查询可用服务实例的定时任务,另一个是不断从已变服务队列中取出服务并通知 EventListener 持有者的定时任务。

2.1.3 Nacos配置中心原理

Nacos的注册发现是一种三层模型: 即 服务--集群--实例

Nacos服务领域模型主要分为命名空间、集群、服务。在服务级别,保存了健康检查开关、元数据、路由机制、保护阈值等设置,而集群保存了健康检查模式、元数据、同步机制等数据,实例保存了该实例的ip、端口、权重、健康检查状态、下线状态、元数据、响应时间。

在Nacos中管理微服务的配置文件,需要在Nacos控制台创建配置项,指定命名空间和分组,定义配置内容,并通过Nacos客户端在微服务中动态获取和监听配置更新。

2.1.4 注册中心基本使用

1、添加依赖

<!-- springcloud alibaba nacos discovery -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><!-- springcloud loadbalancer -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency><!-- SpringBoot Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.添加Nacos配置

# Spring
spring: application:# 应用名称name: ruoyi-xxxx cloud:nacos:discovery:# 服务注册地址server-addr: 127.0.0.1:8848

3、在Application启动类加入注解@SpringBootApplication

@SpringBootApplication
public class RuoYiXxxxApplication
{public static void main(String[] args){SpringApplication.run(RuoYiXxxxApplication.class, args);System.out.println("(♥◠‿◠)ノ゙  Xxxx启动成功   ლ(´ڡ`ლ)゙  \n" +" .-------.       ____     __        \n" +" |  _ _   \\      \\   \\   /  /    \n" +" | ( ' )  |       \\  _. /  '       \n" +" |(_ o _) /        _( )_ .'         \n" +" | (_,_).' __  ___(_ o _)'          \n" +" |  |\\ \\  |  ||   |(_,_)'         \n" +" |  | \\ `'   /|   `-'  /           \n" +" |  |  \\    /  \\      /           \n" +" ''-'   `'-'    `-..-'              ");}
}

4.启动服务,查看Nacos控制台的服务列表

2.1.5 配置中心基本使用

1.添加依赖

<!-- springcloud alibaba nacos config -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency><!-- SpringBoot Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、在bootstrap.yml添加Nacos配置

# Spring
spring: application:# 应用名称name: ruoyi-xxxxprofiles:# 环境配置active: devcloud:nacos:config:# 配置中心地址server-addr: 127.0.0.1:8848# 配置文件格式file-extension: yml# 共享配置shared-configs:- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

3、在Application启动类加入注解@SpringBootApplication

@SpringBootApplication
public class RuoYiXxxxApplication
{public static void main(String[] args){SpringApplication.run(RuoYiXxxxApplication.class, args);System.out.println("(♥◠‿◠)ノ゙  Xxxx启动成功   ლ(´ڡ`ლ)゙  \n" +" .-------.       ____     __        \n" +" |  _ _   \\      \\   \\   /  /    \n" +" | ( ' )  |       \\  _. /  '       \n" +" |(_ o _) /        _( )_ .'         \n" +" | (_,_).' __  ___(_ o _)'          \n" +" |  |\\ \\  |  ||   |(_,_)'         \n" +" |  | \\ `'   /|   `-'  /           \n" +" |  |  \\    /  \\      /           \n" +" ''-'   `'-'    `-..-'              ");}
}

2.2 Sentinel

2.2.1 基本介绍

Sentinel是阿里巴巴开源的一款面向分布式服务架构的流量控制、熔断降级组件。它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度帮助用户保障微服务的稳定性。

2.2.2 Sentinel的使用

Sentinel 的使用可以分为两个部分:

  • 控制台(Dashboard):控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。
  • 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 7 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。

1.添加依赖

<!-- springcloud alibaba sentinel -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency><!-- SpringBoot Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.添加sentinel配置

spring: application:# 应用名称name: ruoyi-xxxx cloud:sentinel:# 取消控制台懒加载eager: truetransport:# 控制台地址dashboard: 127.0.0.1:8718

3.下载sentinel客户端jar包

4.在jar目录下输入终端命令

java -jar sentinel-dashboard-1.8.6.jar --server.port=8081
or
java -Dserver.port=8081 -Dcsp.sentinel.dashboard.server=localhost:8081 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8082 -jar "C:\project\xinlingzhitong2javacloud\sentinel-dashboard-1.8.6.jar"
or
java  -Dserver.port=38718 -Dcsp.sentinel.dashboard.server=localhost:38718 -Dproject.name=sentinel-dashboard -Dfile.encoding=utf-8 -Xms256m -Xmx512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m  -jar sentinel-dashboard-1.8.6.jar

5.访问:http://localhost:8081/#/dashboard

2.3 Seata

2.3.1 Seata简介

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

2.3.2 Seata基本架构
  • TC (Transaction Coordinator) - 事务协调者;维护全局和分支事务的状态,驱动全局事务提交或回滚。
  • TM (Transaction Manager) - 事务管理器;定义全局事务的范围:开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - 资源管理器;管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

2.3.3 分布式事务解决方案
  • XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入。
  • TCC模式:最终一致的分阶段事务模式,有业务侵入。
  • AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
  • SAGA模式:长事务模式,有业务侵入。

2.4 RabbitMQ

2.4.1 RabbitMQ的基本概念

RabbitMQ中的一些角色:

publisher:生产者(发布者)

consumer:消费者

exchange:交换机,负责消息路由

queue:队列,存储消息

virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离

channel:表示通道,操作MQ的工具。是消息发布者和交换机之间的连接通道,也是消息消费者连接队列的通道

将以上的RabbitMQ基本结构归纳为以下四点:

1.消息的发布者(publisher)将消息投递到交换机(exchange)

2.交换机(exchange)将消息转发到与之绑定的队列(queue)

3.消息消费者(consumer)监听队列(queue),获取队列(queue)中的消息

4.将不同的队列(queue)和交换机(exchange)划分成一组,称为虚拟主机(virtualHost)

2.4.2 官方示例

1.基本消息队列

P(producer/ publisher):生产者,一个发送消息的用户应用程序。我们自己书写代码发送。

C(consumer):消费者,消费和接收有类似的意思,消费者是一个主要用来等待接收消息的用户应用程序。我们自己书写代码接收。

队列(红色区域):存在于rabbitmq内部。许多生产者可以发送消息到一个队列,许多消费者可以尝试从一个队列接收数据。

2.工作消息队列

工作消息队列是基本消息队列的增强版,具有多个消费者消费队列的消息。假设消息队列中积压了多个消息,那么此时可以使用多个消费者来消费队列中的消息。效率要比基本消息队列模型高。

3.发布订阅

将消息交给所有绑定到交换机的队列,生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。交换机把消息发送给绑定过的所有队列.队列的消费者都能拿到消息。实现一条消息被多个消费者消费.

4.路由

1.在广播模式中,生产者发布消息,所有消费者都可以获取所有消息。

2.在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。在Direct模型下,队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key).消息的发送方在向Exchange发送消息时,也必须指定消息的routing key。

3.P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。

4.X:Exchange(交换机),接收生产者的消息,然后把消息递交给 与routing key完全匹配的队列

5.主题

1.Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符!

2.Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert

3.通配符规则:

#:匹配一个或多个词

*:匹配恰好1个词

2.5 SpringCloud Gateway

2.5.1 基本介绍

服务网关

API Gateway(APIGW / API 网关),顾名思义,是系统对外的唯一入口。API网关封装了系统内部架构,为每个客户端提供定制的API。 近几年来移动应用与企业间互联需求的兴起。从以前单一的Web应用,扩展到多种使用场景,且每种使用场景对后台服务的要求都不尽相同。 这不仅增加了后台服务的响应量,还增加了后台服务的复杂性。随着微服务架构概念的提出,API网关成为了微服务架构的一个标配组件。

why use?

微服务的应用可能部署在不同机房,不同地区,不同域名下。此时客户端(浏览器/手机/软件工具)想 要请求对应的服务,都需要知道机器的具体 IP 或者域名 URL,当微服务实例众多时,这是非常难以记忆的,对 于客户端来说也太复杂难以维护。此时就有了网关,客户端相关的请求直接发送到网关,由网关根据请求标识 解析判断出具体的微服务地址,再把请求转发到微服务实例。这其中的记忆功能就全部交由网关来操作了。

核心概念

路由(Route):路由是网关最基础的部分,路由信息由 ID、目标 URI、一组断言和一组过滤器组成。如果断言 路由为真,则说明请求的 URI 和配置匹配。
断言(Predicate):Java8 中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是 Spring 5.0 框架中 的 ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 Http Request 中的任 何信息,比如请求头和参数等。
过滤器(Filter):一个标准的 Spring Web Filter。Spring Cloud Gateway 中的 Filter 分为两种类型,分别是 Gateway Filter 和 Global Filter。过滤器将会对请求和响应进行处理。

2.5.2 使用网关

1.添加依赖

<!-- spring cloud gateway 依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2.resources/application.yml配置文件

server:port: 8080spring: application:name: ruoyi-gatewaycloud:gateway:routes:# 系统模块- id: ruoyi-systemuri: http://localhost:9201/predicates:- Path=/system/**filters:- StripPrefix=1

3.网关启动类

@SpringBootApplication
public class RuoYiGatewayApplication
{public static void main(String[] args){SpringApplication.run(RuoYiGatewayApplication.class, args);System.out.println("(♥◠‿◠)ノ゙  若依网关启动成功   ლ(´ڡ`ლ)゙  \n" +" .-------.       ____     __        \n" +" |  _ _   \\      \\   \\   /  /    \n" +" | ( ' )  |       \\  _. /  '       \n" +" |(_ o _) /        _( )_ .'         \n" +" | (_,_).' __  ___(_ o _)'          \n" +" |  |\\ \\  |  ||   |(_,_)'         \n" +" |  | \\ `'   /|   `-'  /           \n" +" |  |  \\    /  \\      /           \n" +" ''-'   `'-'    `-..-'              ");}
}

2.6 MongoDB

2.6.1 简单介绍

MongoDB是一个基于分布式文件存储的数据库

由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

2.6.2 使用场景

传统的关系型数据库(如MySQL),在数据操作的三高需求以及应对Web2.0的网站需求面前,显得力不从心,而 MongoDB可应对“三高“需求。

High performance:对数据库高并发读写的需求

Huge Storage:对海量数据的高效率存储和访问的需求

High Scalability && High Availability:对数据库的高可扩展性和高可用性的需求

具体应用场景:

社交场景,使用 MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。

游戏场景,使用 MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。

物流场景,使用 MongoDB存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来

物联网场景,使用 MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。

视频直播,使用 MongoDB存储用户信息、点赞互动信息等。

这些应用场景中,数据操作方面的共同特点是:

(1)数据量大

(2)写入操作频繁(读写都很频繁)

(3)价值较低的数据,对事务性要求不高

对于这样的数据,我们更适合使用 MongoDB来实现数据的存储。

2.6.3 数据类型

MongoDB的最小存储单位就是文档document对象。文档document对象对应于关系型数据库的行。数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。

BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称 Binary JSON;BSON和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和Bin Data类型。

BSON采用了类似于C语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的三个特点,可以有效描述非结构化数据和结构化数据。这种格式的优点是灵活性高,但它的缺点是空间利用率不是很理想。

BSON中,除了基本JSON类型: string,integer,boolean,double,null,array和object,mongo还使用了特殊的数据类型。这些类型包括 date, object id, binary data, regular expression和code。每一个驱动都以特定语言的方式实现了这些类型,查看你的驱动的文档来获取详细信息。

2.6.4 基本常用命令
增:插入文档
db.集合名.insert(json数据)
集合存在则直接插入数据,不存在则隐式创建集合并插入数据
json数据格式要求key得加"",但这里为了方便查看,对象的key统一不加"";查看集合数据时系统会自动给key加""
mongodb会自动给每条数据创建全球唯一的_id键(我们也可以自定义_id的值,只要给插入的json数据增加_id键即可覆盖,但是不推荐这样做)

插入测试

删:删除数据
db.集合名.remove(条件 [,是否删除一条])# 是否删除一条
- false删除多条,即全部删除(默认)
- true删除一条

改:修改数据
db.集合名.update(条件, 新数据 [,是否新增, 是否修改多条])
# 新数据
- 默认是对原数据进行替换
- 若要进行修改,格式为 {修改器:{key:value}}# 是否新增
- 条件匹配不到数据时是否插入: true插入,false不插入(默认)# 是否修改多条
- 条件匹配成功的数据是否都修改: true都修改,false只修改一条(默认)

查:查询数据
db.集合名.find(条件 [,查询的列])
db.集合名.find(条件 [,查询的列]).pretty()	#格式化查看# 条件
- 查询所有数据	{}或不写
- 查询指定要求数据	{key:value}或{key:{运算符:value}}# 查询的列(可选参数)
- 不写则查询全部列
- {key:1}	只显示key列
- {key:0}	除了key列都显示
- 注意:_id列都会存在

2.7 RBAC模型

2.7.1 RABC

RBAC(Role-Based Access Control)是一种通过角色(Role)关联用户(User)和权限(Permission)的访问控制模型,核心思想是:用户→角色→权限。

用户(User):系统的实际使用者,拥有唯一标识。

角色(Role):一组权限的集合,代表用户在系统中的职责(如管理员、普通用户)。

权限(Permission):对系统资源的操作许可(如 “用户查看”、“订单删除”)。

关联关系:

用户与角色:多对多(一个用户可拥有多个角色,一个角色可分配给多个用户)。

角色与权限:多对多(一个角色可包含多个权限,一个权限可被多个角色拥有)。

优点:

简化权限管理:通过角色统一管理权限,避免直接对用户逐个授权。

灵活性:新增角色或修改角色权限时,无需逐个调整用户,只需关联角色即可。

职责分离:符合现实中组织架构的职责划分(如财务角色、研发角色)。

2.7.2 RBAC - 1

RBAC - 1 在基本 RBAC 模型的基础上引入了角色层次结构的概念。即一个角色可以继承另一个角色的权限,形成类似于树状或有向无环图(DAG)的结构。例如,“高级管理员” 角色可能继承 “普通管理员” 角色的所有权限,并且还拥有额外的权限。这种层次结构使得权限管理更加灵活和高效,能够更好地反映现实组织中的职责和权力关系。

优势

  • 当一个新角色需要继承已有角色的大部分权限时,只需将其置于角色层次结构中合适的位置,而无需重新分配所有权限。
  • 角色层次结构可以确保权限的分配遵循一定的规则和逻辑,减少了权限分配的混乱和错误。
  • 能够准确地反映组织中不同职位之间的上下级关系和权限继承关系。
2.7.3 RBAC - 2(约束型 RBAC)

RBAC - 2 在基本 RBAC 模型基础上,添加了各种约束条件,以增强系统的安全性和合规性。这些约束可以限制用户、角色和权限之间的关系,防止不合理的权限分配和使用。

常见约束类型:

互斥角色约束:某些角色不能同时被一个用户拥有。例如,在财务系统中,“审计员” 和 “财务管理员” 角色是互斥的,因为一个人不能同时既负责审计又负责财务管理,以防止利益冲突和欺诈行为。

基数约束:对用户可拥有的角色数量、角色可分配的用户数量或权限可分配的角色数量进行限制。例如,规定每个项目只能有一个 “项目经理” 角色。

先决条件约束:一个角色必须在用户拥有另一个角色之后才能被分配。比如,用户必须先拥有 “普通员工” 角色,才能被分配 “部门主管” 角色。

优势

增强安全性:约束条件可以有效防止用户滥用权限,减少内部人员违规操作的风险。

满足合规要求:许多行业有严格的法规和合规要求,RBAC - 2 的约束机制有助于系统满足这些要求,如金融行业的监管要求。

提高系统可靠性:通过约束条件,可以避免不合理的权限分配导致的系统故障和数据不一致问题。

2.8 Elasticsearch

2.8.1 简介

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

2.8.2 安装

1.下载注意选择的版本需要和你的jdk版本适配

Past Releases of Elastic Stack Software | Elastic

2.修改配置(config下的elasticsearch.yml)


cluster.name: xuecheng   #配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。
node.name: xc_node_1  #节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
network.host: 0.0.0.0  #绑定ip地址 ,这个位置改为127.0.0.1,否则报错
http.port: 19200  #暴露的http端口
transport.tcp.port: 19300  #内部端口
node.master: true  #主节点
node.data: true  #数据节点
discovery.zen.ping.unicast.hosts: ["0.0.0.0:19300", "0.0.0.0:19301", "0.0.0.0:19302"]  #设置集群中master节点的初始列表
discovery.zen.minimum_master_nodes: 1  #主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这里要设置为2。
bootstrap.memory_lock: false  #内存的锁定只给es用
node.max_local_storage_nodes: 1 #单机允许的最大存储结点数,通常单机启动一个结点建议设置为1,开发环境如果单机启动多个节点可设置大于1
path.data: C:\elasticsearch-6.2.1\data  #索引目录
path.logs: C:\elasticsearch-6.2.1\logs    #日志
http.cors.enabled: true #  跨域设置
http.cors.allow-origin: “*” #设置跨域
2.8.3 使用

1.进入Elasticsearch的bin目录

cd C:\elasticsearch-6.2.1\bin

2.运行elasticsearch-service.bat文件来启动服务

elasticsearch-service.bat install

3.启动服务

elasticsearch.bat

4.启动成功,访问http://localhost:19200/(19200为配置的端口号)

2.9 Logstash

2.9.1 简介

作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给 Elasticsearch。

Logstash 由 Ruby 语言编写,运行在 Java 虚拟机(JVM)上,是一款强大的数据处理工具, 可以实现数据传输、格式处理、格式化输出。Logstash 具有强大的插件功能,常用于日志处理。

2.10 Kibana

2.10.1 简介

Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。

2.10.2 安装

1.下载安装

到网站https://www.elastic.co/cn/downloads/kibana下载 可以直接通过修改版本号来下载 https://artifacts.elastic.co/downloads/kibana/kibana-7.17.25-windows-x86_64.zip 版本号和es的一样就行了

2.修改配置文件

2.10.3 使用

启动访问:http://localhost:5601/app/kibana/

ELK架构

2.11 FeignClient

2.11.1 介绍

FeignClient是Spring Cloud的一个声明式HTTP客户端工具,简化了微服务之间的HTTP调用,通过注解和接口定义能够自动且快速发送HTTP请求。

在接触FeignClient之前,对HTTP请求更多的是在前端代码,而FeignClient是后端用来请求HTTP服务(也就是后端某个工程需要请求某个服务),它与前端请求并没有明显的差距,都包括请求url,请求方式,请求参数等,只是书写方式有区别。

2.11.2 使用

FeignClient 的使用步骤

1.引入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.启用 FeignClient

@SpringBootApplication
@EnableFeignClients
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

3.定义 FeignClient 接口

@FeignClient(contextId = "remoteRecruitService", value = ServiceNameConstants.RECRUIT_SERVICE, fallbackFactory = RemoteRecruitFallbackFactory.class)
public interface RemoteRecruitService {@PostMapping("/jobInfo/getJobHotCityList")AjaxResult getJobHotCityList(@RequestBody RecruitCityVo cityVo,@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}

4.调用 FeignClient

@PostMapping("/hotCityList")
public AjaxResult hotCityList(@RequestBody RecruitCityVo cityVo) {cityVo.setBeHot(1); // 热门城市return remoteRecruitService.getJobHotCityList(cityVo, SecurityConstants.INNER);
}
2.11.3 服务降级
@Component
public class RemoteRecruitFallbackFactory implements FallbackFactory<RemoteRecruitService>
{private static final Logger log = LoggerFactory.getLogger(RemoteRecruitFallbackFactory.class);@Overridepublic RemoteRecruitService create(Throwable throwable){log.error("招募服务调用失败:{}", throwable.getMessage());return new RemoteRecruitService(){@Overridepublic AjaxResult cancelCollect(RecruitSwCollect recruitSwCollect, String inner) {return AjaxResult.error("recruit服务cancelCollect接口API调用失败:" + throwable.getMessage());}};}
}

相关文章:

微服务常用的基础知识

1.微服务介绍 1.1 产生背景 随着互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;传统单体架构逐渐难以应对大型网站高并发、高扩展性等需求&#xff0c;于是分布式系统架构应运而生。Spring Cloud 就是在这种背景下诞生的&#xff0c;它利用 Spring Boot 的开发便…...

【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整Python源码

🛡️【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整源码 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 🐋 希望大家多多支持,…...

6月份最新代发考试战报:思科华为HCIP HCSE 考试通过

6月份最新代发考试战报&#xff1a;思科华为HCIP HCSE 考试通过 H19-423 HCSA-Presales-IP Network 数通考试通过&#xff0c; H12-725 HCIP-Security安全 考试通过&#xff0c;H13-121 HCIP-Kunpeng Application Developer鲲鹏计算 考试通过&#xff0c;CCNP 350-401考试通过…...

本地部署开源时间跟踪工具 Kimai 并实现外部访问( Windows 版本)

Kimai 是一款开源的时间跟踪工具&#xff0c;它易于使用&#xff0c;并提供了强大的报告功能&#xff0c;在个人和团队记录工作时间、项目时间和活动时间等之后可以帮助用户了解他们是如何花费时间的&#xff0c;从而提高生产力和效率。本文将详细介绍如何在 Windows 系统本地部…...

SpringBoot 中 @Transactional 的使用

SpringBoot 中 Transactional 的使用 一、Transactional 的基本使用二、Transactional 的核心属性三、使用避坑&#xff08;失效场景&#xff09;3.1 自调用问题3.2 异常处理不当3.3 类未被 Spring 管理3.4 异步方法内使用失效 四、工作实践4.1 事务提交之后执行一些操作4.2 事…...

Mac电脑安装iTerm2通过rz命令上传文件到远程服务器

背景 闲着没事买了个云服务器玩&#xff08;京东云轻量云主机&#xff09;&#xff0c;Mac本地搞了个java的jar包&#xff0c;想上传到云服务器&#xff0c;通过scp命令在Mac自带的【终端】上怎么都上传不了&#xff0c;如图。但是通过ssh命令&#xff08;ssh root主机IP &…...

供应链数据可视化大屏

在全球化与数字化转型的双重浪潮下&#xff0c;供应链管理正面临前所未有的挑战&#xff1a;黑天鹅事件频发、多环节协同效率低下、库存与成本难以平衡……如何让供应链更透明、更敏捷、更具韧性&#xff1f;供应链数据可视化大屏应运而生&#xff0c;成为企业破解管理痛点的关…...

A2O MAY登上央视《中国音乐TOP榜》舞台,展现新歌榜冠军实力

——A2O MAY凭借新歌《BOSS》登上中国QQ音乐新歌榜冠军后&#xff0c;成功出演CCTV音乐节目《中国音乐TOP榜》&#xff0c;以实力赢得瞩目。 由A2O Entertainment&#xff08;以下简称A2O&#xff09;推出的全球女团 A2O MAY&#xff08;成员包括朱晨予CHENYU、李诗洁SHIJIE、…...

关于如何在 Git 中切换到之前创建的分支的方法

文章目录 关于如何在 Git 中切换到之前创建的分支的方法一、确保你在项目目录中二、查看所有分支&#xff08;可选&#xff09;三、切换到目标分支四、如果分支仅在远程存在五、验证是否切换成功六、常见问题处理七、总结命令流程 PS:下次进入分支时&#xff0c;只需完成步骤1 …...

vue3+element-plus 组件功能实现 上传功能

一、整体功能概述 这段代码实现了一个基于 Vue 3 和 Element Plus 组件库的文件导入及预览功能模块。主要包含了一个主导入对话框&#xff08;用于上传文件、展示文件相关信息、进行导入操作等&#xff09;以及一个用于预览文件内容的预览对话框。支持导入特定格式&#xff08;…...

多相机人脸扫描设备如何助力高效打造数字教育孪生体?

在教育数字化转型浪潮中&#xff0c;数字孪生体作为现实教育场景的虚拟映射&#xff0c;正成为智慧教育发展的关键技术支点。传统教育模式面临师资资源分布不均、个性化教学难以覆盖、跨时空教学场景受限等痛点&#xff0c;而数字孪生体通过构建高仿真虚拟教育主体&#xff08;…...

高中成绩可视化平台开发笔记

高中成绩可视化平台&#xff08;1&#xff09; 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台&#xff0c;旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换&#xff0c;并提供多个维度的图…...

圆周期性显示和消失——瞬态实现(CAD c#二次开发、插件定制)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; [assembly: CommandClass(typeof(IfoxDemo.Commands))] namespace IfoxDemo {// 新增的圆形闪烁命令实…...

Spark SQL to_json 函数介绍

目录 前言函数介绍参数说明示例 前言 在Apache Hive中&#xff0c;并没有内置的to_json函数。在Apache Spark SQL中确实有to_json函数,它可以用来将结构化数据&#xff08;如结构化类型或MAP类型&#xff09;转换为JSON字符串。这个功能对于需要将表格数据输出为JSON格式的场景…...

5个免费的硬盘分区工具,操作简单功能全

电脑用久了&#xff0c;系统盘空间告急、数据盘混乱无序&#xff0c;很多人想重新分区&#xff0c;却又担心太复杂或怕搞坏硬盘。其实&#xff0c;只要用对工具&#xff0c;分区操作其实一点都不难。更重要的是&#xff0c;有很多免费的分区软件&#xff0c;不仅好用&#xff0…...

uniapp事件onLoad区分大小写

区分大小写。不然会不起作用。onLoad方法中的功能均不会被执行。 除了功能逻辑要检查外。大小写是要认真检查的一部分...

Flutter Riverpod 使用详细解析

&#x1f4da; Flutter 状态管理系列文章目录 Flutter 状态管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用详解&#xff1a;原理及注意事项 InheritedWidget 组件使用及原理 Flutter 中 Provider 的使用、注…...

算法打卡 day4

4 . 高精度算法 性质&#xff1a;数组或者容器从低位往高位依次存储大整数&#xff0c;方便进位。 4.1 高精度加法 给定两个正整数&#xff08;不含前导 0&#xff09;&#xff0c;计算它们的和。 输入格式 共两行&#xff0c;每行包含一个整数。 输出格式 共一行&#xff0c;…...

权威认证!华宇TAS应用中间件荣获CCRC“中间件产品安全认证”

近日&#xff0c;华宇TAS应用中间件顺利通过了中国网络安全审查认证和市场监管大数据中心(CCRC)的信息安全认证&#xff0c;获得了IT产品信息安全认证证书。此次获证&#xff0c;标志着华宇TAS应用中间件在安全性、可靠性及合规性等方面达到行业领先水平&#xff0c;可以为政企…...

【Linux网络编程】多路转接IO(二)epoll

目录 epoll初识 epoll的相关系统调用 epoll的工作原理 epoll的优点 epoll的工作方式 水平触发 Level Triggered 工作模式 边缘触发 Edge Triggered 工作模式 对比LT和ET 理解 ET 模式和非阻塞文件描述符 epoll的惊群问题 基于LT模式的epoll代码样例 epoll初识 按照man…...

flutter的包管理#资源管理#调试Flutter应用#Flutter异常捕获

2.5 包管理 2.5.1 简介 在软件开发中&#xff0c;很多时候有一些公共的库或 SDK 可能会被很多项目用到&#xff0c;因此&#xff0c;将这些代码单独抽到一个独立模块&#xff0c;然后哪个项目需要使用时再直接集成这个模块&#xff0c;便可大大提高开发效率。很多编程语言或开…...

Unity Netcode自定义数据传输——结构体及其序列化

在 Unity Netcode 中&#xff0c;要实现自定义数据的网络传输&#xff0c;确实需要两个关键部分&#xff1a; ✅ 两个必需组件&#xff1a; 数据结构定义 public struct PlayerState : INetworkSerializable {public int id; // 字段1&#xff1a;玩家IDpublic bool …...

Vue 3 高级编程技巧

Vue 3 高级编程技巧 1. 计算属性 (Computed Properties) 含义&#xff1a;计算属性在依赖变化时会自动更新。以下是一个示例&#xff0c;展示当 firstName 或 lastName 变化时&#xff0c;fullName 也会更新。 实例&#xff1a; <script setup> import { ref, comput…...

GraphQL注入 -- GPN CTF 2025 Real Christmas

part 1 服务器会每段时间禁用已注册的账号,此处存在漏洞 def deactivate_user_graphql(email):graphql_endpoint current_app.config["GRAPHQL_ENDPOINT"]query f"""mutation {{deactivateUser (user: {{email: "{email}"}}){{ success…...

python打卡day43

疏锦行 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms# 数据预处理 tra…...

ethers.js express vue2 定时任务每天凌晨2点监听合约地址数据同步到Mysql整理

下面是一个完整的 Ethers.js Express Vue2 MySQL 实现方案&#xff0c;用于&#xff1a; &#x1f4a1;每天凌晨 2 点监听某合约地址的 Transfer 事件&#xff0c;写入 MySQL 数据库&#xff0c;并展示每日 NFT 交易量图表&#xff08;Vue2 ECharts&#xff09; ✅ 后端部分…...

内网穿透和端口映射的区别在哪?局域网提供互联网访问方案对比选择详解

内网穿透和端口映射是两个经常被提及的概念&#xff0c;它们对于实现网络中的内外网通信起着关键作用。内网穿透和端口映射都能够有效地将本地局域网地址提供给互联网上外网访问&#xff0c;但二者之间存在着显著的区别。 内网穿透与端口映射的核心区别在于实现方式和依赖条件…...

机器学习---正则化、过拟合抑制与特征筛选

专栏:机器学习 个人主页:云端筑梦狮 注&#xff1a;上一篇机器学习还差一小节&#xff0c;日后坑必会填上 一.正则化 什么是正则化 / 如何进行正则化 其实机器学习中正则化&#xff08;regularization&#xff09;的外在形式非常简单&#xff0c;就是在模型的损失函数中加…...

优化 ArcPy 脚本性能

合理设置环境变量 优化环境变量配置 ArcPy 提供了许多环境变量&#xff0c;用于控制地理处理工具的行为。合理设置环境变量可以优化脚本的性能。例如&#xff0c;设置“workspace”环境变量可以指定默认的工作空间&#xff0c;避免在脚本中重复指定工作空间路径。 Python 复制…...

Robyn高性能Web框架系列06:使用WebSocket实现产品智能助理

使用WebSocket实现产品智能助理 WebSocket原理与应用场景Robyn的WebSocket基本使用1、创建WebSocket服务2、侦听WebSocket事件3、向客户端发送消息4、向客户端广播消息5、使用查询参数6、主动关闭连接 示例&#xff1a;简易的产品智能助理1、产品数据部分2、产品信息部分3、智能…...

UDP 缓冲区

UDP 有接收缓冲区&#xff0c;没有发送缓冲区 引申问题 1、为什么没有发送缓冲区&#xff1f; 直接引用原文 “因为 UDP 是不可靠的&#xff0c;它不必保存应用进程的数据拷贝&#xff0c;因此无需一个真正的发送缓冲区” 2、没有发送缓冲区的情况下&#xff0c;sendto 的数…...

物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践

在数字化浪潮席卷全球的今天&#xff0c;物联网&#xff08;IoT&#xff09;已从概念走向现实&#xff0c;成为连接物理世界与数字世界的关键桥梁。它通过将日常物品、工业设备等“物”嵌入传感器、软件及其他技术&#xff0c;使其能够通过网络相互连接并交换数据&#xff0c;从…...

【甲方安全视角】开源的安全悖论

文章目录 安全的充分必要条件&#xff1a;从「符号化信任」到「验证驱动安全」构建与分发的不可信链条迭代与审计的节奏错位代码透明与攻击面的对等暴露对普通用户的建议选择可信项目与品牌始终通过官方渠道获取软件注意权限与环境安全对“签名请求”、“连接钱包”等敏感操作保…...

GEO生成式引擎优化发展迅猛:热点数智化传播是GEO最佳路径

在人工智能技术浪潮的推动下&#xff0c;GEO生成式引擎优化已跃升为行业技术演进与产业发展相融合的核心赛道。通过系统性梳理其发展脉络&#xff0c;我们可清晰勾勒出技术突破与产业变革交织的演进轨迹&#xff0c;其发展进程包含以下重要节点。 2023年4月&#xff0c;GPT-4发…...

【unity游戏开发——网络】计算机网络中的三种数据管理模型(分散式、集中式、分布式)和三大通信模型(C/S、B/S、P2P)

注意&#xff1a;考虑到热更新的内容比较多&#xff0c;我将热更新的内容分开&#xff0c;并全部整合放在【unity游戏开发——网络】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、数据管理模型1、分散式 (Decentralized - 各管各的)2、集中式 (Centra…...

MR30分布式 IO在物流堆垛机的应用

在现代物流行业蓬勃发展的浪潮中&#xff0c;物流堆垛机作为自动化仓储系统的核心设备&#xff0c;承担着货物的高效存取与搬运任务。它凭借自动化操作、高精度定位等优势&#xff0c;极大地提升了仓储空间利用率和货物周转效率。然而&#xff0c;随着物流行业的高速发展&#…...

香港维尔利健康科技集团推出AI辅助医学影像训练平台,助力医护人才数字化转型

香港维尔利健康科技集团近日正式发布其自主研发的“AI辅助医学影像训练平台&#xff08;V-MedTrain&#xff09;”&#xff0c;这一创新平台的上线&#xff0c;标志着医学影像教育迈入智能化辅助教学新时代。依托人工智能与大数据分析技术&#xff0c;香港维尔利健康科技集团在…...

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(五)

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷&#xff08;五&#xff09; 第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&#xff08;可以培训有答案&#xff09;任务 2&#xff1a;通信数据分析取…...

基于 Python 的批量文件重命名软件设计与实现

在工作过程中,经常有很多文件,想要对文件名进行批量改名,特此写了一个程序,以实现此功能。 一、批量文件重命名软件设计原理 (一)核心原理阐述 批量文件重命名软件的核心原理在于运用操作系统提供的文件管理功能,借助编程手段达成对文件名称的批量修改。在这个软件里,…...

【深度学习新浪潮】什么是上下文工程?

什么是上下文工程? 上下文工程(Context Engineering) 是指通过设计、优化与大语言模型(LLM)交互时的输入内容(即“上下文”),引导模型生成更符合预期、更精准回答的系统性方法。这里的“上下文”通常包括 提示词(Prompt)、示例(Few-Shot Examples)、历史对话记录、…...

逆向入门(8)汇编篇-rol指令的学习

还是那个题&#xff0c;这回又碰到个循环左移&#xff0c;有挺多操作方法之前都没有系统的学&#xff0c;用到的时候再看看感觉还挺好&#xff0c;不耽误事 0x00 基本介绍 ROL(Rotate Left): 循环左移&#xff0c;它有两个操作数&#xff1a; 第一个操作数是目标操作数&#…...

Fisco Bcos学习 - 开发第一个区块链应用

文章目录 一、前言二、业务场景分析&#xff1a;简易资产管理系统三、智能合约设计与实现3.1 存储结构设计3.2 接口设计3.3 完整合约代码 四、合约编译与Java接口生成五、SDK配置与项目搭建5.1 获取Java工程项目5.2 项目目录结构5.3 引入Web3SDK5.4 证书与配置文件 六、业务开发…...

黑马python(十六)

目录&#xff1a; 1.JSON数据格式的转换 2.pyecharts模块简介 3.pyecharts入门使用 4.数据准备 5.生成折线图 1.JSON数据格式的转换 2.pyecharts模块简介 官方网站&#xff1a; 画廊网站:有更多的图标形式 测试是否安装 3.pyecharts入门使用 运行会生成一个html的文件&a…...

完成国产化替代!昆明卷烟厂用时序数据库 TDengine 重塑工业时序数据平台

小T导读&#xff1a;昆明卷烟厂作为红云红河烟草&#xff08;集团&#xff09;有限责任公司的重要组成部分&#xff0c;是集团卷烟生产的核心工厂。早期在建设制造执行系统&#xff08;MES&#xff09;时&#xff0c;其采用了 Wonderware 平台的时序数据存储功能模块&#xff0…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | BackgroundSlider(背景滑块)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— BackgroundSlider组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> …...

Wpf的Binding

前言 wpf的Binding就像一个桥梁&#xff0c;它的作用就是连接逻辑层与界面层&#xff0c;既能够把逻辑层的数据搬到界面层展示&#xff0c;又能将界面层的数据更改后传递到逻辑层&#xff0c;Binding的数据来源就是Binding的源&#xff0c;数据展示的地方就是Binding的目标。 …...

Redis—持久化

持久化 在mysql当中&#xff0c;有4个比较关心的特性&#xff0c;分别是原子性、一致性、隔离性和持久性。这里的持久性和持久化是一回事。我们该如何判断是否具有持久性呢&#xff1f;答案就是看重启进程或者主机之后&#xff0c;数据是否存在。当我们把数据存储在硬盘上是就…...

Spring Boot中日志管理与异常处理

以下是Spring Boot中日志管理与异常处理的系统化实践指南&#xff0c;结合最佳实践与核心配置&#xff0c;确保应用健壮性与可维护性。 &#x1f4ca; 一、日志管理核心配置 默认框架与级别控制 Logback 是Spring Boot默认日志框架&#xff0c;通过application.yml快速配置&…...

基于MATLAB的BP神经网络的心电图分类方法应用

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 心电图&#xff08;ECG&#xff09;是临床诊断心血管疾病的重要工具&#xff0c;能够反映心脏电活动的周期性变化。…...

【笔记】Docker 配置阿里云镜像加速(公共地址即开即用,无需手动创建实例)

2025年06月25日记 【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记&#xff08;附 异常处理&#xff09;-CSDN博客 【笔记】解决 WSL 迁移后 Docker 出现 “starting services: initializing Docker API Proxy: setting up docker ap” 问题…...