SkyWalking+Springboot實戰(最詳細)

本篇文章記錄了作者在0到1學習SkyWalking的過程,記錄了對SkyWalking的部署,學習,使用Bug解決等等過程

一、什么是SkyWalking

官方文檔:

Apache SkyWalkinghttps://skywalking.apache.org/

SkyWalking 是一個開源的分布式追蹤、性能監控和診斷平臺,特別適合用于管理微服務、云原生以及容器化(如 Kubernetes 和 Docker)架構下的性能問題。它通過提供全面的功能集來幫助用戶有效地監控和優化他們的應用程序和服務。以下是 SkyWalking 的核心特性和組成部分:

1、核心特性

  • 追蹤(Tracing):SkyWalking 能夠對分布式系統中的請求進行全鏈路追蹤,記錄請求從進入系統到離開系統的整個流程,包括每個服務的響應時間、調用路徑和異常信息。
  • 指標(Metrics):除了追蹤之外,SkyWalking 還可以監控各種關鍵性能指標(KPIs),例如CPU使用率、內存消耗、請求響應時間等,幫助了解系統運行狀態。
  • 日志(Logs)和告警(Alert):集成日志管理和告警機制,確保在出現異常情況時能夠及時通知相關人員。
  • 支持多種語言和框架:支持Java、.Net、Node.js、Python等多種編程語言,并能與主流的服務網格(如Istio)及中間件(如Kafka、Redis、MySQL)無縫集成。

2、組成部分

  1. Agent:部署在應用服務中,負責收集性能數據(如tracing和metric數據)并發送給SkyWalking OAP服務器。
  2. OAP(Observability Analysis Platform)服務器:是SkyWalking的核心,負責接收來自Agent的數據,分析這些數據,并將結果存儲起來供查詢使用。
  3. UI界面:提供了基于Web的控制臺,使得開發人員和運維人員能夠方便地查看服務調用鏈、性能數據、告警信息等。
  4. Storage:支持多種存儲后端(如Elasticsearch、MySQL、H2等),用于持久化處理后的數據,以便后續的查詢、分析和報告生成。

通過上述組件的協同工作,SkyWalking為用戶提供了一個強大的工具集,以實現從應用程序到基礎設施的全棧可觀測性,從而顯著提升復雜場景下的系統穩定性和可維護性。特別是在高并發、復雜的微服務架構下,SkyWalking的鏈路追蹤功能對于故障排查、性能瓶頸識別、服務依賴關系分析等方面顯得尤為重要。

3、應用場景

  • 性能優化:通過追蹤請求在各個服務中的執行時間、延遲等信息,幫助識別性能瓶頸。例如,可以發現是數據庫查詢還是網絡延遲導致了響應時間過長。
  • 故障診斷:當分布式系統中出現錯誤時,鏈路追蹤可以幫助快速定位問題的根源,了解錯誤是在哪個服務或哪個環節發生的。
  • 服務依賴關系分析:展示不同服務之間的調用關系,幫助團隊理解服務間的依賴性,從而優化服務架構,減少不必要的復雜性和冗余。
  • 系統監控:不僅限于故障排查,鏈路追蹤還能夠實時監控系統的運行狀態,如各服務的響應時間、調用頻率和錯誤率,及時發現異常并采取措施。

4、為什么鏈路追蹤對分布式系統至關重要?

在分布式系統中,服務的數量和復雜性往往使得問題的定位變得非常困難。以下是鏈路追蹤至關重要的幾個原因:

  1. 跨服務請求的可視化:鏈路追蹤提供了一個統一的視角來觀察跨多個服務的請求流動情況,這在傳統的單機應用中是相對簡單的任務,但在微服務架構中卻變得極為復雜。
  2. 準確的問題定位:在分布式環境中,一個用戶請求可能會經過多個服務,每個服務都可能成為潛在的故障點。鏈路追蹤能夠幫助準確定位到具體的故障服務或操作,而不是盲目地檢查所有可能的地方。
  3. 性能瓶頸的識別:通過對請求處理時間和路徑的詳細記錄,鏈路追蹤能夠幫助識別出哪些服務或操作是最耗時的,從而有針對性地進行優化。
  4. 服務間依賴的理解:隨著服務數量的增長,理解服務間的相互依賴變得越來越困難。鏈路追蹤能夠清晰地展示這些依賴關系,有助于優化整個系統的架構設計。
  5. 提升系統的可維護性和穩定性:通過及時發現問題、優化性能瓶頸以及更好地理解服務間的依賴,鏈路追蹤有助于提高系統的整體穩定性和可維護性,尤其是在高并發和復雜的業務場景下尤為重要。

二、部署SkyWalking OAP和SkyWalking UI

這里提供兩種部署方式,一個是解壓壓縮包啟動其Java服務部署,一個是Docker部署。

這邊建議docker部署,因為比較便捷,部署和關閉服務都比較方便

但是第一種的話,定制化靈活性更高一些

1、部署其內置Java服務

1.下載SkyWalking APM 壓縮包

手動下載

Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/

鏈接下載

https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gzhttps://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gz

2.解壓壓縮包

隨便上傳到服務器某個路徑,自己找得到就行

cd /www/wwwroot/skywalking
tar -zxvf apache-skywalking-apm-10.2.0.tar.gz

查看bin目錄下的文件

cd /www/wwwroot/skywalking/apache-skywalking-apm-bin/bin

一般來說linux啟動應用的都是

./startup.sh

3.修改配置文件

修改webapp配置

進入webapp目錄下修改端口

http://IP+:12800
修改skywalking服務配置

進入config目錄下修改一些配置

觀察到服務注冊這里,默認走的單機模式,下面還有zookeeper、nacos等注冊中心,加入需要切換調整上面配置即可,這里我選的默認。

假設你需要使用nacos作為配置中心,可以按下述描述進行修改配置

cluster:selector: ${SW_CLUSTER:nacos} # 設置為 nacosnacos:serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} # 注冊的服務名稱hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848} # Nacos 地址namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"public"} # Nacos 命名空間contextPath: ${SW_CLUSTER_NACOS_CONTEXT_PATH:""} # Nacos 上下文路徑(可選)username: ${SW_CLUSTER_NACOS_USERNAME:""} # Nacos 用戶名(如果啟用了認證)password: ${SW_CLUSTER_NACOS_PASSWORD:""} # Nacos 密碼(如果啟用了認證)accessKey: ${SW_CLUSTER_NACOS_ACCESSKEY:""} # Nacos 訪問密鑰(可選)secretKey: ${SW_CLUSTER_NACOS_SECRETKEY:""} # Nacos 秘鑰(可選)internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:""} # 內部通信主機(可選)internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1} # 內部通信端口(可選)

配置存儲數據庫:

這里的解釋我用AI給大家解釋一下:

默認是這個banyandb,但是實際上我們使用ES比較多,關于如何使用ES進行配置如下:

如果想要學習怎么docker部署ES,可以看我下面的博客:
Springboot中使用Elasticsearch(部署+使用+講解 最完整)_spring boot elasticsearch-CSDN博客文章瀏覽閱讀8k次,點贊34次,收藏72次。最完整最詳細的springboot中使用es,在前面有服務器部署es相關的東西,在后面有使用java的實戰,對于實戰的方法使用結合官網深度去研究和講解。在這篇文章前面是實戰,后面是具體講解~~~如果只想實戰就只看一和二,深入了解就繼續看,在未來還會繼續更新對這個實戰,還有es技術的更新,幾萬字大長文。_spring boot elasticsearch https://blog.csdn.net/qq_73440769/article/details/141477177?spm=1001.2014.3001.5502修改 SkyWalking 配置文件:

storage:selector: ${SW_STORAGE:elasticsearch} # 設置為 elasticsearchelasticsearch:namespace: ${SW_NAMESPACE:""} # 命名空間(可選)clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} # Elasticsearch 地址protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} # 協議,默認為 httpconnectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:3000} # 連接超時時間(毫秒)socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000} # 套接字超時時間(毫秒)responseTimeout: ${SW_STORAGE_ES_RESPONSE_TIMEOUT:15000} # 響應超時時間(毫秒)numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0} # HTTP 客戶端線程數(默認為 0)user: ${SW_ES_USER:""} # 用戶名(如果啟用了認證)password: ${SW_ES_PASSWORD:""} # 密碼(如果啟用了認證)dayStep: ${SW_STORAGE_DAY_STEP:1} # 每個索引的時間跨度(天)indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # 每個索引的分片數indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # 每個索引的副本數

?查看ES狀態是否正常:

ES部署的服務器IP+:9200

4.啟動SkyWalking OAP和UI

開放端口

在一開始我只開啟IPv4的端口的時候是沒問題的,但是后來重啟服務器發現報了下面的錯誤

2025-03-31 14:18:11,350 - com.linecorp.armeria.common.Flags - 1738 [main] INFO  [] - verboseExceptions: rate-limit=10 (default)
2025-03-31 14:18:11,521 - com.linecorp.armeria.common.Flags - 1738 [main] INFO  [] - useEpoll: true (default)
2025-03-31 14:18:11,560 - com.linecorp.armeria.common.Flags - 1738 [main] INFO  [] - annotatedServiceExceptionVerbosity: unhandled (default)
2025-03-31 14:18:12,394 - com.linecorp.armeria.common.Flags - 635 [main] INFO  [] - Using Tls engine: OpenSSL BoringSSL, 0x1010107f
2025-03-31 14:18:12,551 - com.linecorp.armeria.common.util.SystemInfo - 525 [main] INFO  [] - IPv6: disabled (no IPv6 network interface)

找了很久bug后,我思索我也沒開IPv6啊,唯一想到的就是自己監控的服務器部署了小程序,小程序使用的可能是IPv6,索性不繼續找配置文件的bug了,向困難低頭,我就多開個IPv6的端口,結果問題真就解決了:

?配置java環境

建議先配置環境再啟動

如果啟動出現:

下面提供兩種配置方式,選擇一個即可,建議第二個,如果已經配置了全局java環境可以忽略這一步。

(1)修改配置文件,指定jdk目錄

替換這兩個為你jdk的目錄

(2)配置Java的home位置

添加這些配置,根據你的jdk位置為準

export JAVA_HOME=/www/server/java/jdk-17.0.8/          
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

如果不配置會出現這兩個錯誤

啟動后可以查看日志文件:

?參考如下AI解釋:

啟動服務
cd /www/wwwroot/skywalking/apache-skywalking-apm-bin/bin
./startup.sh



查看日志:

查看有無報錯,沒有報錯就是啟動成功

訪問:IP+:8902

5.如何關閉服務

個人覺得,應該也可以寫個stop.sh進行自己關閉,不過需要自己去編寫配置文件

分別關掉這兩個進程,注意PID根據實際的選擇

sudo lsof -i :8902
sudo lsof -i :12800
kill -9 +PID

2、docker部署

1. 創建Docker網絡(便于容器間通信)

docker network create skywalking-net

2. 部署SkyWalking OAP Server

docker run -d --name skywalking-oap \--network skywalking-net \--restart always \-e SW_STORAGE=elasticsearch \-e SW_STORAGE_ES_CLUSTER_NODES=IP:9200 \-p 11800:11800 \-p 12800:12800 \apache/skywalking-oap-server:10.2.0

建議部署完oap后過一會再部署ui,因為如果oap沒完全啟動的話,ui也會因為連不上oap報錯,直到oap完全啟動后ui才正常

3. 部署SkyWalking UI

docker run -d --name skywalking-ui \--link skywalking-oap \--network skywalking-net \--restart always \-e SW_OAP_ADDRESS=http://skywalking-oap:12800 \-p 10800:8080 \apache/skywalking-ui:10.2.0

?記得開啟上面這些端口,還有注意下面部署UI的地方有個-link連接別漏了

如果希望自定義oap的內存,不希望他啟動占用內存太大,可以參考下面的指令:

docker run -d --name skywalking-oap \--network skywalking-net \--restart always \-e SW_STORAGE=elasticsearch \-e SW_STORAGE_ES_CLUSTER_NODES=IP:9200 \-e JAVA_OPTS="-Xms512m -Xmx1g" \-p 11800:11800 \-p 12800:12800 \apache/skywalking-oap-server:10.2.0

4.驗證部署

  1. 訪問UI:http://服務器IP:10800

  2. 檢查OAP日志:

docker logs -f skywalking-oap
docker logs -f skywalking-ui

到這里基本上就結束了,后續有些注意事項

5.注意

  • 確保ES服務已啟用且網絡可達

  • 如果ES有認證,需添加以下環境變量:

-e SW_ES_USER=用戶名 \
-e SW_ES_PASSWORD=密碼 \
  • 默認使用ES索引分片數1、副本數1,如需調整可添加:

-e SW_STORAGE_ES_INDEX_SHARDS_NUMBER=分片數 \
-e SW_STORAGE_ES_INDEX_REPLICAS_NUMBER=副本數 \

6.怎么停止

docker stop skywalking-oap skywalking-ui
docker rm skywalking-oap skywalking-ui
docker network rm skywalking-net

分別的意思是:停止容器運行,刪除容器,刪除容器的網絡

7.怎么啟動容器

docker start skywalking-oap skywalking-ui
docker restart skywalking-oap skywalking-ui

分別是啟動和重啟

三、Skywalking-agent代理Java服務

1、下載Skywalking-agent

Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/

2、下載后解壓進服務器

cd /www/wwwroot/skywalking
tar -zxvf apache-skywalking-java-agent-9.4.0.tgz

3、修改代理配置?agent.config

可以通過ctrl+F定位到這兩個配置:

agent.service_name
collector.backend_service

修改服務名稱

?我會起有具體意義的名稱

4、準備java服務

這個就是我自己的jar服務,進行配置代理檢測

nohup /www/server/java/jdk-17.0.8/bin/java \-Xmx1024M \-Xms256M \-javaagent:/www/wwwroot/skywalking/skywalking-agent/skywalking-agent.jar \-DSW_SERVICE_NAME=quick-server \-jar /www/wwwroot/quick_pickup_java/quick-server-0.0.1-SNAPSHOT.jar \> /www/wwwroot/quick_pickup_java/app.log 2>&1 &

或者在啟動命令中添加:

/www/server/java/jdk-17.0.8/bin/java \-Xmx1024M \-Xms256M \-javaagent:/www/wwwroot/skywalking/skywalking-agent/skywalking-agent.jar \-DSW_SERVICE_NAME=quick-server \-jar /www/wwwroot/quick_pickup_java/quick-server-0.0.1-SNAPSHOT.jar

AI解釋:

5、啟動Java服務

啟動服務后出現:

至此完成部署。

四、UI使用教程

大家可以查看官方中文文檔的這個UI介紹,我覺得這里講的很詳細:

https://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/ui/README.mdhttps://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/ui/README.md

這里我主要講幾點:

1、常規服務-服務

儀表盤

主要關心這四點:節點成功率,平均響應時間,加載時間,整體服務性能,根據上面幾個指標去鏈路追蹤。

拓跋結構

這里展示你的系統的總體拓跋結構

鏈路

其實你會發現在儀表盤那邊也可以進入具體每個接口的鏈路追蹤

2、常規服務-虛擬數據庫

點擊即可進行具體的鏈路追蹤

2、常規服務-虛擬緩存

4、常規服務-虛擬消息隊列

5、SkyWalking自監控

上面可以看出,SkyWalking很強勢的將你的服務鏈路到的具體服務都鏈路分析出來

五、SpingBoot代碼中自定義追蹤

1、為什么

比如說我要追蹤這個接口:

這里我就可以進行一個鏈路的追蹤,可以看到這個接口的一些鏈路信息,但是我如果想要看到這個方法里面的一些具體的信息,結果可以看到

發現系統中是默認不會鏈路追蹤代碼里面的一些業務信息,所以這里就需要我們在后端代碼中加一些配置信息進行自定義追蹤接口的信息。

2、引入依賴

大家可以去選擇自己喜歡的版本:

https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace/9.4.0https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace/9.4.0

<!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace -->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.4.0</version>
</dependency>

?

3、選擇鏈路的接口

4、部署服務器觀察

出現我們剛剛定義的鏈路名稱,不過點擊可以發現

5、對查看鏈路的內容添加注解和 API進行增強

    @Trace(operationName="user-store-getByClassification")@Tags({@Tag(key = "classificationId", value = "arg[0]") // 動態獲取 classificationId})@Overridepublic List<StoreVO> selectByClassification(Long classificationId) {String key = RedisConstant.STORE_CLASSIFICATION_ + classificationId;try {// 查詢 Redis 中是否存在店鋪數據List<StoreVO> storeVOList = (List<StoreVO>) redisTemplate.opsForValue().get(key);if (storeVOList != null && !storeVOList.isEmpty()) {log.info("從 Redis 中獲取店鋪數據");ActiveSpan.tag("result", "Redis hit"); // 記錄 Redis 命中return storeVOList;}// 查詢數據庫storeVOList = iStoreService.getByClassification(classificationId);if (storeVOList == null || storeVOList.isEmpty()) {// 防止緩存穿透List<StoreVO> cacheThoughtStoreVOList = getCacheThoughtStoreVOList();redisTemplate.opsForValue().set(key, cacheThoughtStoreVOList, 5L, TimeUnit.MINUTES);ActiveSpan.tag("result", "Cache penetration prevention"); // 記錄緩存穿透return cacheThoughtStoreVOList;}// 將查詢結果存儲到 Redis 中redisTemplate.opsForValue().set(key, storeVOList);ActiveSpan.tag("result", "DB query success"); // 記錄數據庫查詢成功return storeVOList;} catch (Exception e) {// 記錄錯誤信息到鏈路中ActiveSpan.error(e); // 記錄異常ActiveSpan.tag("error", e.getMessage()); // 自定義錯誤標簽log.error("查詢店鋪數據失敗,分類ID: {}, 錯誤信息: {}", classificationId, e.getMessage(), e);throw new StoreException("根據店鋪類型分類id查詢店鋪接口出錯");}}

6、關鍵點解析

1. @Trace 注解
  • @Trace(operationName = "user-store-getByClassification") 定義了鏈路操作名稱。
  • 這會使該方法成為一個獨立的 Trace 節點,SkyWalking 會自動記錄該方法的執行時間。
2. @Tags@Tag 注解
  • 使用 @Tags@Tag 注解可以動態地將方法參數或返回值綁定到鏈路中。
  • 在這個例子中:
    • @Tag(key = "classificationId", value = "arg[0]") 動態獲取方法的第一個參數(即 classificationId)。
3. ActiveSpan API
  • ActiveSpan 是 SkyWalking 提供的一個工具類,用于在運行時動態向鏈路中添加標簽或記錄錯誤。
  • 常用方法:
    • ActiveSpan.tag(String key, String value):添加自定義標簽。
    • ActiveSpan.error(Throwable throwable):記錄異常信息。
    • ActiveSpan.error():標記當前 Span 為錯誤狀態。
4. 記錄 Redis 和數據庫查詢結果
  • 使用 ActiveSpan.tag("result", "xxx") 記錄 Redis 命中、緩存穿透、數據庫查詢成功等信息。
  • 這些標簽可以幫助你在 SkyWalking UI 中快速定位問題。
5. 異常處理
  • 捕獲異常后,調用 ActiveSpan.error(e)ActiveSpan.tag("error", e.getMessage()) 將錯誤信息記錄到鏈路中。
  • 同時,打印日志以便進一步排查問題。

7、線上測試

說到這個線上測試,其實還是我錯誤的在一個未攔截用戶線程的接口里面用線程TreadLocal去獲取用戶ID用來測試自己寫的SkyWalkinh能不能輸出日志,在上面案例可以看到我用到的用戶的ID來放在下面這個地方:

線上事故鏈路如下:

修改完成后,發現這些具體的屬性都有了:

六、參考

參考這些大佬的文章:

分布式監控Skywalking安裝及使用教程(保姆級教程)-CSDN博客文章瀏覽閱讀8.9k次,點贊47次,收藏91次。本文主要講解分布式鏈路追蹤監控系統Skywalking的安裝及使用教程,從0到1,圖文并茂的保姆級教程。SkyWalking是一款用于分布式系統跟蹤和性能監控的開源工具。它可以幫助開發人員了解分布式系統中不同組件之間的調用關系和性能指標,從而進行故障排查和性能優化。它支持多種語言和框架,包括Java、.NET、Node.js等。它通過在應用程序中插入代理或使用特定的SDK來收集跟蹤數據,并將這些數據發送到SkyWalking服務器進行分析和展示。分布式跟蹤。_skywalking安裝 https://blog.csdn.net/chang_mao/article/details/135998660?spm=1001.2014.3001.5502

【第二十二篇】商城系統-Skywalking鏈路追蹤【商城系統完結篇】-騰訊云開發者社區-騰訊云??Skywalking是由國內開源愛好者吳晟開源并提交到Apache孵化器的產品,它同時吸收了Zipkin /Pinpoint /CAT 的設計思路。特點是:支持多種插件,UI功能較強,支持非侵入式埋點。目前使用廠商最多,版本更新較快。https://cloud.tencent.com/developer/article/2135248?policyId=1003

SkyWalking入門搭建【apache-skywalking-apm-10.0.0】_skywalking10.0.0版本部署-CSDN博客文章瀏覽閱讀3.4k次,點贊27次,收藏38次。SkyWalking在Java中使用的是字節方式植入,是完全無代碼侵入的VM options 添加,就是剛剛上面下的 java-agentEnvironment variables 添加,指定 SkyWalking的地址效果圖操作步驟(idea 2023,其它版本百度操作)配置好后,啟動服務會看到下面的日志,就說明 java-agent.jar 讀取到了隨機訪問幾下服務的接口,再去刷新SkyWalking 控制臺,就可以看到了。_skywalking10.0.0版本部署 https://blog.csdn.net/Tomwildboar/article/details/140589444

還有通義,DeepSeek,ChatGPT,文心一言幾位大神。

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

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

相關文章

Arduino示例代碼講解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩陣

Arduino示例代碼講解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩陣 Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩陣功能概述硬件部分:軟件部分:代碼逐行解釋定義常量定義變量`setup()` 函數`loop()` 函數`readSensors()` 函數`refreshScr…

多線程編程中的鎖策略

目錄 1.悲觀鎖vs樂觀鎖 關鍵總結 悲觀鎖&#xff1a; 樂觀鎖&#xff1a; 選擇建議 用 悲觀鎖 當&#xff1a; 用 樂觀鎖 當&#xff1a; 2.重量級鎖vs輕量級鎖 選擇建議 用 輕量級鎖&#xff1a; 用 重量級鎖&#xff1a; 3.掛起等待鎖vs自旋鎖 關鍵細節說明 選擇…

負載均衡是什么,Kubernetes如何自動實現負載均衡

負載均衡是什么&#xff1f; 負載均衡&#xff08;Load Balancing&#xff09; 是一種網絡技術&#xff0c;用于將網絡流量&#xff08;如 HTTP 請求、TCP 連接等&#xff09;分發到多個服務器或服務實例上&#xff0c;以避免單個服務器過載&#xff0c;提高系統的可用性、可擴…

React-01React創建第一個項目(npm install -g create-react-app)

1. React特點 JSX是javaScript語法的擴展&#xff0c;React開發不一定使用JSX。單向響應的數據流&#xff0c;React實現單向數據流&#xff0c;減少重復代碼&#xff0c;比傳統數據綁定更簡單。等等 JSX是js的語法擴展&#xff0c;允許在js中編寫類似HTML的代碼 const …

小程序中的網絡請求

在小程序中&#xff0c;使用 wx.request( ) 這個方法來發送網路請求&#xff0c;整個請求的方式和 jQuery 里面的 $.ajax 方法是非常相似的。 在 wx.request( ) 這個方法中&#xff0c;接收一個配置對象&#xff0c;該配置對象中能夠配置的項目如下表&#xff1a; 關于服務器…

jvm 的attach 和agent機制

Java 的 Attach 和 Agent 機制在實際應用中得到了廣泛的成功應用&#xff0c;尤其是在監控、調試、性能分析、故障排查等方面。以下是這兩種機制在實際場景中的一些成功應用案例&#xff1a; 1. 性能監控與分析 Java Agent 和 Attach 機制廣泛應用于性能監控和分析&#xff0…

基于SpringBoot的“留守兒童網站”的設計與實現(源碼+數據庫+文檔+PPT)

基于SpringBoot的“留守兒童網站”的設計與實現&#xff08;源碼數據庫文檔PPT) 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 系統整體功能圖 局部E-R圖 系統首頁界面 系統注冊…

iPhone XR:一代神機,止步于此

什么樣的 iPhone &#xff0c;才配稱為一代神機&#xff1f; 我曾經用過iPhone 4S、iPhone 6S Plus、iPhone 8 Plus&#xff0c;iPhone SE2、iPhone XR、iPhone 13、iPhone 14 Plus、iPhone 15/Pro。 不管硬件再怎么卷&#xff0c;不管囊中是否羞澀&#xff0c;主力機基本沒考…

【VUE】RuoYi-Vue3項目結構的分析

【VUE】RuoYi-Vue3項目結構的分析 1. 項目地址2. RuoYi-Vue3項目結構2.1 整體結構2.2 package.json2.2.1 &#x1f9fe; 基本信息2.2.2 &#x1f527; 腳本命令&#xff08;scripts&#xff09;2.2.3 &#x1f30d; 倉庫信息2.2.4 &#x1f4e6; 項目依賴&#xff08;dependenc…

架構師面試(二十五):分布式存儲 Leader 設計

問題 在非常多的分布式存儲系統中&#xff0c;如&#xff1a;Zookeeper、Etcd、Kafka等&#xff0c;往往會存在一個 【Leader】 角色&#xff0c;并由該角色負責數據的寫入&#xff0c;這樣設計最主要的原因是什么呢&#xff1f; A. 唯一負責數據寫入的 Leader 角色可以避免并…

使用YoloV5和Mediapipe實現——上課玩手機檢測(附完整源碼)

目錄 效果展示 應用場景舉例 1. 課堂或考試監控&#xff08;看到這個學生黨還會愛我嗎&#xff09; 2. 駕駛安全監控&#xff08;防止開車玩手機&#xff09; 3. 企業辦公管理&#xff08;防止工作時間玩手機&#xff09; 4. 監獄、戒毒所、特殊場所安保 5. 家長監管&am…

GPT-4o從語義分割到深度圖生成,大模型狂潮下的計算機視覺:技術進步≠替代危機

隨著上周&#xff0c;GPT-4o原生多模態圖像生成功能的推出&#xff0c;更多玩法也被開發出來。一夜之間&#xff0c;GPT-4o原生多模態能力的釋放&#xff0c;讓圖像生成、語義分割、深度圖構建這些曾需要專業工具鏈支持的復雜任務&#xff0c;變成了普通人輸入一句話就能實現的…

Pytorch 張量操作

在深度學習中&#xff0c;數據的表示和處理是至關重要的。PyTorch 作為一個強大的深度學習框架&#xff0c;其核心數據結構是張量&#xff08;Tensor&#xff09;。張量是一個多維數組&#xff0c;類似于 NumPy 的數組&#xff0c;但具有更強大的功能&#xff0c;尤其是在 GPU …

小程序中跨頁面組件共享數據的實現方法與對比

小程序中跨頁面/組件共享數據的實現方法與對比 在小程序開發中&#xff0c;實現不同頁面或組件之間的數據共享是常見需求。以下是幾種主要實現方式的詳細總結與對比分析&#xff1a; 一、常用數據共享方法 全局變量&#xff08;getApp()&#xff09;、本地緩存&#xff08;w…

vue中的 拖拽

拖拽總結 實現方式特點適用場景HTML5 原生拖拽 API? 直接使用 dataTransfer 進行數據傳輸 ? 兼容性好&#xff08;大部分瀏覽器支持&#xff09; ? 適合簡單的拖拽場景低代碼平臺、表單生成器、組件拖拽Vue/React 組件庫&#xff08;如 Vue Draggable、SortableJS&#xff…

MySQL 函數(入門版)

目錄 一、字符串函數 1、常用的字符串函數 2、函數演示 3、具體案例 二、數值函數 1、常用的數值函數 2、函數演示 3、具體案例 三、日期函數 1、常用的日期函數 2、函數演示 3、具體案例 四、流程函數 1、常用的流程函數 2、函數演示 3、具體案例 在MySQL中&a…

基于快速開發平臺與智能手表的區域心電監測與AI預警系統(源碼+論文+部署講解等)

需要源代碼&#xff0c;演示視頻&#xff0c;ppt設計原稿資料&#xff0c;請文末卡片聯系 !](https://i-blog.csdnimg.cn/direct/242d53cd069940b5b7a6db2bb031d406.png#pic_center)

【神經網絡】python實現神經網絡(三)——正向學習的模擬演練

有了之前的經驗(【神經網絡】python實現神經網絡(二)——正向推理的模擬演練),我們繼續來介紹如何正向訓練神經網絡中的超參(包含權重以及偏置),本章大致的流程圖如下: 一.損失函數 神經網絡以某個指標為基準尋求最優權重參數,而這個指標即可稱之為 “損失函數” 。(…

分區格式變RAW故障深度解析與數據恢復實戰指南?

分區格式變RAW的本質? 當存儲設備&#xff08;如硬盤、U盤或移動硬盤&#xff09;的分區突然顯示為RAW格式時&#xff0c;意味著操作系統無法識別其原有的文件系統結構&#xff08;如NTFS、FAT32等&#xff09;。此時&#xff0c;用戶訪問該分區會提示“需要格式化”或直接顯示…

【QT】Qt5 QtWebEngine使用教程

目錄 1、QtWebEngine相比于QtWebKit的優勢2、項目配置2.1 確認 Qt 版本2.2 在.pro 文件中添加依賴3、顯示網頁4、實現Qt和網頁JavaScript之間的交互4.1 Qt執行網頁的JavaScript代碼4.2 JavaScript調用Qt對象的函數QtWebEngine 是 Qt 框架中用于在應用程序中嵌入 Web 內容的模塊…