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

SpringCloud和Nacos的基础知识和使用

1.什么是SpringCloud

​ 什么是微服务?

​ 假如我们需要搭建一个网上购物系统,那么我们需要哪些功能呢?商品中心、订单中心和客户中心等。

​ 当业务功能较少时,我们可以把这些功能塞到一个SpringBoot项目中来进行管理。但是随着业务越来越多,每个模块需要实现的功能越来越多时,每个模块需要的开发人员就越来越多,这时如果再是一个项目就不太合适了(耦合度太高,并且开发人员对同一个项目进行操作容易出现问题)。这就需要将原先的系统进行拆分,可以按照功能模块拆分成多个服务,这就引出了另一个问题,服务之间如何完成通信。

​ 在实际的业务场景中,每个功能模块不可能是完全分离的,例如订单中心展示订单时可能需要获取商品的信息和客户的信息,这就需要调用商品中心模块和客户中心模块的接口。SpringCloud就支持我们将原有项目进行拆分,分成多个微服务,并支持微服务之间的通信。

1.1 SpringCloud简介

​ SpringCloud由五大组件构成:

1.注册中心Euraka(国内用的较多的是Nacos):负责服务注册和发现。
2.负载均衡Ribbon:负责服务实例的选择(同一个服务可能部署在多个服务器上)。
3.远程调用Feign:通过HTTP请求调用其他服务的接口。
4.熔断器Hystrix:容错管理工具,用于处理分布式系统中的延迟和故障。
5.API网关Zuul:用于路由、过滤和负载均衡。

​ 这五大组件的工作流程如下(绕不开的八股):

1.服务注册:只有一个服务注册到注册中心,才可能被其他服务发现并调用;
2.服务发现:即一个服务通过注册中心发现了其他服务
3.负载均衡:客户端维护一份从注册中心获取的Provider列表清单,根据自己配置的Provider负载均衡选择算法在客户端进行请求的分发;
4.服务调用:一个服务对另一个服务进行调用;
5.隔离、熔断与降级:通过Hystrix的线程池去访问服务,不同的服务通过不同的线程池,实现了不同的服务调度隔离;如果服务出现故障,通过服务熔断,避免服务雪崩的问题 ;并且通过服务降级,保证可以手动实现服务正常功能;
6.网关路由:如果前端调用后台系统,统一从网关进入,通过网关转发请求给对应的服务;

在这里插入图片描述

1.2 Eureka

​ 服务注册中心(Eureka server/Nacos server)像是整个微服务架构中的大脑,服务(Eureka client)需要注册到Eureka server以供其他服务(Eureka client)发现,如果要使用其他服务的功能也需要通过Eureka server来获得对应服务(Eureka client)的信息。

​ Eureka server的主要功能为服务注册表维护服务健康检查,Eureka client的主要功能为服务注册心跳续约健康状况查询。(是不是觉得很熟悉,有点像Redis的哨兵机制)

在这里插入图片描述

1.3 Ribbon

​ 在实际的生产环境中,某些模块访问量较高,单个服务器可能无法承载这些访问请求,需要将这个微服务同时部署到多台服务器上,当有服务请求打到Eureka server上时,Eureka server会返回该服务类型对应的所有Eureka client实例。因此客户端会获得多个服务实例,Ribbon会选择哪个实例去处理请求,选择的方式有多种,轮询、随机、权重等,主要目的是避免多次请求均打到同一个服务实例上。Ribbon的作用是负载均衡。

​ Ribbon可以获取Provider清单,并且通过IPing实例定期(如每10秒)向每个Provider实例发送“ping”,并且根据Provider是否有响应来判断该Provider实例是否可用。如果该Provider的可用性发生了改变,或者Provider清单中的数量和之前的不一致,就从注册中心更新或者重新拉取Provider服务实例清单。每次RPC请求到来时,由Ribbon的IRule负载均衡策略接口的某个实现类来进行负载均衡。

1.4 Feign

​ 在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求。Feign 整合了 Ribbon 和 Hystrix,具备负载均衡、隔离、熔断与降级功能。

1.5 Zuul

​ 微服务网关是微服务架构中不可或缺的部分,它统一解决Provider路由、均衡负载、权限控制等功能。具体可以参考博客:https://blog.csdn.net/itigoitie/article/details/125895899?spm=1001.2014.3001.5502

1.6 Hystrix

​ 隔离:通过Hystrix的线程池去访问服务,不同的服务通过不同的线程池,实现了不同的服务调度隔离;
​ 熔断:分布式架构中的熔断器主要用于RPC接口上,为接口安装上“保险丝”,以防止RPC接口出现拥塞时导致系统压力过大而引起的系统瘫痪,当RPC接口流量过大或者目标Provider出现异常时,熔断器及时切断故障可以起到自我保护的作用。
​ 降级:当服务不可用(服务正在等待、链接超时、网络延迟、服务器响应慢等),客户端一直等待时,调用fallback方法给客户端返回一个错误提示,不让客户端继续等待。

2.Nacos

​ Nacos是阿里的产品,它的功能要比Eureka更丰富,因此国内更倾向于使用Nacos,我们来简单介绍一下Nacos的安装和使用。

2.1 Nacos安装

​ Nacos官网:https://nacos.io/

在这里插入图片描述

在这里插入图片描述

​ 将压缩包下载到本地并解压(避免中文路径),进入到bin目录:

在这里插入图片描述

​ 接着在bin目录下打开cmd,输入如下命令来启动Nacos:

startup.cmd -m standalone

在这里插入图片描述

​ 在浏览器中打开:http://192.168.239.1:8848/nacos/index.html

在这里插入图片描述

​ 至此,Nacos安装就完成了,其实还挺简单的,接下来我们需要借助Nacos去搭建一个SpringCloud项目,下面将介绍如何单机搭建一个SpringCloud项目。

2.2 Nacos简单实践

2.2.1 IDEA搭建SpringCloud项目

2.2.1.1 数据库准备
CREATE TABLE USER (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
phone VARCHAR(15) NOT NULL,
address VARCHAR(50) NOT NULL
);INSERT INTO USER VALUES (1, "ayanokoujimonki", 13299075426, "湖北省孝感市")
INSERT INTO USER(NAME, phone, address) VALUES ("二哈很六", 18834267011, "江苏省苏州市")
INSERT INTO USER(NAME, phone, address) VALUES ("陈大龟", 12481076533, "汉川市榔头村")
CREATE TABLE orders (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30) NOT NULL,
price INT NOT NULL,
user_id INT NOT NULL REFERENCES USER(id)
)INSERT INTO orders VALUES (1, "可乐鸡翅", 32, 1);
INSERT INTO orders(NAME, price, user_id) VALUES("冰镇啤酒", 12, 1);
INSERT INTO orders(NAME, price, user_id) VALUES("草莓冰激凌", 8, 2);
INSERT INTO orders(NAME, price, user_id) VALUES("狼牙土豆", 10, 3);
2.2.1.2 创建父项目

​ 1.首先创建父项目:

在这里插入图片描述

​ 2.选择Spring Web依赖:

在这里插入图片描述

​ 3.等到依赖下载好后,删除src目录及mvnw目录,正常情况下一般不会直接在父项目下直接编写代码:

在这里插入图片描述

​ 4.修改pom文件,添加packaging标签和SpringCloud版本,并修改SpringBoot版本:

在这里插入图片描述

​ 5.引入mysql和mybatis依赖:

在这里插入图片描述

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version>
</dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version>
</dependency>

​ 6.添加SpringCloud依赖库,后续子模块使用的时候就不需要再指定版本了

在这里插入图片描述

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.9.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>
2.2.1.3 创建子项目
	1.在父级项目上新建模块(user_client),并修改子项目的pom文件引入父项目的坐标

在这里插入图片描述

在这里插入图片描述

​ 2.为了将子项目作为Nacos的client,需要引入如下依赖:

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

在这里插入图片描述

​ 3.编写application.yml文件

在这里插入图片描述

#服务端口,随便起
server:port: 8082
#服务名称
spring:application:name: userclientdatasource:url: jdbc:mysql://localhost:3306/userusername: rootpassword: cmq123driver-class-name: com.mysql.cj.jdbc.Drivercloud:nacos:discovery:server-addr: localhost:8848

​ 4.同样的步骤创建另一个子项目(orders_client)

在这里插入图片描述

2.2.1.5 编写简单的业务代码

​ 其实这时我们启动服务就可以看到服务注册到Nacos上了,只不过我们没有编写业务代码因此每个微服务不具备具体功能,为了将我们的服务能够被Nacos发现,需要在启动类上加上@EnableDiscoveryClient注解:

在这里插入图片描述

​ 浏览器中打开Nacos地址就可以看到我们注册的实例了:http://192.168.239.1:8848/nacos/index.html

在这里插入图片描述

​ 为了进一步验证服务之间能够通信,我们编写简单的业务代码,首先是userclient,我们编写pojo、controller、service和mapper:

在这里插入图片描述

​ 其中UserService代码如下:

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User findById(Integer id){System.out.println("UserService: "+ id);return userMapper.find(id);}
}

UserController代码如下:

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User findUserById(@PathVariable("id") Integer id){return userService.findById(id);}}

UserMapper代码如下:

@Mapper
public interface UserMapper {@Select("select * from user where id=#{id}")User find(Integer id);
}

User代码如下:

public class User {private int id;private String name;private String password;private String address;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +", address='" + address + '\'' +'}';}
}

​ 同理我们继续编写ordersclient的代码,项目结构保持相同:

在这里插入图片描述

User代码于userclient保持一致,Order代码如下:

public class Order {private int id;private String name;private int price;private int userId;private User user;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Order{" +"id=" + id +", name='" + name + '\'' +", price=" + price +", userId=" + userId +", user=" + user +'}';}
}

OrderMapper代码如下:

@Mapper
public interface OrderMapper {@Select("select * from orders where id= #{id}")Order find(Integer id);
}

OrderService代码如下:

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order findById(Integer id){Order order = orderMapper.find(id);String url = "http://userclient/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);order.setUser(user);return order;}}

OrderController代码如下:

@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("/{id}")public Order findById(@PathVariable("id") Integer id){Order byId = orderService.findById(id);return byId;}
}

​ 启动类代码如下:

@EnableDiscoveryClient
@SpringBootApplication
public class OrdersClientApplication {public static void main(String[] args) {SpringApplication.run(OrdersClientApplication.class, args);}/**** 定义一个RestTemplate Bean,用于发送HTTP请求* @return*/@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

​ 为了将我们实体类和数据库中的字段对应,我们需要在application.yml文件中开启驼峰命名:

mybatis:type-aliases-package: com.ayanokouji.ordersclient.pojo.Orderconfiguration:map-underscore-to-camel-case: true

​ 我们再次启动这两个client,并在浏览器输入:localhost:8083/order/1

在这里插入图片描述

​ 可以看到这两个服务确实完成了通信(虽然不是很优雅)。

​ 这就是一个极致简单的SpringCloud项目,可以看到代码中我们并未显示地使用负载均衡,通信也是使用RestTemplate而不是Feign,关于负载均衡和Feign会在后面的博客中介绍(如果有时间的话,最近公司的活也有点多)。

参考博客

Nacos 注册中心下载到搭建详细步骤【微服务】_nacos下载-CSDN博客

IDEA 搭建 SpringCloud 项目【超详细步骤】_idea创建springcloud工程-CSDN博客

Spring Cloud 五大组件_springcloud五大组件-CSDN博客

相关文章:

SpringCloud和Nacos的基础知识和使用

1.什么是SpringCloud ​ 什么是微服务&#xff1f; ​ 假如我们需要搭建一个网上购物系统&#xff0c;那么我们需要哪些功能呢&#xff1f;商品中心、订单中心和客户中心等。 ​ 当业务功能较少时&#xff0c;我们可以把这些功能塞到一个SpringBoot项目中来进行管理。但是随…...

人工智能技术的深度解析与推广【人工智能的应用场景】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…...

md5sum -c

md5sum -c xxx 命令用于验证文件的 MD5 校验和是否匹配。具体来说&#xff0c;-c 选项告诉 md5sum 命令去读取指定文件&#xff08;通常是一个包含 MD5 校验和的文件&#xff09;&#xff0c;并与实际文件的 MD5 校验和进行比较。 工作原理&#xff1a; 生成校验和文件&#x…...

excel使用笔记

1.工作表1计算工作表2某列的和 假设我们有两个工作表&#xff0c;分别命名为“Sheet1”和“Sheet2”&#xff0c;我们想要求和这两个工作表中A1到A**单元格的数据&#xff0c;可以在任意一个工作表的单元格中输入以下公式&#xff1a; SUM(Sheet1!A1:A10, Sheet2!A1:A10) SUM…...

keepalived+nginx实现web高可用

目录 高可用集群搭建 Keepalived&#xff0b;nginx实现web高可用 一.节点规划 二.基础准备 1.修改主机名 2.关闭防火墙和selinux服务 三.用keepalived配置高可用 1.安装nginx服务 2.修改nginx配置文件 3.启动nginx 4.访问nginx 5.安装keepalived服务 6.编辑配置文件…...

边界层气象:脉动量预报方程展开 | 湍流脉动速度方差预报方程 | 平均湍流动能收支方程推导

写成分量形式 原始式子&#xff1a; ∂ u i ′ ∂ t u ‾ j ∂ u i ′ ∂ x j u j ′ ∂ u ‾ i ∂ x j u j ′ ∂ u i ′ ∂ x j − 1 ρ ‾ ⋅ ∂ p ′ ∂ x i g θ v ′ θ ‾ v δ i 3 f ϵ i j 3 u j ′ v ∂ 2 u i ′ ∂ x j 2 ∂ ( u i ′ u j ′ ‾ ) ∂ x j…...

TOSUN同星TsMaster使用入门——2、使用TS发送报文,使用graphics分析数据等

在第一章里面已经介绍了关于同星工程的创建和最基础的总线分析&#xff0c;接下来看看怎么使用TS发送报文以及图形化分析数据。 目录 一、使用Graphics分析报文信号/变量&#xff08;对标CANoe Graphics&#xff09; 二、使用数值窗口统计信号值/变量 三、使用TS发送报文 3…...

【操作系统】实验七:显示进程列表

实验7 显示进程列表 练习目的&#xff1a;编写一个模块&#xff0c;将它作为Linux内核空间的扩展来执行&#xff0c;并报告模块加载时内核的当前进程信息&#xff0c;进一步了解用户空间和内核空间的概念。 7.1 进程 进程是任何多道程序设计的操作系统中的基本概念。为了管理…...

day10 电商系统后台API——接口测试(使用postman)

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 实战项目简介&#xff1a; 1、用户管理&#xff08;8个&#xff09; 1.1 登录 1.2 获取用户数据列表 1.3 创建用户 1.4 修改用户状态 1.5 根据id查询用户 1.6 修改用户信息 1.7 删除单个用户 1.8 …...

JavaScript ES6+ 语法速通

一、ES6 基础语法 1. let 和 const 声明变量 let&#xff1a;块级作用域&#xff0c;可以重新赋值。const&#xff1a;块级作用域&#xff0c;声明常量&#xff0c;不能重新赋值。 let name Li Hua; name Li Ming; // 可修改const age 21; // age 22; // 报错&#xff0…...

移动端h5自适应rem适配最佳方案

网页开发中&#xff0c;我们常用的单位有如下几个&#xff1a; px&#xff1a;像素固定&#xff0c;无法适配各分辨率的移动设备em: 该单位受父容器影响&#xff0c;大小为父元素的倍数rem: 因为html根元素大小为16px&#xff0c;所以默认 1rem 16px&#xff0c;rem只受根元素…...

2024年使用 Cython 加速 Python 的一些简单步骤

文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 文章有点长,期望您能坚持看…...

EasyExcel设置表头上面的那种大标题(前端传递来的大标题)

1、首先得先引用easyExcel的版本依赖&#xff0c;我那 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency> 2、然后得弄直接的实体类&#xff0c;&…...

【Linux网络编程】第十弹---打造初级网络计算器:从协议设计到服务实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Protocol.hpp 1.1、Request类 1.1.1、基本结构 1.1.2、构造析构函数 1.1.3、序列化函数 1.1.4、反…...

无限弹窗?无限重启?

Windows开机自启目录&#xff1a; "%USERPROFILE%\AppData\Roaming\Microsoft\windows\StartMenu\Programs\Startup" 基于这个和 start 命令&#xff0c; shutdown 命令&#xff0c; 编写 bat 病毒程序。 无限弹窗 echo start cmd > hack.txt echo %0 >>…...

深入详解人工智能机器学习常见算法中的K-means聚类

目录 引言 1. K-means聚类的基本概念 1.1 K-means聚类的定义 1.2 K-means聚类的核心思想 1.3 K-means聚类的目标函数 2. K-means聚类的核心原理 2.1 初始化 2.2 分配 2.3 更新 2.4 迭代 3. K-means聚类的具体实现 3.1 K-means聚类的算法流程 3.2 K-means聚类的Pyt…...

lc146LRU缓存——模仿LinkedHashMap

146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09; 法1&#xff1a; 调用java现有的LinkedHashMap的方法&#xff0c;但不太理解反正都不需要扩容&#xff0c;super(capacity, 1F, true);不行吗&#xff0c;干嘛还弄个装载因子0.75还中途扩容一次浪费时间。 class LRUC…...

全面深入解析:C语言动态库

引言 动态库&#xff08;Dynamic Library&#xff09;是现代软件开发中不可或缺的一部分&#xff0c;它们不仅提高了代码的重用性和维护性&#xff0c;还显著提升了系统的性能和资源利用率。本文将全面探讨C语言中的动态库&#xff0c;从基础概念到高级应用&#xff0c;通过丰…...

运用 SSM 实现垃圾分类系统智能化升级

目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行性 10 3.1.3 操作可行性 10 …...

LeNet-5:深度学习与卷积神经网络的里程碑

目录 ​编辑 引言 LeNet-5的结构与原理 输入层 C1层&#xff1a;卷积层 S2层&#xff1a;池化层 C3层&#xff1a;卷积层 S4层&#xff1a;池化层 C5层&#xff1a;卷积层 F6层&#xff1a;全连接层 输出层 LeNet-5的算法基础 LeNet-5的优点 LeNet-5的现代应用 …...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...