【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望

【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望

#微服務實戰 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事務 #Seata #ServiceMesh #總結 #SpringCloud #SpringBoot

系列終章:經過前九篇 [【深度 Mape 系列】] 的系統學習,我們已經逐一探索并實戰了 Spring Boot 的基礎構建能力,以及 Spring Cloud 微服務生態中的核心組件:Nacos(服務發現與配置)、OpenFeign(服務調用)、Spring Cloud Gateway(API 網關)、Sentinel(服務容錯)、Spring Cloud Stream(異步消息)和 Sleuth/Zipkin(鏈路追蹤)。現在,是時候將這些珍珠串聯起來,審視一個完整的微服務體系是如何協同工作的了。本文作為系列的收官之作,將進行體系整合的回顧,探討微服務架構常見的部署運維方案(Docker 與 Kubernetes)、關鍵的安全性考量、棘手的分布式事務問題,并簡要介紹服務網格 (Service Mesh) 等進階概念,最后對整個 Spring Boot 與 Spring Cloud 技術棧進行總結與展望。

摘要:構建健壯、可擴展的微服務系統,不僅需要掌握各個獨立組件,更要理解它們如何組合、部署、運維和保護。本文將回顧 Spring Cloud 核心組件如何協同工作,構建一個完整的微服務解決方案。我們將重點討論使用 Docker 進行容器化以及 Kubernetes 進行編排的現代化部署策略。同時,還會探討微服務安全(認證授權)、分布式事務處理(如 Seata)以及服務網格(如 Istio)等進階主題。最終,我們將對 Spring Boot 與 Spring Cloud 技術生態進行總結,并展望其未來發展方向,為你的微服務之旅畫上一個階段性的句點,并開啟新的探索篇章。


本文目標

  • 回顧并理解 Spring Cloud 核心組件如何協同工作,構建一個完整的微服務系統。
  • 掌握使用 Docker 對 Spring Boot 應用進行容器化的基本方法(Dockerfile)。
  • 了解使用 Kubernetes (K8s) 進行容器編排的基本概念及其在微服務部署中的價值。
  • 認識微服務安全的關鍵挑戰,了解 OAuth2/JWT 結合 API 網關的常見認證授權方案。
  • 理解分布式事務問題的復雜性,并了解 Seata 等解決方案提供的模式概覽。
  • 了解服務網格 (Service Mesh) 的基本概念及其與 Spring Cloud 的關系。
  • 對 Spring Boot 和 Spring Cloud 技術棧進行總結,并展望未來發展。

一、 體系整合回顧:當組件協同起舞

讓我們回顧一下前幾章學習的核心組件,以及它們如何在一個典型的微服務場景中協同工作:

  1. 基礎單元 (Spring Boot - Mape 1):每個微服務(如訂單服務、用戶服務、庫存服務)都是一個獨立的 Spring Boot 應用,利用其自動配置、Starters 快速構建。
  2. 服務“戶口本” (Nacos Discovery - Mape 3):所有服務實例啟動時向 Nacos 注冊中心注冊自己的地址和元數據。
  3. “通訊錄”查詢與智能導航 (OpenFeign + LoadBalancer - Mape 4):當訂單服務需要調用用戶服務時,它使用定義好的 OpenFeign 客戶端接口。Feign 底層結合 Nacos Discovery 查找用戶服務的可用實例列表,并使用 Spring Cloud LoadBalancer 選擇一個實例進行調用,無需硬編碼 IP 地址。
  4. 系統“大門”與“保安” (Spring Cloud Gateway - Mape 5):所有來自外部客戶端(Web/App)的請求首先到達 API 網關。網關根據配置的路由規則(Predicates),將請求轉發到內部對應的微服務(如 /order-api/** 轉發到訂單服務)。網關還可以承擔統一的認證、限流(可集成 Sentinel)、日志記錄等職責。
  5. 配置“公告板” (Nacos Config - Mape 6):所有服務的配置信息(數據庫連接、第三方 Key、業務參數等)集中存儲在 Nacos 配置中心。服務啟動時拉取配置,并通過 @RefreshScope 實現配置的動態更新,無需重啟。
  6. “保險絲”與“交通管制員” (Sentinel - Mape 7):Sentinel 部署在各個服務(包括網關)中,通過配置流控規則防止服務被突發流量打垮,通過熔斷降級規則防止服務雪崩。它可以保護 Controller 端點、@SentinelResource 方法以及 OpenFeign 調用。
  7. “異步信使” (Spring Cloud Stream + MQ - Mape 8):對于非核心流程或需要解耦的場景(如下單成功后發送通知郵件),訂單服務可以將消息發送到 RabbitMQ/Kafka。通知服務作為消費者通過 Spring Cloud Stream 監聽 MQ 并處理消息,實現了異步化和削峰填谷。
  8. “偵探筆記” (Sleuth + Zipkin/SkyWalking - Mape 9):Sleuth 在整個調用鏈(包括同步 HTTP 和異步消息)中自動傳遞 Trace ID 和 Span ID,并將 Span 數據上報給 Zipkin。運維人員可以通過 Zipkin UI 查看完整的調用鏈路、分析耗時、定位故障。

這些組件并非全部必須,可以根據實際業務需求選擇性地使用和組合,共同構建了一個功能完善、具備服務治理能力的微服務架構。

二、 部署運維現代化:擁抱 Docker 與 Kubernetes

微服務拆分后,管理大量的服務實例成為新的挑戰。傳統的手動部署和虛擬機部署方式難以滿足快速迭代、彈性伸縮的需求。容器化容器編排是現代微服務部署運維的主流方案。

1. Docker 容器化:標準化交付與環境一致性

  • 核心思想:將應用及其所有依賴(運行時環境、庫、配置文件等)打包到一個輕量級、可移植的容器鏡像 (Image) 中。這個鏡像可以在任何支持 Docker 的機器上以容器 (Container) 的形式運行,保證了開發、測試、生產環境的一致性。

  • Dockerfile: 定義了如何構建 Docker 鏡像的指令文件。一個典型的 Spring Boot 應用的 Dockerfile 可能如下:

    # 使用一個包含 JDK 的基礎鏡像
    FROM openjdk:11-jre-slim# 設置工作目錄
    WORKDIR /app# 將構建好的 Spring Boot Fat JAR 復制到容器中
    # (假設 target 目錄下有名為 my-service.jar 的文件)
    COPY target/my-service.jar my-service.jar# 暴露應用監聽的端口 (如果需要從外部訪問)
    EXPOSE 8080# 容器啟動時執行的命令
    ENTRYPOINT ["java", "-jar", "my-service.jar"]# (可選) 可以在這里傳遞 JVM 參數或 Spring Boot 參數
    # ENTRYPOINT ["java", "-Xmx512m", "-jar", "my-service.jar", "--spring.profiles.active=prod"]
    
  • 構建與運行

    # 在項目根目錄 (Dockerfile 所在目錄) 構建鏡像
    docker build -t my-app/my-service:latest .# 運行容器
    docker run -d -p 8080:8080 --name my-service-instance my-app/my-service:latest
    
  • 優勢:快速部署、環境隔離、資源利用率高、易于版本控制和回滾。

2. Kubernetes (K8s) 容器編排:自動化管理大規模容器

當容器數量增多時,手動管理容器的部署、擴展、縮容、網絡、存儲、服務發現、健康檢查等變得極其復雜。Kubernetes 是目前最流行的開源容器編排平臺,它提供了一整套自動化管理容器化應用的能力。

  • 核心概念 (簡化)
    • Pod: K8s 中最小的部署單元,通常包含一個或多個緊密關聯的容器(如應用容器和日志收集 Sidecar)。Pod 內的容器共享網絡和存儲卷。
    • Deployment: 定義了期望的應用狀態(如運行多少個 Pod 副本),并負責自動創建、更新、回滾 Pod。
    • Service: 為一組 Pod 提供一個穩定的訪問入口(虛擬 IP 和 DNS 名稱),并實現負載均衡。解決了 Pod IP 動態變化的問題。
    • Ingress: (可選) 管理對集群內部 Service 的外部訪問,通常提供 HTTP/S 路由、負載均衡、SSL 終止等功能,類似集群級別的 API 網關。
    • ConfigMap / Secret: 用于管理應用的配置信息和敏感數據(如密碼、API Key),可以掛載到 Pod 中。
    • Namespace: 用于在 K8s 集群內部隔離資源(類似 Nacos Namespace)。
  • 價值
    • 自動化部署與回滾
    • 服務發現與負載均衡 (K8s Service)。
    • 自動彈性伸縮 (Horizontal Pod Autoscaler)。
    • 自愈能力 (自動重啟失敗的容器)。
    • 配置與密鑰管理
    • 存儲編排
  • Spring Cloud Kubernetes: Spring Cloud 提供了 spring-cloud-starter-kubernetes-all (或單獨的 kubernetes-discovery, kubernetes-config 等) 模塊,使得 Spring Cloud 應用能夠原生集成 K8s
    • 可以使用 K8s Service 進行服務發現 (替代 Nacos Discovery)。
    • 可以從 K8s ConfigMap/Secret 加載配置 (替代 Nacos Config)。
    • 可以利用 K8s 的健康檢查機制。
      這意味著在 K8s 環境下,你可以選擇性地減少對外部 Nacos 等組件的依賴,利用 K8s 自身的能力。

三、 安全性考量:守衛微服務邊界與內部調用

微服務架構將安全邊界從單體的外圍擴展到了每個服務。安全問題變得更加復雜。

  • 認證 (Authentication):確認請求者的身份。
  • 授權 (Authorization):判斷已認證的請求者是否有權限執行某個操作。

常見方案:

  1. API 網關統一處理:這是最常見的模式。
    • 外部請求認證:客戶端(Web/App)通常使用 OAuth 2.0 / OpenID Connect (OIDC) 協議與認證服務器 (Authorization Server) (如 Keycloak, Spring Authorization Server, Okta 等) 交互獲取 Access Token (通常是 JWT - JSON Web Token)。
    • 客戶端攜帶 Token 訪問 API 網關。
    • API 網關負責校驗 Token 的有效性(簽名、過期時間等),并可能從中提取用戶信息(如用戶 ID、角色)。
    • 網關可以將認證通過的用戶信息(或部分信息)注入到轉發給下游微服務的請求頭中。
    • 可以使用 Spring Security 及其 OAuth2/Resource Server 支持來輕松實現網關的 Token 校驗。
  2. 內部服務間認證/授權
    • 零信任 (Zero Trust):即使是內部服務間的調用,也應該進行認證和授權。
    • 方案一:透傳 Token:網關校驗過的 Token 可以被透傳到下游服務,下游服務再進行細粒度的權限校驗。
    • 方案二:服務間 Token (Client Credentials Flow):服務 A 調用服務 B 時,服務 A 可以使用 OAuth2 的 Client Credentials Flow 向認證服務器申請一個代表自身的 Token,服務 B 校驗這個 Token 來確認調用者身份。
    • mTLS (Mutual TLS):使用雙向 TLS 證書認證,在網絡層面保證服務間通信安全(Service Mesh 常用的方式)。
  3. 細粒度授權:下游業務服務通常需要根據業務邏輯進行更細致的權限判斷(如用戶是否有權訪問某個特定資源)。這通常結合 Spring Security 的方法級安全 (@PreAuthorize) 或自定義邏輯實現。

安全性是一個龐大且關鍵的話題,需要根據具體場景設計合適的方案。

四、 分布式事務:跨服務數據一致性的挑戰

當一個業務操作需要跨越多個微服務修改數據時(例如,下單操作需要扣減庫存、創建訂單、增加積分),如何保證這些操作要么全部成功,要么全部失敗(原子性),以維持數據一致性?這就是分布式事務的難題。

傳統的數據庫事務(ACID)在分布式環境下難以直接應用。常見的分布式事務解決方案模式有:

  1. 兩階段提交 (2PC / XA):強一致性協議,但存在同步阻塞、單點故障、數據不一致風險,性能較差,實踐中較少使用。
  2. 補償型事務 (Saga):將長事務拆分為一系列本地事務和對應的補償操作。如果某個本地事務失敗,則依次調用前面已成功事務的補償操作來回滾。這是最終一致性方案,實現相對靈活,是目前比較主流的方式。
  3. TCC (Try-Confirm-Cancel):也是補償型事務,分為 Try(預留資源)、Confirm(確認執行)、Cancel(取消執行)三個階段。對業務代碼侵入性較強。
  4. 本地消息表 (基于可靠消息):將需要執行的下游操作記錄到本地數據庫表中(與業務操作在同一本地事務),然后通過消息隊列通知下游服務執行。下游服務處理成功后回調或發送確認消息。也是最終一致性方案。
  5. 最大努力通知:盡力通知下游服務,但不保證一定成功,允許失敗。適用于一致性要求不高的場景。

Seata (Simple Extensible Autonomous Transaction Architecture) 是阿里巴巴開源的、生產級的分布式事務解決方案。它提供了對多種模式的支持:

  • AT (Automatic Transaction) 模式:基于 2PC 思想,通過代理數據源自動生成補償 SQL,對業務無侵入(推薦)。
  • TCC 模式:需要手動實現 Try, Confirm, Cancel 接口。
  • Saga 模式:提供 Saga 狀態機引擎來編排事務。
  • XA 模式:集成標準 XA 協議。

引入 Seata 可以大大降低實現分布式事務的復雜度,但理解其原理和選擇合適的模式仍然重要。

五、 服務網格 (Service Mesh):治理能力的下沉

服務網格 (Service Mesh) 是處理服務間通信的基礎設施層。它通過在每個微服務實例旁邊部署一個輕量級的網絡代理 (Sidecar Proxy)(如 Envoy, Linkerd-proxy),將服務治理的通用能力(如服務發現、負載均衡、熔斷、限流、認證、遙測、流量控制等)從業務代碼中剝離出來,下沉到這個 Sidecar 代理中。

  • 數據平面 (Data Plane):由所有的 Sidecar 代理組成,負責實際的服務間流量轉發和策略執行。
  • 控制平面 (Control Plane):負責管理和配置所有的 Sidecar 代理(如下發路由規則、安全策略等)。常見的控制平面有 Istio, Linkerd, Consul Connect。

與 Spring Cloud 的關系:

  • 目標重疊:Service Mesh 提供的很多治理能力(服務發現、負載均衡、熔斷、網關部分功能)與 Spring Cloud 組件的功能是重疊的。
  • 實現方式不同:Spring Cloud 通過庫 (Library) 的方式將治理能力嵌入到應用代碼中(語言綁定,如 Java)。Service Mesh 通過基礎設施層 (Sidecar) 實現(語言無關)。
  • 選擇與融合
    • 對于純 Java 技術棧且團隊熟悉 Spring Cloud,繼續使用 Spring Cloud 可能是更自然的選擇。
    • 對于多語言技術棧、希望將治理能力與業務代碼徹底解耦、或希望利用 Service Mesh 更高級的流量管理和安全特性(如 mTLS)的場景,Service Mesh 是更好的選擇。
    • 也可以混合使用,例如使用 Spring Cloud 進行開發態的服務治理,部署時利用 Service Mesh 的部分能力(如 Istio 的流量管理)。

Service Mesh 是微服務治理的另一個重要發展方向,值得關注。

六、 總結與展望:持續演進的微服務之路

經過這十篇文章的探索,我們系統性地學習了基于 Spring Boot 和 Spring Cloud 構建微服務架構的核心技術體系:

  • Spring Boot 提供了快速構建、自動配置的堅實基礎。
  • Nacos 解決了服務注冊發現和分布式配置管理的核心問題。
  • OpenFeign 讓服務間同步調用變得優雅而簡單。
  • Spring Cloud Gateway 統一了系統入口,提供了強大的路由和過濾能力。
  • Sentinel 為服務提供了流量控制和熔斷降級的堅實保障。
  • Spring Cloud Stream 簡化了構建異步、消息驅動的應用。
  • Spring Cloud Sleuth + Zipkin/SkyWalking 賦予了我們洞察分布式調用鏈的能力。

同時,我們也探討了微服務的現代化部署 (Docker/K8s)安全分布式事務等關鍵的進階主題,并了解了服務網格這一新興的治理模式。

Spring Boot 和 Spring Cloud 生態依然在快速發展:

  • 響應式編程 (Reactive):Spring WebFlux, R2DBC, Reactor 等響應式技術棧在性能和資源利用率上展現出優勢,Spring Cloud 的很多組件(如 Gateway, Stream)已經原生支持或基于響應式構建。
  • 云原生集成 (Cloud Native):與 Kubernetes、Serverless、Service Mesh 等云原生技術的集成將更加深入。
  • 可觀察性 (Observability):除了 Tracing,Metrics (指標) 和 Logging (日志) 也是可觀察性的重要支柱。OpenTelemetry 標準正在統一這三者的數據模型和 API,Spring Boot/Cloud 也在積極擁抱。
  • Serverless / FaaS: Spring Cloud Function 等項目探索了在 Serverless 環境下運行 Spring 應用的可能性。
  • GraalVM Native Image: 將 Spring Boot 應用編譯成本地可執行文件,實現更快的啟動速度和更低的內存占用,是未來的一個重要趨勢。

掌握 Spring Boot 和 Spring Cloud 是通往現代 Java 后端開發和微服務架構領域的重要一步,但這僅僅是一個開始。技術的道路永無止境,保持好奇心,持續學習,動手實踐,才能在不斷變化的云原生時代乘風破浪。

感謝你跟隨《Spring Boot 與 Spring Cloud 微服務體系深度 Mape》系列走到這里!希望這個系列能為你構建堅實的知識基礎,并激發你進一步探索的熱情。

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

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

相關文章

求職筆試題

PDD 最長公共子序列 1143-最長公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二維動態規劃"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 這種寫法錯誤,m1行…

【MySQL基礎-16】MySQL DELETE語句:深入理解與應用實踐

1. DELETE語句基礎:數據刪除的藝術 在數據庫管理中,DELETE語句是維護數據完整性和清理過期信息的關鍵工具。與日常生活中的"刪除"不同,數據庫中的刪除操作需要更加謹慎和精確,因為數據一旦刪除,恢復可能非常…

python學習筆記(3)——元組

Python3 元組全面詳解 一、元組的定義與特性 基本概念 元組(Tuple)是Python中的不可變序列,用小括號()表示,元素用逗號分隔。與列表不同,元組一旦創建,元素不能修改、添加或刪除(元素本身為可變對象的情況除外)。 不可變性 ? 元組的每個元素的引用不可變,但若元素是可…

Android 中實現一個自定義的 AES 算法

版權歸作者所有,如有轉發,請注明文章出處:https://cyrus-studio.github.io/blog/ 前言 AES(Advanced Encryption Standard,高級加密標準) 是一種 對稱加密算法,用于加密和解密數據。AES 由 美國…

小河:團隊金牌精準計劃

【趨勢識別與預測】 數據趨勢分析在隨機序列研究中首要價值在于識別潛在規律并提升預測能力。隨機序列常表現為無規則波動,但通過滑動平均、指數平滑、小波變換等方法,可剝離噪聲干擾,提取長期趨勢或周期性成分。例如,在金融時間序…

S32K144外設實驗(七):FTM輸出多路互補帶死區PWM

文章目錄 1. 概述1.1 時鐘系統1.2 實驗目的2. 代碼的配置2.1 時鐘配置2.2 FTM模塊配置2.3 輸出引腳配置2.4 API函數調用1. 概述 互補對的PWM輸出是很重要的外設功能,尤其應用再無刷電機的控制。 1.1 時鐘系統 筆者再墨跡一遍時鐘的設置,因為很重要。 FTM的CPU接口時鐘為SY…

數據結構與算法:算法分析

遇到的問題,都有解決方案,希望我的博客能為您提供一點幫助。 本篇參考《Data Structures and Algorithm Analysis in C》 “在程序設計中,不僅要寫出能工作的程序,更要關注程序在大數據集上的運行時間。” 本章討論要點&#xf…

Redis數據持久化機制 + Go語言讀寫Redis各種類型值

Redis(Remote Dictionary Server)作為高性能的鍵值存儲系統,憑借其豐富的數據類型和原子性操作,成為現代分布式系統中不可或缺的組件。 1、Redis支持的數據類型 Redis支持的數據類型可歸納為以下9類: String&#x…

排序--歸并排序

一,引言 歸并排序作為七大排序中一種,本文將講解其排序原理和代碼實現。 二,邏輯講解 來看一組動圖: 首先先進行大邏輯的講解,在一個亂序的數組中如圖: 通過遞歸進行一次次分組如圖: 分組邏…

React程序打包與部署

===================== 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 為生產環境準備React應用最小化和打包環境變量錯誤處理部署到托管服務部署到Netlify探索高級主題:Hooks、Su…

Spring Data審計利器:@LastModifiedDate詳解(依賴關系補充篇)!!!

🕒 Spring Data審計利器:LastModifiedDate詳解🔥(依賴關系補充篇) 🔌 核心依賴解析 使用LastModifiedDate必須知道的依賴關系 #mermaid-svg-qm1OUa9Era9ktbeK {font-family:"trebuchet ms",verd…

接口測試中數據庫驗證,怎么解決?

在接口測試中,通常需要在接口調用前后查詢數據庫,以驗證接口操作是否正確影響了數據庫狀態。?這可以通過數據庫斷言來實現,PyMySQL庫常用于連接和操作MySQL數據庫。?通過該庫,可以在測試中執行SQL語句,查詢或修改數據…

游戲引擎學習第189天

今天的回顧與計劃 在昨天,我們花了一些時間來優化調試數據的收集方法,并且在調試界面中增加了一些界面代碼,使得我們可以懸停在不同的元素上,查看相關信息。今天的任務是對這些數據進行更多的操作,進行一些有趣的實驗…

智能粉塵監測解決方案|守護工業安全,杜絕爆炸隱患

在廠房轟鳴的生產線上,一粒微小粉塵的聚集可能成為一場災難的導火索。如何實現粉塵濃度的精準監控與快速響應?我們為您打造了一套"感知-預警-處置"全閉環的智能安全方案! 行業痛點:粉塵管理的生死線 在金屬加工、化工…

Java 實現將Word 轉換成markdown

日常的開發中&#xff0c;需要將word 等各類文章信息轉換成格式化語言&#xff0c;因此需要使用各類語言將word 轉換成Markdown 1、引入 jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version&g…

Axure設計之中繼器表格——拖動行排序教程(中繼器)

一、原理介紹 在Axure中實現表格行的拖動排序&#xff0c;主要依賴于中繼器的排序事件。然而要實現拖動效果&#xff0c;就必須結合動態面板&#xff0c;因為動態面板可以設置拖動事件&#xff0c;之所以使用動態面板或許是因為它可以更靈活地處理位置變化。用戶拖動行時&…

分布式渲染與云渲染:技術與應用的黃金搭檔

一、核心概念&#xff1a;先區分再關聯 分布式渲染是通過多臺設備并行計算拆分渲染任務的技術&#xff08;如將一幀拆分為 64 個小塊&#xff0c;64 臺電腦同時渲染&#xff09;&#xff1b; 云渲染是基于云計算的渲染服務&#xff0c;本質是分布式渲染的商業化落地—— 用戶無…

鼠標在客戶區內按下左鍵和雙擊右鍵

書籍&#xff1a;《Visual C 2017從入門到精通》的2.6鼠標 環境&#xff1a;visual studio 2022 內容&#xff1a;【例2.44】鼠標在客戶區內按下左鍵和雙擊右鍵 1.創建一個單文檔程序 一個簡單的單文檔程序-CSDN博客https://blog.csdn.net/qq_20725221/article/details/1463…

VMware虛擬機 ubuntu22.04無法與共享粘貼板和拖拽文件的解決方案

VMware虛擬機 ubuntu22.04無法與共享粘貼板和拖拉文件的解決方案 卸載VMware tools安裝open-vm-tools還無法拖拽文件 卸載VMware tools 確保卸載完vmware-tools # 進入vmware-tools安裝目錄/bin sudo vmware-uninstall-tools.pl sudo rm -rf /usr/lib/vmware-tools sudo apt-…

vue3 vue-router 傳遞路由參數

在 Vue 3 中&#xff0c;使用 vue-router 傳遞路由參數是非常常見的需求。 1. 使用動態路由參數&#xff08;params&#xff09; 動態路由參數是定義在路由規則中的占位符部分&#xff0c;例如 /user/:id。你可以通過 router.push 或 <router-link> 傳遞這些參數。 (1…