API 版本控制:使用 ABP vNext 實現版本化 API 系統

🚀API 版本控制:使用 ABP vNext 實現版本化 API 系統


📚 目錄

  • 🚀API 版本控制:使用 ABP vNext 實現版本化 API 系統
    • 一、背景切入 🧭
    • 二、核心配置規則 📋
      • 2.1 前置準備:NuGet 包與 `using` 📦
      • 2.2 啟用版本化服務 🔧
        • 2.1.1 版本解析流程圖 🗺?
        • 2.1.2 `RemoveVersionFromParameter` 實現 🛠?
        • 2.1.3 `ReplaceVersionWithExactValueInPath` 實現 🔄
      • 2.2 聲明支持的版本 📝
      • 2.3 客戶端代理與 Swagger 分組生成 ??
        • 2.3.1 手動執行命令
        • 2.3.2 自動生成配置
        • 2.3.3 Swagger 文檔生成流程圖 📊
    • 三、實戰演示 🎬
      • 3.1 URL Segment 模式(示例一:同類分支)🔀
      • 3.2 URL Segment 模式(示例二:拆分控制器)??
      • 3.3 QueryString 模式 🔍
      • 3.4 Header 模式 📬
      • 3.5 三種模式對比表 📋


一、背景切入 🧭

在需求快速迭代的時代,API 不再是一次性設計后一勞永逸的產物。為了保證舊版本客戶端繼續運行,同時平滑引入新功能,API 版本化(API Versioning) 就成為了一項必不可少的技術手段。🔧

ABP vNext 依托 ASP.NET Core 的版本化機制,提供了高強度可配置、完善體系化的版本控制解決方案。其底層實質是對 Microsoft.AspNetCore.Mvc.Versioning 的一層封裝,在 ABP 框架下可以一行代碼啟用版本化,同時兼容 ABP 模塊化、依賴注入等特性。本文將結合實際場景,詳細講解如何配置 ABP vNext 的 API 版本化支持,并通過實戰代碼展示各種版本讀取方式與 Swagger 分組生成。?


二、核心配置規則 📋

2.1 前置準備:NuGet 包與 using 📦

在開始配置之前,請先確保項目已經添加了以下 NuGet 包(示例版本號可根據實際情況調整)——直接在 .csproj 文件中加入下面的 <PackageReference>,或通過 dotnet add package 命令安裝:

<PackageReference Include="Volo.Abp.AspNetCore.Mvc.Versioning" Version="4.6.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />

在代碼文件頂部,需要引用以下命名空間,確保示例能夠正常編譯:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Versioning;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.Versioning;
using Volo.Abp.Modularity;
using System.Linq;

2.2 啟用版本化服務 🔧

YourProject.HttpApi.Host 項目的 YourProjectHttpApiHostModule 中,覆蓋 ConfigureServices 方法,調用 AddAbpApiVersioning 配置版本化選項。同時配置 Swagger 分組以生成多版本文檔。示例如下:

namespace YourProject.HttpApi.Host
{[DependsOn(typeof(AbpAspNetCoreMvcModule),typeof(AbpAspNetCoreMvcVersioningModule)  // 自動引入 Microsoft.AspNetCore.Mvc.Versioning)]public class YourProjectHttpApiHostModule : AbpModule{public override void ConfigureServices(ServiceConfigurationContext context){// 注冊 API 版本化服務context.Services.AddAbpApiVersioning(options =>{// 默認使用 1.0 版本options.DefaultApiVersion = new ApiVersion(1, 0);// 如果未指定版本,采用默認版本options.AssumeDefaultVersionWhenUnspecified = true;// 返回當前支持的版本信息到響應頭 (api-supported-versions)options.ReportApiVersions = true;// 支持 URL Segment、QueryString、Header 三種方式讀取版本// 順序決定優先級:先按 URL Segment,再按 QueryString,最后按 Headeroptions.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader(),           // /api/v1.0/...new QueryStringApiVersionReader("v"),       // /api/... ?v=1.0new HeaderApiVersionReader("x-api-version") // Header: x-api-version: 1.0);});// 注冊 Swagger 分組支持context.Services.AddSwaggerGen(options =>{// 為每個版本定義一個 Swagger 文檔options.SwaggerDoc("v1.0", new OpenApiInfo{Title = "Your API V1.0",Version = "v1.0"});options.SwaggerDoc("v2.0", new OpenApiInfo{Title = "Your API V2.0",Version = "v2.0"});// 按 GroupName 過濾 APIoptions.DocInclusionPredicate((docName, apiDesc) =>{// 如果沒有 ApiVersionAttribute,也不是中立版本,則不包含var hasVersionAttribute = apiDesc.CustomAttributes().OfType<ApiVersionAttribute>().Any();var isNeutral = apiDesc.CustomAttributes().OfType<ApiVersionNeutralAttribute>().Any();if (isNeutral){// 將中立版本也展示在所有文檔中return true;}if (!hasVersionAttribute){return false;}// 取得所有標注的版本號,例如 "1.0", "2.0"var versions = apiDesc.CustomAttributes().OfType<ApiVersionAttribute>().SelectMany(attr => attr.Versions).Select(v => $"v{v.ToString()}");// 只包含與當前 docName(如 "v1.0")匹配的 APIreturn versions.Contains(docName);});// 移除版本參數(避免在 Swagger UI 中顯示 {version} 占位符)options.OperationFilter<RemoveVersionFromParameter>();// 將路徑中的 {version:apiVersion} 占位符替換為具體版本號options.DocumentFilter<ReplaceVersionWithExactValueInPath>();});}}
}

說明

  1. AbpAspNetCoreMvcVersioningModule 模塊會自動引入 Microsoft.AspNetCore.Mvc.Versioning,無需額外手動添加。
  2. 若只想使用單一的版本讀取方式(如僅用 QueryString),可在 ApiVersionReader.Combine(...) 中刪除多余的 Reader。
  3. RemoveVersionFromParameterReplaceVersionWithExactValueInPath 的實現可參考下文示例或 官方文檔。

2.1.1 版本解析流程圖 🗺?
有版本號
無版本號
有參數 ?v=
無參數
有 Header
無 Header
客戶端請求
檢查 URL Segment?
使用 URL Segment 版本
檢查 QueryString?
使用 QueryString 版本
檢查 Header?
使用 Header 版本
使用默認版本 (v1.0)
進入對應版本邏輯

2.1.2 RemoveVersionFromParameter 實現 🛠?
// 移除 Swagger 中的 version 參數
public class RemoveVersionFromParameter : IOperationFilter
{public void Apply(OpenApiOperation operation, OperationFilterContext context){if (operation.Parameters == null){return;}var versionParameter = operation.Parameters.FirstOrDefault(p => p.Name.Equals("version", StringComparison.InvariantCultureIgnoreCase));if (versionParameter != null){operation.Parameters.Remove(versionParameter);}}
}

2.1.3 ReplaceVersionWithExactValueInPath 實現 🔄
// 將路徑中的 {version:apiVersion} 占位符替換為具體版本號
public class ReplaceVersionWithExactValueInPath : IDocumentFilter
{public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context){var paths = new OpenApiPaths();foreach (var (key, value) in swaggerDoc.Paths){// 將路徑中的占位符 {version} 替換為 swaggerDoc.Info.Version(例如 "v1.0")var updatedKey = key.Replace("{version}", swaggerDoc.Info.Version);paths.Add(updatedKey, value);}swaggerDoc.Paths = paths;}
}

2.2 聲明支持的版本 📝

當某個 Controller 需要同時響應多個版本時,可在類上使用 [ApiVersion] 標注,并在方法上使用 MapToApiVersion 指定具體版本。示例如下:

using Microsoft.AspNetCore.Mvc;namespace YourProject.HttpApi.Controllers
{// 同時支持 v1.0 和 v2.0[ApiVersion("1.0")][ApiVersion("2.0")][Route("api/v{version:apiVersion}/products")]public class ProductController : ControllerBase{// 僅在 v1.0 時暴露該方法[HttpGet, MapToApiVersion("1.0")]public IActionResult GetV1(){return Ok("Product from v1.0");}// 僅在 v2.0 時暴露該方法[HttpGet, MapToApiVersion("2.0")]public IActionResult GetV2(){return Ok("Product from v2.0");}}
}
  • 說明
    • 路由路徑為 /api/v{version}/products,版本號通過 URL Segment 方式傳遞(如 /api/v1.0/products/api/v2.0/products)。
    • 如果在同一個 Controller 內邏輯分支較多,可使用 MapToApiVersion 在同一個類中實現多版本映射,避免類數量過多。
    • 若想做“版本中立”(即對所有版本通用),在類上使用 [ApiVersionNeutral] 即可:
    [ApiVersionNeutral][Route("api/health")]public class HealthController : ControllerBase{[HttpGet]public IActionResult Get() => Ok("Health OK");}

2.3 客戶端代理與 Swagger 分組生成 ??

當啟用版本化后,ABP 會自動在 Swagger UI 上按版本分組暴露文檔。開發者可以通過以下幾種方式生成客戶端代理:

2.3.1 手動執行命令
   abp suite generate-proxy

該命令會根據當前已發布的 Swagger 文檔(包括多個版本)在 *.HttpApi.Client 項目中生成對應的 TypeScript/C# 代理文件,并自動分文件夾存放。📁


2.3.2 自動生成配置

如果希望每次項目啟動時自動生成,可在 YourProjectHttpApiHostModule 中添加以下配置,并確保已啟用 Swagger 生成配置(見 2.1 中的 AddSwaggerGen):

   using Volo.Abp.AspNetCore.Mvc.ApiExplorer;public override void ConfigureServices(ServiceConfigurationContext context){// ... 上述版本化和 Swagger 配置 ...Configure<AbpApiDescriptionModelOptions>(options =>{options.IsControllerModelEnabled = true;});}

注意

  • 僅在你想要每次運行項目時自動生成 TypeScript/C# 代理時配置 IsControllerModelEnabled = true。若只想手動觸發生成,可忽略此配置。
  • 為了讓 Swagger UI 正常顯示分組,需要在 AddSwaggerGen 中編寫 DocInclusionPredicateOperationFilterDocumentFilter 等邏輯,詳見 2.1。

2.3.3 Swagger 文檔生成流程圖 📊
不是
掃描 Controller 特性
是否 ApiVersionAttribute?
收集版本列表
是否 ApiVersionNeutral?
包含在所有文檔
忽略該 API
根據版本分組生成 SwaggerDoc
應用 RemoveVersionFromParameter
應用 ReplaceVersionWithExactValueInPath
輸出多版本 Swagger JSON

三、實戰演示 🎬

下面分別示范 URL SegmentQueryStringHeader 三種模式下的版本化實現方式,并給出調用示例與注意事項。💡


3.1 URL Segment 模式(示例一:同類分支)🔀

using Microsoft.AspNetCore.Mvc;namespace YourProject.HttpApi.Controllers
{// 同時支持 v1.0 和 v2.0[ApiVersion("1.0")][ApiVersion("2.0")][Route("api/v{version:apiVersion}/products")]public class ProductController : ControllerBase{// 僅在 v1.0 時暴露該方法[HttpGet, MapToApiVersion("1.0")]public IActionResult GetV1(){return Ok("Product from v1.0");}// 僅在 v2.0 時暴露該方法[HttpGet, MapToApiVersion("2.0")]public IActionResult GetV2(){return Ok("Product from v2.0");}}
}
  • 啟動項目后測試
  GET /api/v1.0/products   → 返回 "Product from v1.0" 🥇GET /api/v2.0/products   → 返回 "Product from v2.0" 🥈

注意:如果同一個 Controller 內既使用 URL Segment 又使用 QueryString,可在請求中同時帶兩種版本號,例如 /api/v1.0/products?v=2.0,框架會優先按照 UrlSegmentApiVersionReader(v1.0)解析;若想優先使用 QueryString,需將 QueryStringApiVersionReader("v") 放在 Combine 方法第一個參數位置。


3.2 URL Segment 模式(示例二:拆分控制器)??

當兩個版本邏輯差異較大,或者想將不同版本拆分到獨立類時,可編寫如下示例:

using Microsoft.AspNetCore.Mvc;namespace YourProject.HttpApi.Controllers
{// v1.0 Controller[ApiVersion("1.0")][Route("api/v{version:apiVersion}/products")]public class ProductV1Controller : ControllerBase{[HttpGet]public IActionResult Get() => Ok("Product from v1.0");}// v2.0 Controller[ApiVersion("2.0")][Route("api/v{version:apiVersion}/products")]public class ProductV2Controller : ControllerBase{[HttpGet]public IActionResult Get() => Ok("Product from v2.0");}
}
  • 測試示例
  GET /api/v1.0/products   → 返回 "Product from v1.0" 🥇GET /api/v2.0/products   → 返回 "Product from v2.0" 🥈

對比說明

  • 同類分支(見 3.1):同一個 Controller 內通過 MapToApiVersion 在方法層面區分版本,代碼復用率高,但類文件大小可能增加。
  • 拆分控制器:將各版本邏輯完全隔離到不同類,類名更能明確版本含義,便于后續維護;但若大部分邏輯相同,會導致重復代碼。🔍

3.3 QueryString 模式 🔍

如果想將版本號放在 QueryString 中,而不在路由路徑里,則需在 2.1 中對 ApiVersionReader.Combine(...) 只保留 QueryStringApiVersionReader("v") 或者把它放到第一個位置。下面示例演示只使用 QueryString:

using Microsoft.AspNetCore.Mvc;namespace YourProject.HttpApi.Controllers
{[ApiVersion("1.0")][ApiVersion("2.0")][Route("api/products")]public class ProductQueryController : ControllerBase{// 默認 v1.0[HttpGet, MapToApiVersion("1.0")]public IActionResult GetV1() => Ok("Product from v1.0");// v2.0[HttpGet, MapToApiVersion("2.0")]public IActionResult GetV2() => Ok("Product from v2.0");}
}
  • 請求示例
  GET /api/products?v=1.0   → 返回 "Product from v1.0" 🎯GET /api/products?v=2.0   → 返回 "Product from v2.0" 🎯
  • 如果客戶端既不帶 v 參數(因配置了 AssumeDefaultVersionWhenUnspecified = true),也不放在 URL 中,則會默認調用 v1.0。

注意:確保在 AddAbpApiVersioning 中的 ApiVersionReader.Combine(...) 順序中,將 new QueryStringApiVersionReader("v") 放在首位,否則若同時存在 URL、QueryString,會優先按照 URL Segment 解析。??


3.4 Header 模式 📬

Header 模式適用于不想在 URL 中顯式暴露版本號的場景。示例如下:

using Microsoft.AspNetCore.Mvc;namespace YourProject.HttpApi.Controllers
{[ApiVersion("1.0")][ApiVersion("2.0")][Route("api/products")]public class ProductHeaderController : ControllerBase{[HttpGet, MapToApiVersion("1.0")]public IActionResult GetV1() => Ok("Product from v1.0");[HttpGet, MapToApiVersion("2.0")]public IActionResult GetV2() => Ok("Product from v2.0");}
}
  • 請求示例
  GET /api/productsHeader: x-api-version: 1.0   → 返回 "Product from v1.0" 📬GET /api/productsHeader: x-api-version: 2.0   → 返回 "Product from v2.0" 📬
  • 如果既不在 URL,也不在 Header 中指定版本,則會使用默認版本(1.0)。

3.5 三種模式對比表 📋

版本傳遞方式傳遞形式優點缺點
URL Segment/api/v{version}/resource路由清晰、便于緩存、SEO 友好路徑變化需兼容舊客戶端
QueryString/api/resource?v={version}簡潔易用、易于測試URL 參數可丟失、不美觀
HeaderHeader: x-api-version: {version}版本號不暴露在 URL,更靈活;與 URL 解耦客戶端需額外設置 Header,調試不直觀

參考鏈接

  • ABP vNext 官方文檔
  • Swagger 分組示例代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82258.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android高級開發第四篇 - JNI性能優化技巧和高級調試方法

文章目錄 Android高級開發第四篇 - JNI性能優化技巧和高級調試方法引言為什么JNI性能優化如此重要&#xff1f;第一部分&#xff1a;JNI性能基礎知識JNI調用的性能開銷何時使用JNI才有意義&#xff1f; 第二部分&#xff1a;核心性能優化技巧1. 減少JNI調用頻率2. 高效的數組操…

小白的進階之路系列之十----人工智能從初步到精通pytorch綜合運用的講解第三部分

本文將介紹Autograd基礎。 PyTorch的Autograd特性是PyTorch靈活和快速構建機器學習項目的一部分。它允許在一個復雜的計算中快速而簡單地計算多個偏導數(也稱為梯度)。這個操作是基于反向傳播的神經網絡學習的核心。 autograd的強大之處在于它在運行時動態地跟蹤你的計算,…

43. 遠程分布式測試實現

43. 遠程分布式測試實現詳解 一、遠程測試環境配置 1.1 遠程WebDriver服務定義 # Chrome瀏覽器遠程服務地址 chrome_url rhttp://localhost:5143# Edge瀏覽器遠程服務地址 edge_url rhttp://localhost:9438關鍵概念&#xff1a;每個URL對應一個獨立的WebDriver服務典型配置…

Python爬蟲(40)基于Selenium與ScrapyRT構建高并發動態網頁爬蟲架構:原理、實現與性能優化

目錄 一、引言二、技術背景1. 動態頁面處理痛點2. 架構設計目標 三、核心組件詳解1. Selenium Grid集群部署2. ScrapyRT服務化改造3. 智能等待策略 四、系統架構圖五、性能優化實踐1. 資源隔離策略2. 并發控制算法3. 監控體系 六、總結與展望&#x1f308;Python爬蟲相關文章&a…

【存儲基礎】SAN存儲基礎知識

文章目錄 1. 什么是SAN存儲&#xff1f;2. SAN存儲組網架構3. SAN存儲的主要協議SCSI光纖通道&#xff08;FC&#xff09;協議iSCSIFCoENVMe-oFIB 4. SAN存儲的關鍵技術Thin Provision&#xff1a;LUN空間按需分配Tier&#xff1a;分級存儲Cache&#xff1a;緩存機制QoS&#x…

TDengine 運維——巡檢工具(定期檢查)

背景 TDengine 在運行一段時間后需要針對運行環境和 TDengine 本身的運行狀態進行定期巡檢&#xff0c;本文檔旨在說明如何使用巡檢工具對 TDengine 的運行環境進行自動化檢查。 安裝工具使用方法 工具支持通過 help 參數查看支持的語法 Usage: taosinspect [OPTIONS]Check…

DHCP應用

一、DHCP介紹 在LAN(局域網)中我們常會遇到以下的情況&#xff1a; 1.不知道如何配置IP地址及相關信息的員工&#xff0c;無法上網&#xff1b;2.IP地址配置沖突&#xff0c;無法上網&#xff1b;3.來訪用戶因不熟悉公司網絡情況無法上網&#xff1b; 以上這些情況都是日常最…

LabVIEW多按鍵自動化檢測系統

LabVIEW開發一套高精度按鍵力與行程自動化檢測系統&#xff0c;針對傳統檢測設備自動化程度低、定位誤差大等痛點&#xff0c;實現多按鍵產品的全流程自動化測試。系統集成 6 軸工業機器人、高精度傳感器及實時數據處理模塊&#xff0c;滿足汽車電子、消費電子等領域對按鍵手感…

嵌入式硬件篇---蜂鳴器

蜂鳴器是一種常用的電子發聲元件&#xff0c;主要分為有源蜂鳴器和無源蜂鳴器兩類。它們在結構、工作原理、驅動方式、應用場景等方面存在顯著差異。以下是詳細介紹&#xff1a; 一、核心定義與結構差異 1. 有源蜂鳴器 定義&#xff1a; “有源” 指內部自帶振蕩電路&#x…

600+純CSS加載動畫一鍵獲取指南

CSS-Loaders.com 完整使用指南&#xff1a;600純CSS加載動畫庫 &#x1f3af; 什么是 CSS-Loaders.com&#xff1f; CSS-Loaders.com 是一個專門提供純CSS加載動畫的資源網站&#xff0c;擁有超過600個精美的單元素加載器。這個網站的最大特色是所有動畫都只需要一個HTML元素…

國內高頻混壓PCB廠家有哪些?

一、技術領先型廠商&#xff08;聚焦材料與工藝突破&#xff09; 獵板PCB 技術亮點&#xff1a;真空層壓工藝實現FR-4與羅杰斯高頻材料&#xff08;RO4350B/RO3003&#xff09;混壓&#xff0c;阻抗公差3%&#xff0c;支持64單元/板的5G天線模塊&#xff0c;插損降低15%。 應用…

volatile,synchronized,原子操作實現原理,緩存一致性協議

文章目錄 緩存一致性協議&#xff08;MESI&#xff09;volatile1. volatile 的作用2.volatile的底層實現3,volatile 實現單例模式的雙重鎖&#xff08;面手寫&#xff09; synchronized1,基本用法2,可重入性3,Java對象頭4,實現原理&#xff08;1&#xff09;代碼塊同步的實現&a…

webfuture:如何屏蔽后臺發文界面的保存為新文章按鈕?

問題描述&#xff1a; 如何屏蔽后臺發文界面的保存為新文章按鈕&#xff1f; 問題解決&#xff1a;修改這個文件 /Admin/Content/Base/css/base.css 定義這個的id saveAsNewItemSubmit #saveAsNewItemSubmit{display: none;}

SpringBoot集成第三方jar的完整指南

原文地址&#xff1a;https://blog.csdn.net/weixin_43826336/article/details/141640152?ops_request_misc%257B%2522request%255Fid%2522%253A%25227d4118ef2d572ba4428caf83f1d2bb28%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id7d4118…

題目 3293: 藍橋杯2024年第十五屆決賽真題-數位翻轉

題目 3293: 藍橋杯2024年第十五屆決賽真題-數位翻轉 時間限制: 2s 內存限制: 192MB 提交: 1046 解決: 318 題目描述 小明創造了一個函數 f(x) 用來翻轉 x 的二進制的數位&#xff08;無前導 0&#xff09;。比如f(11) 13&#xff0c;因為 11 (1011)2&#xff0c;將其左右翻轉…

word為跨頁表格新加表頭和表名

問題&#xff1a; 當表格過長需要跨頁時&#xff08;如下圖所示&#xff09;&#xff0c;某些格式要求需要轉頁接排加續表。 方法一&#xff1a; 1、選中表格&#xff0c;在“表布局”區域點開“自動調整”&#xff0c;選擇“固定列寬”&#xff08;防止后續拆分表格后表格變…

Ubuntu上進行VS Code的配置

1. 安裝VS code sudo snap install code --classic 2. 安裝GCC sudo apt install build-essential 3. 安裝VS Code中文包 打開 VS Code 點擊左側活動欄中的擴展圖標(或按Ctrl+Shift+X) 在搜索框中輸入:Chinese (Simplified) 選擇由 Microsoft 提供的 中文(簡體)語言包…

vr中風--數據處理模型搭建與訓練2

位置http://localhost:8888/notebooks/Untitled1-Copy1.ipynb # -*- coding: utf-8 -*- """ MUSED-I康復評估系統&#xff08;增強版&#xff09; 包含&#xff1a;多通道sEMG數據增強、混合模型架構、標準化處理 """ import numpy as np impor…

【LLM vs Agent】從語言模型到智能體,人工智能邁出的關鍵一步

目錄 一、什么是 LLM&#xff1f;語言的天才&#xff0c;思維的起點 ? 特點小結&#xff1a; 二、什么是 Agent&#xff1f;智能的執行者&#xff0c;自主的決策者 ? 特點小結&#xff1a; 三、LLM 與 Agent 的關系&#xff1a;是工具&#xff0c;更是大腦 四、案例實戰…

安裝DockerDocker-Compose

Docker 1、換掉關鍵文件 vim /etc/yum.repos.d/CentOS-Base.repo ▽ [base] nameCentOS-$releasever - Base - Mirrors Aliyun baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck1 enabled1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-C…