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

ABP vNext + gRPC 实现服务间高速通信

ABP vNext + gRPC 实现服务间高速通信 💨

在现代微服务架构中,服务之间频繁的调用往往对性能构成挑战。尤其在电商秒杀、金融风控、实时监控等对响应延迟敏感的场景中,传统 REST API 面临序列化负担重、数据体积大、通信延迟高等瓶颈。

本文将演示如何基于 ABP vNext + gRPC 实现高性能服务通信,包括 🗂️ Proto 文件组织、🔧 实现 gRPC Service 类、🤖 自动生成代理、⚙️ DI 注入、🔒 TLS 加密、🕵️ Reflection 调试、🚦 限流与熔断、📊 可观察性 等内容,助你构建稳定且快速的服务间调用体系。

一、背景介绍 📝

在“电商限时秒杀”、“订单链路跟踪”或“实时监控”等高并发场景下,传统 REST 通信方式由于 JSON 序列化体积大、缺乏双向流、无法持久连接等问题,导致响应延迟高、调用不稳定。下面先来看看为什么要在这些场景下使用 gRPC。

gRPC 基于 Protobuf 二进制协议、支持 HTTP/2 长连接、双向流和强类型校验,是替代 REST 的理想选择。

二、gRPC 与 REST 的性能对比 ⚖️

指标REST API (JSON) 🗒️gRPC (Protobuf) 🚀
序列化格式JSON(文本)二进制 Protobuf
数据体积较大更小
通信效率较低极高
双向流支持
延迟与吞吐量一般高性能

说明:以上对比可参考 gRPC for .NET 性能测试。

三、调试与诊断 🔍

  • gRPC Reflection:在开发环境启用 Reflection,可使用 grpcurl 或 Postman 调试服务。

    // 在服务端 ConfigureServices()
    services.AddGrpcReflection();    // 启用 Reflection 调试
    // 在 OnApplicationInitialization()
    endpoints.MapGrpcReflectionService();  // 映射 Reflection 服务
    
  • 性能监控:使用 grpc-dotnet-interceptor 插件或 OpenTelemetry 追踪调用链。

四、Proto 文件结构组织 📁

在项目根目录创建 /protos 文件夹,统一管理各模块 .proto 文件,例如:

syntax = "proto3";
option csharp_namespace = "MyApp.Inventory.Grpc";
package inventory;service InventoryService {rpc DeductStock (DeductStockRequest) returns (StockResponse);
}message DeductStockRequest {string productId = 1;   // 商品IDint32 quantity = 2;     // 数量
}message StockResponse {bool success = 1;       // 是否成功string message = 2;     // 信息
}

五、服务端配置与注册 🚀

public class InventoryGrpcModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){context.Services.AddGrpc();                              // 启用 gRPC 服务context.Services.AddGrpcReflection();                    // 启用 Reflectioncontext.Services.AddGrpcService<InventoryGrpcService>(); // 注册业务实现}public override void OnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();app.UseRouting();// 可选:健康检查、中间件、授权等app.UseEndpoints(endpoints =>{endpoints.MapGrpcService<InventoryGrpcService>();     // 映射 gRPCendpoints.MapGrpcReflectionService();                // 映射 Reflection});}
}

实现 gRPC Service 类 🛠️

public class InventoryGrpcService : InventoryService.InventoryServiceBase
{public override async Task<StockResponse> DeductStock(DeductStockRequest request, ServerCallContext context){// 参数校验if (request.Quantity <= 0){throw new RpcException(new Status(StatusCode.InvalidArgument, "数量必须大于零"));}// 业务逻辑:扣减库存bool result = await _inventoryManager.TryDeductAsync(request.ProductId, request.Quantity);if (!result){throw new RpcException(new Status(StatusCode.FailedPrecondition, "库存不足"));}// 返回结果return new StockResponse { Success = true, Message = "扣减成功" };}
}

TLS 配置示例 🔒

Program.cs 中配置 Kestrel:

webBuilder.ConfigureKestrel(options =>
{options.Listen(IPAddress.Any, 5001, listenOpts =>{listenOpts.UseHttps(httpsOpts =>{httpsOpts.ServerCertificate = // 从系统证书存储或 Key Vault 获取});});
});

六、自动生成代理类 🤖

在客户端项目的 .csproj 中添加:

<ItemGroup><Protobuf Include="..\..\protos\inventory\inventory.proto" GrpcServices="Client" />
</ItemGroup>

七、客户端注入与使用 💉

builder.Services.AddGrpcClient<InventoryService.InventoryServiceClient>(opts =>{opts.Address = new Uri("https://localhost:5001");  // 服务地址}).ConfigureChannel(options =>{options.Credentials = new SslCredentials();          // SslCredentialsoptions.MaxReceiveMessageSize = 2 * 1024 * 1024;      // 最大消息大小options.KeepAliveTime = TimeSpan.FromSeconds(30);     // 心跳间隔}).ConfigurePrimaryHttpMessageHandler(() =>{var handler = new HttpClientHandler();handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; // ⚠️ 开发环境使用return handler;}).AddPolicyHandler(Policy.Handle<RpcException>().WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(200)) // 🔄 重试策略);

八、性能与安全优化建议 📈🔐

  • 消息体大小限制:通过 MaxSendMessageSize / MaxReceiveMessageSize 限制数据量,防止 OOM。

  • Deadline 与超时

    var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2)); // 2秒超时
    await client.DeductStockAsync(request, cancellationToken: cts.Token);
    
  • 熔断与重试:在客户端使用 Polly 实现重试和断路器策略。

  • 可观察性:集成 OpenTelemetry:

    services.AddOpenTelemetryTracing(b =>b.AddGrpcClientInstrumentation()        // 客户端追踪.AddAspNetCoreInstrumentation()       // 服务端追踪.AddJaegerExporter()                  // 导出到 Jaeger
    );
    

    在 Jaeger/Zipkin UI 中查看调用链,在 Prometheus + Grafana 中统计 QPS、错误率。

九、订单服务调用库存服务流程 🌐

用户 Order 服务(REST 接口) OrderAppService Inventory gRPC 客户端 Inventory 服务端 发起下单请求 ApplicationService 接口调用 gRPC 调用 DeductStock() 扣减库存(gRPC) 返回库存扣减结果 结果封装 返回下单结果 响应下单状态 用户 Order 服务(REST 接口) OrderAppService Inventory gRPC 客户端 Inventory 服务端

十、参考资料 📚

  • ABP vNext gRPC 支持(官方文档)
  • gRPC for .NET(官方)
  • Grpc.Tools NuGet 包
  • OpenTelemetry for .NET
  • grpcurl 调试工具

相关文章:

ABP vNext + gRPC 实现服务间高速通信

ABP vNext gRPC 实现服务间高速通信 &#x1f4a8; 在现代微服务架构中&#xff0c;服务之间频繁的调用往往对性能构成挑战。尤其在电商秒杀、金融风控、实时监控等对响应延迟敏感的场景中&#xff0c;传统 REST API 面临序列化负担重、数据体积大、通信延迟高等瓶颈。 本文…...

【JAVA】十三、基础知识“接口”精细讲解!(三)(新手友好版~)

目录 1. Object类 1.1 Object的概念 1.2 Object例子 2. toString 2.1 toString的概念 2.2 为什么要重写toString 2.3 如何重写toString 3. 对象比较equals方法 3.1 equals( ) 方法的概念 3.2 Object类中的默认equals实现 3.3 如何正确重写equals方法 4. hashCode方…...

每周靶点分享:Angptl3、IgE、ADAM9及文献分享:抗体的多样性和特异性以及结构的新见解

本期精选了《脂质代谢的关键调控者Angptl3》《T细胞活化抑制因子VISTA靶点》《文献分享&#xff1a;双特异性抗体重轻链配对设计》三篇文章。以下为各研究内容的概述&#xff1a; 1. 脂质代谢的关键调控者Angptl3 血管生成素相关蛋白3&#xff08;Angptl3&#xff09;是血管生…...

网络协议之DHCP和PXE分析

写在前面 本文看下DHCP和PXE相关内容。 1&#xff1a;正文 不知道你自己手动配置过IP地址没有&#xff0c;在Linux的环境中可以通过如下的命令们来进行配置&#xff1a; $ sudo ifconfig eth1 10.0.0.1/24 $ sudo ifconfig eth1 up以及&#xff1a;$ sudo ip addr add 10.0…...

SSH 服务部署指南

本指南涵盖 OpenSSH 服务端的安装、配置密码/公钥/多因素认证&#xff0c;以及连接测试方法。 适用系统&#xff1a;Ubuntu/Debian、CentOS/RHEL 等主流 Linux 发行版。 1. 安装 SSH 服务端 Ubuntu/Debian # 更新软件包索引 sudo apt update# 安装 OpenSSH 服务端 sudo apt i…...

表达式求值(算法题)

#include <bits/stdc.h> // 引入常用头文件 using namespace std;stack<int> num; // 存储操作数的栈 stack<char> op; // 存储运算符的栈/* 执行一次运算操作&#xff1a;1. 从num栈弹出两个操作数(n2先弹出&#xff0c;作为右操作数)2. 从op栈弹出运算符…...

IO流--13--MultipartFile

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 MultipartFile1. 概述2. 常用方法解析2.1 getName方法2.2 getOriginalFileName方法2.3 getContentType方法2.4 isEmpty方法2.5 getSize方法2.6 getBytes方法2.7 get…...

leetcode 242. Valid Anagram

题目描述 因为s和t仅仅包含小写字母&#xff0c;所以可以开一个26个元素的数组用来做哈希表。不过如果是unicode字符&#xff0c;那就用编程语言自带的哈希表。 class Solution { public:bool isAnagram(string s, string t) {int n s.size();if(s.size() ! t.size())return …...

内核态函数strlcpy及strscpy以及用户态函数strncpy

一、背景 编写C程序时有一类看似简单实则经常暗藏漏洞的问题就是字符串的处理。对于字符串的处理&#xff0c;常用的函数如strcpy&#xff0c;sprintf&#xff0c;strcat等&#xff0c;这些函数的区别无外乎就是处理\0结尾相关的逻辑。字符串的长度有时候并不能很好确定&#…...

Matlab 车辆四自由度垂向模型平稳性

1、内容简介 Matlab221-车辆四自由度垂向模型平稳性 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略基于Simulink的汽车平顺性仿真_1_杜充 基于Simulink的汽车平顺性仿真分析_谢俊淋...

【hadoop】Sqoop数据迁移工具的安装部署

一、Sqoop安装与配置 步骤&#xff1a; 1、使用XFTP将Sqoop安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz发送到master机器的主目录。 2、解压安装包&#xff1a; tar -zxvf ~/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 3、修改文件夹的名字&#xff0c;将其改为s…...

只出现一次的数字(暴力、哈希查重、异或运算)

目录 一.题目 题目解析 题目链接 二.解题过程 俗手&#xff08;暴力&#xff1a;数组模拟哈希表&#xff09; 思路 代码示例 提交情况 本手&#xff1a;哈希查重 思路 代码示例 提交情况 妙手&#xff1a;异或运算 思路 代码示例 提交情况 作者的个人gitee 作者…...

Spark缓存

生活中缓存容量受成本和体积限制&#xff08;比如 CPU 缓存只有几 MB 到几十 MB&#xff09;&#xff0c;但会通过算法&#xff08;如 “最近最少使用” 原则&#xff09;智能决定存什么&#xff0c;确保存的是 “最可能被用到的数据”。 1. 为什么需要缓存&#xff1f; 惰性执…...

linux中的常用命令(一)

目录 常用的快捷键 1- tab键:命令或者路径提示及补全&#xff1b; 2-ctrlc:放弃当前输入&#xff0c;终止当前任务或程序 3-ctrll;清屏 4-ctrlinsert:复制 5-鼠标右键:粘贴&#xff1b; 6-altc:断开连接/ctrlshift r 重新连接 7-alt1/2/3/等&#xff1a;切换回话窗口 8-上下键…...

Lua学习笔记

文章目录 前言1. Lua的数据类型2. Lua的控制结构2.1 循环2.1.1 for2.1.1.1 数值循环2.1.1.2 迭代循环2.1.2 while2.1.3 repeat-until 2.2 条件语句2.3 函数 3. Lua中的变量作用域 前言 Lua是一种轻量级的、高效的、可扩展的脚本语言&#xff0c;由巴西里约热内卢天主教大学&am…...

5月8日星期四今日早报简报微语报早读

5月8日星期四&#xff0c;农历四月十一&#xff0c;早报#微语早读。 1、外交部回应中美经贸高层会谈&#xff1a;这次会谈是应美方请求举行的&#xff1b; 2、河南许昌官方&#xff1a;胖东来联合京东物流打造的供应链产业基地将于今年投入运营&#xff1b; 3、我国外汇储备…...

P2415 集合求和 详解

此题我认为主要考数学逻辑&#xff0c;这个题目考的是你面对代码时&#xff0c;是否会从中去找规律推导一个数学公式。 先看题目: 此题目与集合有关&#xff0c;所以对于数学基础不好的同学&#xff0c;我会先给你讲一下这个集合的相关知识。 一&#xff0c;首先&#xff0c;…...

#define ccw (0)和#define ccw 0什么区别

目录 区别 一般建议 简单总结 #define ccw (0) 和 #define ccw 0 这两者在大多数情况下的功能非常相似&#xff0c;但在细节上有一些区别&#xff0c;主要涉及宏展开时的行为。 区别 #define ccw (0)&#xff1a;宏定义的内容是&#xff08;0&#xff09;&#xff0c;带括…...

跨平台移动开发框架React Native和Flutter性能对比

背景与架构 React Native 和 Flutter 都是跨平台移动开发框架&#xff0c;但它们的性能表现因架构差异而异。React Native 在 2025 年采用了 Bridgeless New Architecture&#xff08;版本 0.74&#xff09;&#xff0c;使用 JavaScript Interface (JSI) 替代传统的 JavaScrip…...

【PhysUnits】2 SI 量纲 实现解析(prefix.rs)

源码 这是一个编译时量纲检查的物理单位库。 //! Physical Units Library with Type-Level Dimension Checking //! 带类型级量纲检查的物理单位库 //! //! This module provides type-safe physical unit representations using Rusts type system //! to enforce dimension…...

新能源汽车赛道变局:传统车企子品牌私有化背后的战略逻辑

2025年5月&#xff0c;一则资本市场动态引发行业震动&#xff1a;某国内头部传统车企宣布拟以每股2.57美元的价格私有化旗下高端新能源品牌&#xff0c;若交易完成&#xff0c;该新能源品牌将正式从纽交所退市。这一决策发生在全球新能源汽车行业经历剧烈洗牌、资本市场估值逻辑…...

[matlab]private和+等特殊目录在新版本matlab中不允许添加搜索路径解决方法

当我们目录包含有private,或者时候matlab搜索目录不让添加&#xff0c;比如截图&#xff1a; 在matlab2018以前这些都可以加进去后面版本都不行了。但是有时候我们必须要加进去才能兼容旧版本matlab库&#xff0c;比如mexopencv库就是这种情况。因此我们必须找到一个办法加进去…...

ImportError: cannot import name ‘Optional‘ from ‘pydantic‘

概览 再使用Optional定义fastapi可选参数时&#xff0c;出现了错误&#xff1a; ImportError: cannot import name Optional from pydantic python version: 3.8 pydantic version: 2.9.2 快速解决方案 Optional导入修改为typing包&#xff0c;如下 from typing import List…...

“水木精灵” 王泫梓妍时尚造型引关注

“水木精灵” 王泫梓妍一组时尚照片曝光&#xff0c;再次展现其独特时尚品味与青春活力。 照片中&#xff0c;王泫梓妍身着白色针织开衫搭配深蓝色牛仔短裙&#xff0c;开衫上精致的水钻装饰与深蓝色海军领增添了细节亮点&#xff0c;牛仔短裙的金色纽扣设计别致&#xff0c;整…...

数据结构-堆排序

1.定义 -堆中每个节点的值都必须大于等于&#xff08;或小于等于&#xff09;其左右子节点的值。如果每个节点的值都大于等于其子节点的值&#xff0c;这样的堆称为大根堆&#xff08;大顶堆&#xff09;&#xff1b;如果每个节点的值都小于等于其子节点的值&#xff0c;称为…...

影响服务器性能的主要因素是什么

在这个数字化高速发展的时代&#xff0c;服务器就像是幕后的超级英雄&#xff0c;默默支撑着我们丰富多彩的网络世界。首先&#xff0c;硬件配置堪称服务器性能的基石。就好比一辆跑车&#xff0c;强大的引擎&#xff08;CPU&#xff09;、宽敞的跑道&#xff08;内存&#xff…...

为什么 MySQL 用 B+ 树作为数据的索引,以及在 InnoDB 中数据库如何通过 B+ 树索引来存储数据以及查找数据

http://www.liuzk.com/410.html 索引是一种数据结构&#xff0c;用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量&#xff0c;数据量大了索引才显得有意义&#xff0c;如果我想要在 [1,2,3,4] 中找到 4 这个数据&am…...

若依框架Ruoyi-vue整合图表Echarts中国地图标注动态数据

若依框架Ruoyi-vue整合图表Echarts中国地图 概述创作灵感预期效果整合教程前期准备整合若依框架1、引入china.json2、方法3、data演示数据4、核心代码 完整代码[毫无保留]组件调用 总结 概述 首先&#xff0c;我需要回忆之前给出的回答&#xff0c;确保这次的内容不重复&#…...

可撤销并查集,原理分析,题目练习

零、写在前面 可撤销并查集代码相对简单&#xff0c;但是使用场景往往比较复杂&#xff0c;经常用于处理离线查询&#xff0c;比较经典的应用是结合线段树分治维护动态连通性问题。在一些较为综合的图论问题中也经常出现。 前置知识&#xff1a;并查集&#xff0c;扩展域并查…...

中介者模式(Mediator Pattern)详解

文章目录 1. 中介者模式概述1.1 定义1.2 基本思想2. 中介者模式的结构3. 中介者模式的UML类图4. 中介者模式的工作原理5. Java实现示例5.1 基本实现示例5.2 飞机空中交通控制示例5.3 GUI应用中的中介者模式6. 中介者模式的优缺点6.1 优点6.2 缺点7. 中介者模式的适用场景8. 中介…...

Java网络编程:深入剖析UDP数据报的奥秘与实践

在浩瀚的计算机网络世界中,数据传输协议扮演着至关重要的角色。其中,用户数据报协议(UDP,User Datagram Protocol)以其独特的“轻量级”和“无连接”特性,在众多应用场景中占据了一席之地。与更为人熟知的传输控制协议(TCP,Transmission Control Protocol)相比,UDP提…...

17.thinkphp的分页功能

一&#xff0e;分页功能 1.不管是数据库操作还是模型操作&#xff0c;都使用paginate()方法来实现(第一种方式)&#xff1b; //查找user表所有数据&#xff0c;每页显示5条 returnView::fetch(index, [list > User::paginate(5)]); 页数&#xff1a; 2.创建一个静态模版页面…...

Pandas比MySQL快?

知乎上有人问&#xff0c;处理百万级数据&#xff0c;Python列表、Pandas、Mysql哪个更快&#xff1f; Pands是Python中非常流行的数据处理库&#xff0c;拥有大量用户&#xff0c;所以拿它和Mysql对比也是情理之中。 实测来看&#xff0c;MySQL > Pandas > Python列表…...

问题 | 低空经济未来发展前景机遇及挑战

低空经济 **一、发展前景与机遇**1. **政策红利加速释放&#xff0c;顶层设计逐步完善**2. **技术突破驱动商业化落地**3. **应用场景多元化拓展**4. **万亿级市场潜力** **二、主要挑战**1. **空域管理与安全监管难题**2. **技术瓶颈与产业链短板**3. **法规与标准体系待完善*…...

Matlab 分数阶PID控制

1、内容简介 Matlab218-分数阶PID控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

如何对 Oracle 日志文件进行校验

目录 一、基本概述 二、基础知识 1、工具介绍 (1)BBED (2)dump 2、数据解析 (1)BLOCK 0 (2)BLOCK 1 (3)Block n( >=2 ) (4)redo record header (5)redo change 1)redo change header 2)redo change length list (6)Example 三、参考代码…...

从零开始用 AI 编写一个复杂项目的实践方法论

从零开始用 AI 编写一个复杂项目的实践方法论 这篇文章我用ai润色了一下&#xff0c;但是初稿是完全由我个人整理的逻辑思路&#xff0c;不是完全由ai生成的。其中内容也确实是我在实践中遇到问题、解决问题、总结出来的经验。 在从零开发一个复杂项目时&#xff0c;直接把目标…...

k8s监控方案实践(一):部署Prometheus与Node Exporter

k8s监控方案实践&#xff08;一&#xff09;&#xff1a;部署Prometheus与Node Exporter 文章目录 k8s监控方案实践&#xff08;一&#xff09;&#xff1a;部署Prometheus与Node Exporter一、Prometheus简介二、PrometheusNode Exporter实战部署1. 创建Namespace&#xff08;p…...

2.5 特征值与特征向量

本章围绕特征值、特征向量及其应用展开&#xff0c;是线性代数的核心章节之一。以下从四个核心考点系统梳理知识体系&#xff1a; 考点一&#xff1a;矩阵的特征值与特征向量 1. 计算方法 具体矩阵&#xff1a; 解特征方程 ∣ λ E − A ∣ 0 |\lambda E - A| 0 ∣λE−A∣…...

从简历筛选到面试管理:开发一站式智能招聘系统源码详解

当下&#xff0c;如何打造一款高效、精准的一站式智能招聘系统&#xff0c;成为了很多人力资源科技公司和创业团队关注的焦点。在这篇文章中&#xff0c;将带你深入了解如何从零开始开发一款智能招聘系统源码&#xff0c;涵盖从简历筛选到面试管理的全流程。 一、招聘系统的核心…...

10.进程控制(下)

一、进程程序替换&#xff08;重点&#xff09; 在程序替换过程中&#xff0c;并没有创建新的进程&#xff0c;只是把当前进程的代码和数据用新程序的代码和数据进行覆盖式的替换。 1&#xff09;一旦程序替换成功&#xff0c;就去执行新代码了&#xff0c;后序代码不执行 2&am…...

【Python 字符串】

Python 中的字符串&#xff08;str&#xff09;是用于处理文本数据的基础类型&#xff0c;具有不可变性、丰富的内置方法和灵活的操作方式。以下是 Python 字符串的核心知识点&#xff1a; 一、基础特性 定义方式&#xff1a; s1 单引号字符串 s2 "双引号字符串" s…...

最新CDGP单选题(第四章)补充

31、 [单选] 企业数据模型主题域的识别准则必须在整个企业模型中保持一致,以下哪项是常用的主题域识别准则: A:使用规范化规则,从系统组合中分离主题域...

Cursor降智找不到文件(Cursor降智)

文章目录 明明提供了上下文&#xff0c;却找不到文件&#xff01; 明明提供了上下文&#xff0c;却找不到文件&#xff01; 解决办法&#xff0c;删除codebase index&#xff0c;最好再把那个Index new folders by default给设置为Disabled。 这样设置貌似就不会出现找不到文件…...

Python基于Django和MySQL实现突发公共卫生事件舆情分析系统(有大屏功能)

说明&#xff1a;这是一个系统实战项目&#xff08;附带代码文档安装讲解&#xff09;&#xff0c;如需代码文档安装讲解可以直接到文章最后关注获取。 系统演示如下&#xff1a; Python基于Django和MySQL实现突发公共卫生事件舆情分析系统(有大屏功能) 项目背景 随着互联网的…...

cat、more和less的区别

在 Linux 系统中&#xff0c;cat、more 和 less 都是用于查看文件内容的命令&#xff0c;但它们在功能和使用场景上有显著区别。以下是它们的详细对比&#xff1a; 1. cat 命令 功能&#xff1a; - 直接输出整个文件&#xff1a;一次性将文件内容全部显示在终端上&#xff…...

Python cv2特征检测与描述:从理论到实战

在计算机视觉领域&#xff0c;特征检测与描述是图像匹配、物体识别、SLAM等任务的核心技术。本文将结合OpenCV的cv2库&#xff0c;系统讲解特征检测与描述的原理&#xff0c;并通过Python代码演示主流算法的实现。 一、为什么需要特征检测与描述&#xff1f; 图像本质是像素矩…...

实践005-Gitlab CICD全项目整合

文章目录 环境准备环境准备集成Kubernetes Gitlab CICD项目整合项目整合整合设计 后端Java项目部署后端Java项目静态检查后端Java项目镜像构建创建Java项目部署文件创建完整流水线 前端webui项目部署前端webui项目镜像构建创建webui项目部署文件创建完整流水线 构建父子类型流水…...

为了摸鱼和吃瓜,我开发了一个网站

平时上班真的比较累&#xff0c;摸鱼和吃瓜还要跳转多个平台的话&#xff0c;就累上加累了。 所以做了一个聚合了全网主流平台热搜的网站。 目前市面上确实有很多这种网站了&#xff0c;所以目前最主要有两点和他们不同&#xff1a; 给热搜列表增加了配图&#xff0c;刷的时候…...

React -> AI组件 -> 调用Ollama模型, qwen3:1.7B非常聪明

使用 React 搭建一个现代化的聊天界面&#xff0c;支持与 Ollama 本地部署的大语言模型进行多轮对话。界面清爽、功能完整&#xff0c;支持 Markdown 渲染、代码高亮、<think> 隐藏思考标签、流式渐进反馈、暗黑模式适配等特性。 &#x1f9e9; 核心功能亮点 ✅ 模型选择…...