Dubbo 全面解析:从 RPC 核心到服务治理实践
一、分布式系统与 RPC 框架概述
在当今互联网时代,随着业务规模的不断扩大,单体架构已经无法满足高并发、高可用的需求,分布式系统架构成为主流选择。而在分布式系统中,远程服务调用(Remote Procedure Call,RPC)是实现服务间通信的关键技术。
1.1 RPC 框架的核心价值
RPC 框架的核心价值在于它让开发者能够像调用本地方法一样调用远程服务,隐藏了底层网络通信的复杂性。一个成熟的 RPC 框架通常需要解决以下关键问题:
- 服务发现:消费者如何发现提供者的地址
- 负载均衡:如何在多个提供者之间分配请求
- 容错机制:调用失败时如何处理
- 序列化协议:如何高效地进行数据传输
- 网络通信:如何建立高效的网络连接
1.2 Dubbo 的发展历程
Dubbo 是阿里巴巴开源的一款高性能、轻量级的 Java RPC 框架,其发展历程可谓一波三折:
- 2011年:阿里巴巴开源 Dubbo
- 2014年:停止维护,进入"休眠期"
- 2017年:阿里巴巴重启维护并捐献给 Apache 基金会
- 2018年:成为 Apache 顶级项目
- 2019年至今:持续迭代,融入云原生生态
目前 Dubbo 已经发展到 3.x 版本,全面拥抱云原生,支持 Triple 协议(基于 HTTP/2)、应用级服务发现等新特性。
二、Dubbo 核心架构与快速入门
2.1 Dubbo 架构解析
Dubbo 的核心架构采用了分层设计,各层之间松耦合,可以灵活替换实现:
+-------------------+ +-------------------+
| Consumer | | Provider |
+-------------------+ +-------------------+
| Stub | | Stub |
+-------------------+ +-------------------+
| Cluster Layer | | Protocol Layer |
+-------------------+ +-------------------+
| Registry | | Registry |
+-------------------+ +-------------------+
| Monitor | | Monitor |
+-------------------+ +-------------------+
| Config Layer | | Config Layer |
+-------------------+ +-------------------+
各层核心职责:
- Config 层:配置管理,支持 API、XML、注解等多种方式
- Proxy 层:服务代理,生成客户端存根(Stub)和服务端骨架(Skeleton)
- Registry 层:服务注册与发现
- Cluster 层:集群容错、负载均衡、路由等
- Monitor 层:监控调用次数和调用时间
- Protocol 层:远程调用协议,如 Dubbo、HTTP、Triple 等
- Transport 层:网络传输,如 Netty、Mina 等
- Serialize 层:数据序列化,如 Hessian、JSON、Kryo 等
2.2 快速搭建 Dubbo 服务
下面我们通过一个完整的示例演示如何快速搭建 Dubbo 服务。
2.2.1 环境准备
- JDK 1.8+
- Maven 3.5+
- Zookeeper(作为注册中心)
2.2.2 项目结构
dubbo-demo
├── dubbo-demo-api -- 接口定义
├── dubbo-demo-provider -- 服务提供者
└── dubbo-demo-consumer -- 服务消费者
2.2.3 定义服务接口
// 在 dubbo-demo-api 模块中
public interface GreetingService {String sayHello(String name);CompletableFuture<String> sayHelloAsync(String name);
}
2.2.4 服务提供者实现
// 在 dubbo-demo-provider 模块中
@Service
public class GreetingServiceImpl implements GreetingService {@Overridepublic String sayHello(String name) {return "Hello, " + name;}@Overridepublic CompletableFuture<String> sayHelloAsync(String name) {return CompletableFuture.supplyAsync(() -> "Hello, " + name);}
}
2.2.5 提供者配置
<!-- application.yml -->
dubbo:application:name: dubbo-demo-providerprotocol:name: dubboport: 20880registry:address: zookeeper://127.0.0.1:2181scan:base-packages: com.example.service.impl
2.2.6 消费者配置
<!-- application.yml -->
dubbo:application:name: dubbo-demo-consumerregistry:address: zookeeper://127.0.0.1:2181consumer:check: false
2.2.7 消费者调用
@RestController
public class GreetingController {@DubboReferenceprivate GreetingService greetingService;@GetMapping("/greet")public String greet(String name) {return greetingService.sayHello(name);}@GetMapping("/greetAsync")public CompletableFuture<String> greetAsync(String name) {return greetingService.sayHelloAsync(name);}
}
2.3 Dubbo 的核心配置
Dubbo 支持多种配置方式,包括 XML、注解、API 和 Spring Boot 配置。以下是常见的配置项:
-
服务提供者配置
dubbo.application.name
:应用名称dubbo.protocol.name
:协议名称dubbo.protocol.port
:服务端口dubbo.registry.address
:注册中心地址dubbo.provider.timeout
:默认超时时间
-
服务消费者配置
dubbo.consumer.check
:启动时检查提供者是否可用dubbo.consumer.timeout
:调用超时时间dubbo.consumer.retries
:失败重试次数
三、Dubbo 高级特性与原理
3.1 Dubbo 的线程模型
Dubbo 的线程模型对性能有重要影响,主要包括两种线程:
- IO 线程:处理网络请求,默认使用 Netty 的 EventLoopGroup
- 业务线程:执行服务逻辑,可配置线程池
配置示例:
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="200"/>
线程模型选项:
-
dispatcher
:消息分发策略all
:所有消息都派发到线程池direct
:所有消息都不派发到线程池message
:只有请求消息派发到线程池execution
:只有普通请求派发到线程池connection
:在IO线程上执行连接断开事件
-
threadpool
:线程池类型fixed
:固定大小线程池cached
:缓存线程池limited
:可伸缩线程池eager
:优先创建线程
3.2 Dubbo 的序列化机制
Dubbo 支持多种序列化协议,可以通过 serialization
参数配置:
- hessian2(默认):性能较好,兼容性佳
- fastjson:文本协议,可读性好
- kryo:高性能二进制协议
- fst:比 kryo 更高效的序列化
- protobuf:跨语言,高效二进制协议
性能对比(数据来自 Dubbo 官方测试):
序列化方式 | 序列化大小 | 序列化时间 | 反序列化时间 |
---|---|---|---|
kryo | 217 | 1364 | 1157 |
fst | 217 | 1476 | 1561 |
hessian2 | 313 | 2441 | 2547 |
fastjson | 433 | 2441 | 2547 |
3.3 Dubbo 的通信协议
Dubbo 支持多种通信协议,可以通过 protocol
配置:
- dubbo(默认):基于 Netty 的二进制协议,性能最佳
- tri:Dubbo 3 新增的基于 HTTP/2 的协议,兼容 gRPC
- http:基于 HTTP 的文本协议
- rest:RESTful 风格协议
- grpc:gRPC 协议
协议选择建议:
- 内部服务调用:优先使用 dubbo 协议
- 需要跨语言或云原生环境:考虑 tri 或 grpc 协议
- 需要 RESTful 接口:使用 rest 协议
3.4 Dubbo 的异步调用
Dubbo 提供了多种异步编程方式:
3.4.1 使用 CompletableFuture
// 接口定义
public interface UserService {CompletableFuture<User> getUserAsync(Long id);
}// 调用方式
userService.getUserAsync(1L).whenComplete((user, throwable) -> {if (throwable != null) {// 处理异常} else {// 处理结果}
});
3.4.2 使用 AsyncContext
// 服务提供者
public class UserServiceImpl implements UserService {public User getUser(Long id) {AsyncContext asyncContext = RpcContext.startAsync();new Thread(() -> {asyncContext.signalContextSwitch();// 执行耗时操作User user = loadFromDatabase(id);asyncContext.write(user);}).start();return null;}
}
3.4.3 消费者端异步调用
// 配置异步
@DubboReference(async = true)
private UserService userService;// 调用方式
UserService userService = ...;
Future<User> future = RpcContext.getContext().asyncCall(() -> userService.getUser(1L));
User user = future.get();
四、Dubbo 服务治理
服务治理是 Dubbo 的核心能力之一,主要包括负载均衡、集群容错、服务降级等功能。
4.1 负载均衡策略
Dubbo 提供了丰富的负载均衡策略,可以通过 loadbalance
参数配置:
-
Random LoadBalance(默认):随机访问
- 优点:简单高效
- 缺点:可能不均匀
-
RoundRobin LoadBalance:轮询
- 优点:请求均匀分配
- 缺点:慢提供者会堆积请求
-
LeastActive LoadBalance:最少活跃调用
- 优点:使慢提供者收到更少请求
- 缺点:需要统计活跃数
-
ConsistentHash LoadBalance:一致性哈希
- 优点:相同参数总是发到同一提供者
- 缺点:节点变化时可能不均匀
配置示例:
@DubboReference(loadbalance = "leastactive")
private UserService userService;
4.2 集群容错机制
Dubbo 的集群容错机制可以通过 cluster
参数配置:
-
Failover Cluster(默认):失败自动切换
- 特点:失败后重试其他服务器
- 适用场景:读操作或幂等写操作
-
Failfast Cluster:快速失败
- 特点:失败立即报错
- 适用场景:非幂等写操作
-
Failsafe Cluster:失败安全
- 特点:失败直接忽略
- 适用场景:写入日志等不关键操作
-
Failback Cluster:失败自动恢复
- 特点:失败后定时重发
- 适用场景:消息通知等
-
Forking Cluster:并行调用
- 特点:同时调用多个服务器,只要一个成功即返回
- 适用场景:实时性要求高的读操作
-
Broadcast Cluster:广播调用
- 特点:广播调用所有提供者,任意一台报错则报错
- 适用场景:通知所有提供者更新缓存或日志等
配置示例:
@DubboReference(cluster = "failfast")
private OrderService orderService;
4.3 服务降级与熔断
Dubbo 提供了多种服务降级方式:
4.3.1 Mock 机制
@DubboReference(mock = "force:return null")
private UserService userService;// 或者实现 Mock 类
@DubboReference(mock = "com.example.UserServiceMock")
private UserService userService;public class UserServiceMock implements UserService {public User getUser(Long id) {return new User(-1L, "mock user");}
}
4.3.2 熔断策略
Dubbo 可以与 Sentinel 或 Hystrix 集成实现熔断:
<!-- 使用 Sentinel -->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-apache-dubbo-adapter</artifactId>
</dependency>
配置示例:
// 资源定义
@SentinelResource(value = "UserService:getUser", fallback = "getUserFallback")
public User getUser(Long id) {// ...
}// fallback 方法
public User getUserFallback(Long id, Throwable ex) {return new User(-1L, "fallback user");
}
4.4 动态配置中心
Dubbo 2.7+ 支持从配置中心(如 Nacos、Apollo、Zookeeper)动态获取配置:
dubbo:config-center:address: nacos://127.0.0.1:8848app-name: dubbo-demo
动态配置示例:
# 在 Nacos 中配置
configVersion: v1.0
configs:
- side: consumeraddresses: ["0.0.0.0"]parameters:timeout: 3000loadbalance: random
五、Dubbo 3 新特性
Dubbo 3 是 Dubbo 的重大升级版本,引入了许多创新特性:
5.1 应用级服务发现
传统 Dubbo 使用接口级服务发现,而 Dubbo 3 引入了应用级服务发现:
- 接口级服务发现:每个接口独立注册,消费者按接口订阅
- 应用级服务发现:整个应用注册一次,消费者订阅应用
优势:
- 注册中心压力降低 90%
- 服务发现效率提升
- 更适合 Kubernetes 等现代基础设施
配置方式:
dubbo:registry:address: nacos://127.0.0.1:8848parameters:registry-type: service
5.2 Triple 协议
Triple 是 Dubbo 3 引入的基于 HTTP/2 的协议,具有以下特点:
- 完全兼容 gRPC
- 支持 Streaming 通信
- 更好的网关穿透性
- 支持多语言生态
配置示例:
dubbo:protocols:triple:name: triport: 50051
5.3 服务网格支持
Dubbo 3 提供了对服务网格的更好支持:
- 可以运行在 Istio 等 Service Mesh 中
- 支持 xDS 协议
- 支持与 Sidecar 模式共存
5.4 统一路由规则
Dubbo 3 重构了路由规则系统:
# 条件路由示例
configVersion: v3.0
scope: application
key: demo-provider
enabled: true
configs:
- addresses: ["127.0.0.1"]side: consumerparameters:timeout: 1000
六、Dubbo 最佳实践
6.1 性能优化建议
-
序列化优化
- 使用 kryo 或 fst 序列化
- 注册需要序列化的类:
dubbo.protocol.serialization.optimizer
-
线程池调优
- 合理设置线程数:
dubbo.protocol.threads
- 使用
eager
线程池:dubbo.protocol.threadpool=eager
- 合理设置线程数:
-
网络连接优化
- 启用连接共享:
dubbo.consumer.shareconnections=true
- 合理设置连接数:
dubbo.consumer.connections
- 启用连接共享:
-
合理设置超时
- 避免过长或过短的超时时间
- 区分重要操作和非重要操作
6.2 常见问题排查
-
服务找不到问题
- 检查注册中心是否正常
- 检查服务版本和分组是否匹配
- 使用
telnet
测试服务提供者
-
调用超时问题
- 检查网络是否通畅
- 检查服务提供者性能
- 合理设置超时时间
-
序列化问题
- 检查是否所有参数都可序列化
- 检查消费者和提供者是否有相同的类
6.3 监控与运维
- 集成 Prometheus
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-metrics-prometheus</artifactId>
</dependency>
配置:
dubbo:metrics:protocol: prometheusport: 9090enable: true
- 使用 Dubbo Admin
Dubbo Admin 是官方提供的管理控制台,可以:
- 查看服务列表
- 管理配置
- 执行测试
- 查看依赖关系
七、总结
Dubbo 作为一款成熟的 RPC 框架,在阿里巴巴和众多企业的生产环境中得到了充分验证。通过本文的全面介绍,我们了解了:
- Dubbo 的核心架构和基本用法
- 高级特性和实现原理
- 服务治理的各种策略
- Dubbo 3 的创新特性
- 生产环境的最佳实践
随着云原生时代的到来,Dubbo 3 通过应用级服务发现、Triple 协议等创新,正在焕发新的活力。无论是传统的微服务架构,还是新兴的服务网格,Dubbo 都能提供优秀的解决方案。
对于开发者来说,深入理解 Dubbo 的原理和最佳实践,将有助于构建高性能、高可用的分布式系统。希望本文能成为你 Dubbo 学习之旅的有力参考。
PS:如果你在学习过程中遇到问题,别担心!欢迎在评论区留言,我会尽力帮你解决!😄
相关文章:
Dubbo 全面解析:从 RPC 核心到服务治理实践
一、分布式系统与 RPC 框架概述 在当今互联网时代,随着业务规模的不断扩大,单体架构已经无法满足高并发、高可用的需求,分布式系统架构成为主流选择。而在分布式系统中,远程服务调用(Remote Procedure Call࿰…...
JavaScript 调试入门指南
JavaScript 调试入门指南 一、调试准备阶段 1. 必备工具配置 浏览器套件:安装最新Chrome102+,开启实验性功能(地址栏输入chrome://flags/#enable-devtools-experiments)编辑器集成:VS Code安装以下扩展: JavaScript Debugger:支持浏览器与Node.js双端调试Error Lens:实…...
不能将下载行为传输到IDM
目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 安装IDM后,调用IDM下载软件显示:不能将下载行为传输到IDM,Error 0x80029C4A 二、原因分析 可能是识别浏览器插件不到,或者本地的插件版本不对导致的 三…...
spring security 认证流程分析
Spring Security 认证流程分析 Spring Security 的认证流程是一个模块化且可扩展的过程,核心围绕 过滤器链 和 认证组件 协作实现。以下是详细流程分析: 1. 请求拦截与过滤器链 • 入口:所有 HTTP 请求经过 Spring Security 的过滤器链。 •…...
Docker Compose 部署 Loki
官方文档:https://grafana.com/docs/loki/latest/setup/install/docker/ 环境准备 安装 Docker和Docker Compose 参考:https://qiangsh.blog.csdn.net/article/details/125375187 创建loki目录 mkdir -p /opt/loki/config mkdir -p /data/monitoring…...
nuxt3 seo优化
在 Nuxt3 中,通过 nuxtjs/seo、nuxtjs/sitemap 和 nuxtjs/robots 模块可以生成包含动态链接的站点地图(sitemap.xml),但具体是“实时生成”还是“部署时生成”,取决于你的配置方式和数据更新频率。以下是具体分析&…...
CentOS 8 Stream 配置在线yum源参考 —— 筑梦之路
CentOS 8 Stream ISO 文件下载地址:http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_64/CentOS-Stream-8-20240603.0-x86_64-dvd1.isoCentOS 8 Stream 网络引导ISO 文件下载地址:http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_6…...
uniapp 在app上 字体如何不跟着系统字体大小变
在UniApp开发中,默认情况下App的字体可能会跟随系统字体设置而变化。如果你希望保持固定的字体样式,不随系统字体设置改变,可以采用以下几种方法: 方法一:全局CSS设置 在App.vue的样式中添加以下CSS: /*…...
leetcode141.环形链表
直接快慢指针,如果有环,那么快指针一定会在成环的起始点与慢指针相遇 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ pu…...
【HTML5游戏开发教程】零基础入门合成大西瓜游戏实战 | JS物理引擎+Canvas动画+完整源码详解
《从咖啡杯到财务自由:一个程序员的合成之旅——当代码遇上物理引擎的匠心之作》 🌟 这是小游戏开发系列的第四篇送福利文章,感谢一路以来支持和关注这个项目的每一位朋友! 💡 文章力求严谨,但难免有疏漏之…...
【C#语言】深入理解C#多线程编程:从基础到高性能实践
文章目录 ⭐前言⭐一、多线程的本质价值🌟1、现代计算需求🌟2、C#线程演进史 ⭐二、线程实现方案对比🌟1、传统线程模型🌟2、现代任务模型(推荐)🌟3、异步编程范式 ⭐三、线程安全深度解析&…...
短信验证码安全需求设计
背景: 近期发现部分系统再短信充值频繁,发现存在恶意消耗短信额度现象,数据库表排查,发现大量非合法用户非法调用短信接口API导致额度耗尽。由于系统当初设计存在安全缺陷,故被不法分子进行利用,造成损失。…...
selenium实现自动登录项目(5)
1、163邮箱自动登录功能 遇到的问题: 1、登录页面,在定位表单时候,采用id,xpath,css selector都无法定位成功,因为id后面有个随机生成的数字(//*[id"x-URS-iframe1741925838640.6785&quo…...
多 线 程
一.基本知识 线程:线程是操作系统能够运行调度的最小单位 进程:进程是程序执行实体 多线程应用场景:拷贝、迁移大文件,加载大量的资源文件 并发:有多个指令在单个cpu上交替执行 并行:在同一时刻人&…...
C#:类型定义中使用问号(?)
在 C# 中,类型定义中的问号(?)主要用于控制类型的可空性,但具体行为因类型(值类型或引用类型)和 C# 版本而异。以下是清晰分类的说明: 一、可空值类型(T?,适用于所…...
基于飞腾FT2000+服务器主板与DeepSeek大模型的国产化AI算力探索
随着国产化处理器和AI技术的快速发展,自主可控的算力解决方案日益受到关注。国内大模型技术飞速发展,Deepseek等大模型在自然语言处理、计算机视觉等领域展现出强大的能力。面对大模型的计算需求,服务器硬件的国产化成为重要趋势。 飞腾FT20…...
知识篇 | Oracle的 TEMP表空间管理和优化
Oracle临时表空间(TEMP)是数据库中用于存储会话级临时数据的核心组件,主要用于支持需要中间结果集的操作(如排序、哈希连接)。其数据在事务结束或会话终止后自动释放,不持久化存储。 核心特点:…...
鸿蒙进行视频上传,使用 request.uploadFile方法
一.拉起选择器进行视频选择,并且创建文件名称 async getPictureFromAlbum() {// 拉起相册,选择图片let PhotoSelectOptions new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType photoAccessHelper.PhotoViewMIMETypes.VIDEO_TY…...
如何下载 Postman?快速指南!
Postman 是一款非常受欢迎的 API 测试工具。它最初是作为一个 Chrome 插件发布,后来发展成为一款独立的跨平台软件,支持 Windows、Mac、Linux 等操作系统。 Postman 怎么下载教程(2025最新版)?...
Angular由一个bug说起之十五:自定义基于Overlay的Tooltip
背景 工具提示(tooltip)是一个常见的 UI 组件,用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本,所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…...
M系mac怎么关闭sip
SIP是系统级的权限操作,我们无法直接关闭它。记录一下如何成功关闭SIP。 一. 查看自己mac的sip是否关闭,终端中输入该下命令: csrutil status 未关闭:System Integrity Protection status: enabled. 已关闭:System…...
Kafka 的延迟队列、死信队列和重试队列
总结一下实现的方法: 1、延迟队列,首先kafka是没有延迟队列的,那要实现延迟队列的话,就得使用其他方法。在发送消息的时候加上时间戳,再在时间戳上面加上延迟时间。消费的时候判断一下,有没有到达延迟时间&…...
OpenCV正确安装及环境变量配置
安装OpenCV(v4.6.0)安装Python(3.10.6)安装VS2022的C桌面开发,手动勾选Windows 10 SDK和MSVC安装CMake(3.31.6)在.npmrc配置pnpm config set auto-approve-builds true运行pnpm install 接下来是…...
分布式系统的CAP理论、事务和锁实现
分布式系统核心概念 1. CAP理论 CAP理论指出,分布式系统最多同时满足以下三项中的两项: 一致性(CC):所有节点访问同一份最新数据。可用性(AA):每个请求都能在合理时间内获得非错误…...
JBDev - Theos下一代越狱开发工具
JBDev - Theos下一代越狱开发工具 自越狱诞生以来,Theos一直是越狱开发的主流工具,大多数开发者使用Theos编译代码,再用lldb手动调试。JBDev简化了这个过程,项目地址https://github.com/lich4/JBDev 简介 JBDev用于Xcode越狱开…...
vue3自定义动态锚点列表,实现本页面锚点跳转效果
需求:当前页面存在多个模块且内容很长时,需要提供一个锚点列表,可以快速查看对应模块内容 实现步骤: 1.每个模块添加唯一id,添加锚点列表div <template><!-- 模块A --><div id"modalA">…...
华为、浪潮、华三链路聚合概述
1、华为 链路聚合可以提高链路带宽和链路冗余性。有三种类型,分别是手工链路聚合,静态lacp链路聚合,动态lacp链路聚合。 手工链路模式:也称负载分担模式,需手动指定链路,各链路之间平均分担流量。静态LAC…...
RUBY报告系统
我们常用GFP及其变体如RFP、YFP、mCherry等作为基因表达的报告蛋白——需要荧光显微镜制片观察;此外还有GUS或荧光素酶作为报告酶——需要添加底物。 RUBY报告系统则与众不同,其作用原理是:将酪氨酸转化为鲜艳的红色甜菜碱,无需使…...
HO与OH差异之Navigation三
在上一篇内容中我们介绍了HO与OH差异之Navigator,我们也了解了Navigator的基本概念和大致了解了一下他的基础用法,既然谈到差异肯定就不止这两种差异,今天就让我们来了解第三种差异NavRouter,其中在HO中我们并没有这种路由方式但是…...
PyTorch处理数据--Dataset和DataLoader
在 PyTorch 中,Dataset 和 DataLoader 是处理数据的核心工具。它们的作用是将数据高效地加载到模型中,支持批量处理、多线程加速和数据增强等功能。 一、Dataset:数据集的抽象 Dataset 是一个抽象类,用于表示数据集的接口。你…...
Linux搭建NFS服务
1.概述 Network File System的缩写,它最大的功能是可以通过网络使用挂载的方式,让不同的机器、不同的操作系统可以共享彼此的文件 2.名称 软件名 nfs-utils服务名 nfs或者nfs-server 3.端口 nfs-server tcp/2049 负责建立连接 rpcbind tcp/111 负责…...
ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程
ventoy启动服务器版iso镜像,注意看server名称,跟之前desktop版ubuntu不一样。没有gui界面。好,进入命令行界面。语言彻底没汉化了,选英文吧,别的更看不懂。 跟桌面版ubuntu类似,选择是否精简系统࿰…...
GC overhead limit exceeded---Java 虚拟机 (JVM) 在进行垃圾回收内存量非常少解决
背景: 我正在跑一个数据处理较为复杂的程序。然后调试了很多遍,出现了GC问题,如下图bug. GC overhead limit exceeded-这个bug错误通常表示 Java 虚拟机 (JVM) 在进行垃圾回收时花费了过多的时间,并且回收的内存量非常少。…...
Pytorch学习笔记(十二)Learning PyTorch - NLP from Scratch
这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 NLP from Scratch 部分。 官网链接:https://pytorch.org/tutorials/intermediate/nlp_from_scratch_index.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m 提取码: …...
学习日记0327
A cross-domain knowledge tracing model based on graph optimal transport 我们使用gnn来学习这些节点的特征。在此基础上,我们使用显式分布距离度量对齐来自两个不同域的特征向量,旨在最小化域差异,实现最大的跨域知识转移。 AEGOT-CDKT…...
Postman 下载文件指南:如何请求 Excel/PDF 文件?
在 Postman 中进行 Excel/PDF 文件的请求下载和导出,以下是简明的步骤,帮助你轻松完成任务。首先,我们将从新建接口开始,逐步引导你完成整个过程。 Postman 请求下载/导出 excel/pdf 文件教程...
【HTML】验证与调试工具
个人主页:Guiat 归属专栏:HTML CSS JavaScript 文章目录 1. HTML 验证工具概述1.1 验证的重要性1.2 常见 HTML 错误类型 2. W3C 验证服务2.1 W3C Markup Validation Service2.2 使用 W3C 验证器2.3 验证结果解读 3. 浏览器开发者工具3.1 Chrome DevTools…...
头歌实践教学平台--【数据库概论】--SQL
一、表结构与完整性约束的修改(ALTER) 1.修改表名 USE TestDb1; alter table your_table rename TO my_table; 2.添加与删除字段 #语句1:删除表orderDetail中的列orderDate alter table orderDetail drop orderDate; #语句2:添加列unitPrice alter t…...
2025.03.27【基因分析新工具】| MAST:解锁基因表达差异分析与网络构建
文章目录 1. MAST工具简介:探索生物信息分析的新利器1.1 什么是MAST工具?1.2 MAST工具的优势1.3 MAST工具的应用场景 2. MAST的安装方法:轻松入门的第一步2.1 安装R语言环境2.2 安装MAST包2.3 安装依赖库 3. MAST常用命令:掌握数据…...
JVM - 垃圾回收基本问题
通过一些问题来讨论在 JVM 中,垃圾回收的一些基本问题 为什么要有垃圾回收?Java 垃圾回收中是如何判断一个对象死亡的?请简单介绍一下刚才说到了引用计数法,引用计数法存在什么问题?刚才说到了可达性分析,…...
Python 爬虫案例
以下是一些常见的 Python 爬虫案例,涵盖了不同的应用场景和技术点: 1. 简单网页内容爬取 案例:爬取网页标题和简介 import requests from bs4 import BeautifulSoup url "https://www.runoob.com/" response requests.get(url) …...
从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.1.3分布式数据加载与并行处理(PyTorch DataLoader优化)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 3.1.3 分布式数据加载与并行处理(`PyTorch DataLoader`优化)1. 大规模数据加载的挑战与瓶颈分析1.1 数据加载流程的时间分解2. PyTorch DataLoader的深度优化策略2.1 核心参数调优2.2 分布式数据分片策…...
2025年- G31-Lc105-102. 二叉树层次遍历--java版
1.题目描述 2.思路 思路一: 使用 队列 Queue 来存储当前层的所有节点。关键点在于 levelSize queue.size() 这一行,它决定了当前层的节点数量。 3.代码实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* Tr…...
Redis 和 MySQL双写一致性的更新策略有哪些?常见面试题深度解答。
目录 一. 业务数据查询,更新顺序简要分析 二. 更新数据库、查询数据库、更新缓存、查询缓存耗时对比 2.1 更新数据库(最慢) 2.2 查询数据库(较慢) 2.3 更新缓存(次快) 2.4 查询缓存&#…...
【DFS】羌笛何须怨杨柳,春风不度玉门关 - 4. 二叉树中的深搜
本篇博客给大家带来的是二叉树深度优先搜索的解法技巧,在后面的文章中题目会涉及到回溯和剪枝,遇到了一并讲清楚. 🐎文章专栏: DFS 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的…...
【Exception】MybatisPlusException: can not find lambda cache for this entity
文章目录 环境 | Environment复现步骤 | Reproduction steps报错日志 | Error log源码 | Source CodeUserServiceImpl.javaAddressServiceImpl.javaAbstractSubTableBaseServiceImpl.javaUserEntity.javaAddressEntity.javaSubTableBaseEntity.java 原因分析 | Analysis解决方案…...
Spring Security 全面指南:从基础到高级实践
一、Spring Security 概述与核心概念 1.1 Spring Security 简介 Spring Security 是 Spring 生态系统中的安全框架,为基于 Java 的企业应用提供全面的安全服务。它起源于 2003 年的 Acegi Security 项目,2008 年正式成为 Spring 官方子项目,…...
IP组播 C++简单应用
引言 在当今的网络世界中,数据的传输效率和带宽的合理利用是至关重要的。传统的单播和广播通信方式在某些场景下存在着局限性,而IP组播技术的出现为解决这些问题提供了一种有效的方案。本文将详细介绍IP组播的概念、工作原理、应用场景,并通…...
CentOS 7安装 mysql
CentOS 7安装 mysql 1. yum 安装 mysql 配置mysql源 yum -y install mysql57-community-release-el7-10.noarch.rpm安装MySQL服务器 yum -y install mysql-community-server启动MySQL systemctl start mysqld.service查看MySQL运行状态,运行状态如图ÿ…...
“十五五”时期航空弹药发展环境分析
1.“十五五”时期航空弹药发展环境分析 (标题:小二号宋体居中) 一、建言背景介绍 (一级标题:黑体三号,首行空两格) 航空弹药作为现代战争的核心装备,其发展水平直接关乎…...