SpringCloud Gateway 集成 Sentinel 詳解 及實現動態監聽Nacos規則配置實時更新流控規則

目錄
    • 一、前言
    • 二、版本選擇和適配
      • 2.1、本文使用各組件版本
      • 2.2、官方推薦版本
    • 三、部署sentinel-dashboard
      • 3.1、下載 sentinel-dashboard jar包
      • 3.2、啟動 sentinel-dashboard
    • 四、Gateway 集成 Sentinel實現控制臺配置流控規則測試
      • 4.1、添加Gateway 集成 Sentinel 包
      • 4.2、添加 Gateway 服務啟動JVM參數
        • 4.2.1、配置說明
        • 4.2.2、啟動說明
          • 4.2.2.1、使用 jar 包啟動Gateway添加JVM啟動參數
          • 4.2.2.2、IDEA中配置JVM啟動參數(IDEA版本2022.2.1)
      • 4.3、啟動 Gateway 注冊到 Sentinel-dashboard 實現接口流控規則動態配置
        • 4.3.1、啟動 Gateway 注冊到 Sentinel-dashboard
        • 4.3.2、通過 Sentinel-dashboard 配置指定接口限流
      • 4.4、注意事項
    • 五、Gateway 集成 Sentinel 常用配置
      • 5.1、熱加載
      • 5.2、降級處理配置(這里提供代碼配置和使用配置文件配置)
        • 5.2.1、通過代碼配置(配置文件配置比代碼配置優先級高)
        • 5.2.2、通過配置文件配置
    • 六、自定義本地加載流控規則
      • 6.1、通過代碼加載流控規則
      • 6.2、通過本地配置文件加載流控規則
        • 6.2.1、API分組規則json文件編寫(gateway-sentinel-api-groups.json)
        • 6.2.2、流控規則json文件編寫(gateway-sentinel-flow-rules.json)
        • 6.2.3、配置文件配置加載API分組和流控規則json文件
    • 七、動態監聽Nacos規則配置實時更新流控規則實現(推薦)
      • 7.1、添加sentinel集成nacos包
      • 7.2、Nacos配置中心添加API分組規則json(gateway-sentinel-api-groups)
      • 7.3、Nacos配置中心添加流控規則json(gateway-sentinel-flow-rules)
      • 7.4、配置文件配置加載Nacos配置中心API分組和流控規則json
      • 7.5、測試效果

一、前言

SentinelSpringCloud Alibaba 家族的服務保護組件,很多項目在前中期沒有遇到流量突增不太注意服務保護的重要性,當流量突增打爆應用服務或數據庫時束手無策,可以不配置流控規則,但是需要時一定可以熱加載使用,本文會對集成Sentinel以及動態拉取Nacos配置規則實現熱加載流控規則進行講解。

官網地址

二、版本選擇和適配

使用 SpringCloud Alibaba 家族組件,要注意一下版本兼容問題,避免出現一些奇怪的問題,這里會說明本文使用的各組件版本,以及 SpringCloud Alibaba 推薦的各版本適配。

2.1、本文使用各組件版本

部分組件對版本兼容要求其實沒有那么高,比如Nacos,不一定要按照官方推薦版本,差幾個小版本沒有什么影響,我本地使用的一直是Nacos2.0.2,代碼集成實現基本都一樣。

JDK:1.8.0
Spring-Boot:2.3.12.RELEASE
Spring-Cloud:Hoxton.SR12
Spring-Cloud-Alibaba:2.2.9.RELEASE
Nacos:2.0.2
Sentinel:1.8.5

2.2、官方推薦版本

官方版本說明
在這里插入圖片描述

三、部署sentinel-dashboard

3.1、下載 sentinel-dashboard jar包

這里使用sentinel-dashboard-1.8.5,這里提供兩個下載地址,需要其它版本可以自行去github下載。
github下載地址
百度網盤地址
在這里插入圖片描述

3.2、啟動 sentinel-dashboard
java -Dserver.port=8180 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar
  • -Dserver.port=8180
    sentine 服務控制臺端口
  • -Dsentinel.dashboard.auth.username=sentinel
    sentine 控制臺登錄賬號,不設置默認sentinel
  • -Dsentinel.dashboard.auth.password=123456
    sentine 控制臺登錄密碼,不設置默認sentinel
  • -Dcsp.sentinel.dashboard.server=localhost:8180
    將控制臺自身注冊到server
  • -Dproject.name=sentinel-dashboard
    控制臺服務自己項目名稱

在這里插入圖片描述
在這里插入圖片描述

四、Gateway 集成 Sentinel實現控制臺配置流控規則測試

4.1、添加Gateway 集成 Sentinel 包

在原有網關項目基礎上添加上這兩個包,這兩個包會將gateway集成sentinel,并且默認是自動配置的,無需手動配置。

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
4.2、添加 Gateway 服務啟動JVM參數
4.2.1、配置說明

Gateway 連接 Sentinel 控制臺的配置,Sentinel1.7.0 版本以下不支持配置文件配置,推薦直接使用JVM參數配置。

  • 添加JVM啟動參數:
    -Dcsp.sentinel.dashboard.server=127.0.0.1:8180
    -Dcsp.sentinel.api.port=18719
    -Dproject.name=kerwin-gateway
    -Dcsp.sentinel.app.type=1

  • 參數說明:
    -Dcsp.sentinel.dashboard.server:指定控制臺地址和端口。
    -Dproject.name:在sentinel控制臺中展示的項目名稱。
    -Dcsp.sentinel.api.port:指定客戶端監控 API 的端口(默認是 8719),如控制臺修改規則,則會向該端口推送規則信息。
    -Dcsp.sentinel.app.type:從 1.6.3 版本開始,控制臺支持網關流控規則管理。該啟動參數設置成1會將您的服務標記為 API Gateway,在接入控制臺時您的服務會自動注冊為網關類型,然后您即可在控制臺配置網關規則和 API 分組。

4.2.2、啟動說明

這里提供服務打成jar包啟動和使用IDEA開發工具添加JVM參數啟動示例。

4.2.2.1、使用 jar 包啟動Gateway添加JVM啟動參數
java -Dcsp.sentinel.dashboard.server=127.0.0.1:8180 -Dcsp.sentinel.api.port=18719 -Dproject.name=kerwin-gateway -Dcsp.sentinel.app.type=1 -jar kerwin-gateway.jar
4.2.2.2、IDEA中配置JVM啟動參數(IDEA版本2022.2.1)

不同版本IDEA可以配置入口不同,有需要可以自己查詢
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

4.3、啟動 Gateway 注冊到 Sentinel-dashboard 實現接口流控規則動態配置

這里需要注意,Gateway 集成 Sentinel-dashboard 默認是懶加載的,需要調用一次接口才能注冊到 Sentinel-dashboard,也可以直接在 Gateway 中配置成熱加載,添加spring.cloud.sentinel.eager:true實現服務器啟動了自動心跳注冊。

4.3.1、啟動 Gateway 注冊到 Sentinel-dashboard

在這里插入圖片描述

4.3.2、通過 Sentinel-dashboard 配置指定接口限流

這里需要注意,這個流控規則是按照組級別來的,一個組內所有匹配規則會共用一個閾值,如果需要在網關應用配置單獨接口流控規則目前來看只能配置多個分組,然后單獨配置規則。

  • 1、新增 API 分組
    在這里插入圖片描述

  • 2、自定義分組內 API 匹配規則
    在這里插入圖片描述

  • 3、新增網關流控規則
    在這里插入圖片描述

  • 4、配置網關流控規則(這里需要注意,這個流控規則是按照組級別來的,一個組內所有匹配規則共用一個閾值)
    在這里插入圖片描述

  • 5、測試限流規則
    快速請求兩次可以看到服務端響應 Blocked by Sentinel: ParamFlowException,響應內容也是可以自定義的,這個會在后面說明。
    在這里插入圖片描述

PS1秒內同時請求一次 /user/info 接口 和 /user/list 接口,也會響應Blocked by Sentinel: ParamFlowException,因為同一個分組共用一個閾值,如果要單獨配置某一個接口目前看只能整多個分組。

4.4、注意事項

需要注意:如果不做特殊處理,通過Sentinel控制臺配置的規則在應用服務重啟后就沒了,通過Sentinel控制臺配置流控規則的本質其實就是將編輯好的規則加載到應用服務緩存中,并不會進行持久化,如果想要持久化Sentinel控制臺配置的規則需要特殊處理,后續會進行說明。

五、Gateway 集成 Sentinel 常用配置

5.1、熱加載
spring:cloud:sentinel:# 設置sentinel為熱加載 默認為falseeager: true
5.2、降級處理配置(這里提供代碼配置和使用配置文件配置)
5.2.1、通過代碼配置(配置文件配置比代碼配置優先級高)
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;@Configuration
public class SentinelGatewayConfiguration {/*** 自定義降級處理響應*/@PostConstructpublic void init(){GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable throwable) {return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).bodyValue("{"code":500,"msg":"代碼配置-被限流了!"}");}});}
}

在這里插入圖片描述

5.2.2、通過配置文件配置
spring:cloud:sentinel:# 設置sentinel為熱加載 默認為falseeager: truescg:# 降級處理配置 也可以在代碼中實現fallback:# 指定降級處理的模式為返回響應,也可以配置成重定向redirect,配置重定向需要指定重定向地址mode: 'response'response-status: 200response-body: '{"code":500,"msg":"配置文件配置-被限流了!"}'# mode 為 redirect 時使用redirect: 'https://blog.csdn.net/weixin_44606481'

在這里插入圖片描述

六、自定義本地加載流控規則

因為 sentinel-dashboard 不會持久化手動配置的流控規則,一般情況下我們都會提前配置一些我們需要的規則,可以通過代碼或者配置文件配置。

6.1、通過代碼加載流控規則

Sentinel 的API管理存儲在 GatewayApiDefinitionManager 類中,流控規則存儲在 GatewayRuleManager 類中,添加好自己需要的配置即可。

import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
import java.util.HashSet;
import java.util.Set;@Configuration
public class SentinelGatewayRuleConfiguration {@PostConstructpublic void initRule(){// 加載根據路由 ID 配置限流規則this.initGatewayFlowRules();// 加載根據API分組配置限流規則this.initApiDefinitions();}private void initGatewayFlowRules() {// 存儲限流規則的集合Set<GatewayFlowRule> rules = GatewayRuleManager.getRules();if(rules == null){rules = new HashSet<>();}// 根據路由 ID 配置限流規則GatewayFlowRule rule1 = new GatewayFlowRule("kerwin-user").setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID).setCount(1) // QPS閾值.setIntervalSec(1); // 間隔rules.add(rule1);// 加載限流規則GatewayRuleManager.loadRules(rules);}private void initApiDefinitions() {Set<ApiDefinition> apiDefinitions = GatewayApiDefinitionManager.getApiDefinitions();if(apiDefinitions == null){apiDefinitions = new HashSet<>();}// 創建一個 API 分組ApiDefinition apiDefinition1 = new ApiDefinition("user服務API組");// API 分組 URL 匹配規則Set<ApiPredicateItem> apiPathPredicateItems = new HashSet<>();// 添加精確匹配 匹配為 /api-user/user/info 的urlapiPathPredicateItems.add(new ApiPathPredicateItem().setPattern("/api-user/user/info").setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_EXACT));// 添加前綴匹配 用于匹配以 /api-user/user 開頭的URLapiPathPredicateItems.add(new ApiPathPredicateItem().setPattern("/api-user/user/**").setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
//        // 添加正則匹配 用于匹配以 list 結尾的 URL
//        apiPathPredicateItems.add(new ApiPathPredicateItem().setPattern("^.*list$")
//                .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_REGEX));apiDefinition1.setPredicateItems(apiPathPredicateItems);apiDefinitions.add(apiDefinition1);// 根據 API 分組配置限流規則Set<GatewayFlowRule> rules = GatewayRuleManager.getRules();if(rules == null){rules = new HashSet<>();}GatewayFlowRule rule1 = new GatewayFlowRule(apiDefinition1.getApiName()).setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME).setCount(1) // QPS閾值.setIntervalSec(1); // 間隔rules.add(rule1);// 加載 API 分組定義GatewayApiDefinitionManager.loadApiDefinitions(apiDefinitions);// 加載限流規則GatewayRuleManager.loadRules(rules);}
}

項目啟動后可以在Sentinel控制臺看到代碼配置的API分組和流控規則。

6.2、通過本地配置文件加載流控規則

通過代碼手動配置會比較麻煩而且不易調整,Gateway集成Sentinel包提供了通過配置文件加載API分組和流控規則實現,這里會將API分組和流控規則都分別寫入不同的json文件中,交由對于實現類去進行加載。

6.2.1、API分組規則json文件編寫(gateway-sentinel-api-groups.json)

resource目錄創建gateway-sentinel-api-groups.json將API分組規則內容填進去。

[{"apiName": "user服務API組","predicateItems": [{"pattern": "/api-user/user/info","matchStrategy": 0},{"pattern": "/api-user/user/**","matchStrategy": 1}]}
]

解釋:

  • apiName:
    字符串,代表 API 組名稱,這里是 “user服務API組”,用于統一管理相關 API。
  • predicateItems:
    數組,包含多個 predicateItem 對象,用于描述 API 的匹配模式。
  • predicateItem 內部元素:
    • pattern:
      字符串,使用不同風格的表達式。
      例如,“/api-user/user/info” 精確匹配該路徑;“/api-user/user/**” 匹配 /api-user/user/ 下的所有路徑(包括子路徑)。
    • matchStrategy:
      整數,匹配策略:
      0:精確匹配,路徑需與 pattern 完全一致。
      1:前綴匹配,路徑以 pattern 開頭即可。
      2:正則匹配,使用 pattern 作為正則表達式進行匹配。
6.2.2、流控規則json文件編寫(gateway-sentinel-flow-rules.json)

resource目錄創建gateway-sentinel-flow-rules.json將流控規則內容填進去。

[{"resource": "user服務API組","resourceMode": 1,"count": 1,"intervalSec": 1,"burst": 0,"paramItem": null,"controlBehavior": 0,"maxQueueingTimeoutMs": 0},{"resource": "kerwin-user","resourceMode": 0,"count": 1,"intervalSec": 1,"burst": 0,"paramItem": null,"controlBehavior": 0,"maxQueueingTimeoutMs": 0}
]

字段解釋:

  • resource:資源名稱,用于標識要進行流控的目標。可以是路由 ID、自定義 API 分組名稱等。在網關場景中,資源可以代表一個具體的路由或者一組路由的集合。
  • resourceMode:
    • 0:代表資源模式,對應 SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID,表示基于 Route ID 進行資源匹配。
    • 1:API分組模式,對應 SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME,標識基于API分組進行資源匹配。
  • count:流控閾值,根據 grade 字段的不同,其代表的意義也不同。如果 grade 為 QPS 限流,count 表示每秒允許通過的請求數量;如果 grade 為并發線程數限流,count 表示允許的最大并發線程數。
  • grade:流控閾值類型,取值有兩種。1 表示 QPS(每秒查詢率)限流,0 表示并發線程數限流。
  • intervalSec:統計時間窗口,單位為秒。表示在多長時間內統計請求數量以判斷是否觸發流控。
  • controlBehavior:流控效果,即當請求超過閾值時的處理方式
    • 0:快速失敗,請求超過閾值時直接拒絕并拋出異常
    • 2:勻速排隊,請求會進入隊列,按照固定速率處理,避免流量突發
  • burst:僅在 controlBehavior 為 0(快速失敗)時有效,表示突發流量容忍值。在短時間內允許超過閾值的額外請求數量,用于應對突發流量場景。
  • maxQueueingTimeoutMs:僅在 controlBehavior 為 2(勻速排隊)時有效,表示請求在隊列中的最大排隊時間,單位為毫秒。超過該時間的請求將被拒絕。
6.2.3、配置文件配置加載API分組和流控規則json文件

在配置文件中添加API分組和流控規則讀取數據源配置,這里省略了其它Sentinel配置需要可以看之前配置內容添加。

spring:cloud:sentinel:# 設置sentinel為熱加載 默認為falseeager: true# API分組&流控規則配置文件配置datasource:ds1:file:file: classpath:gateway-sentinel-api-groups.jsonruleType: gw-api-group # 網關API分組dataType: jsonds2:file:file: classpath:gateway-sentinel-flow-rules.jsonruleType: gw-flow # 網關流控規則dataType: json

這里就不貼圖了,配置完成后啟動看看Sentinel控制臺是否有初始化這些配置,要記得開啟熱加載。

七、動態監聽Nacos規則配置實時更新流控規則實現(推薦)

通過Nacos配置中心動態拉取加載流控規則和本地配置文件配置是類似的,編寫的規則json是一樣的,只是需要指定一下加載的數據源為Nacos讀取,并且已經實現了動態加載,在Nacos配置中心修改規則會進行實時同步。

7.1、添加sentinel集成nacos包

sentinel讀取nacos配置需要添加這個適配包。

        <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>
7.2、Nacos配置中心添加API分組規則json(gateway-sentinel-api-groups)

配置的內容和本文6.2.1中一致。
在這里插入圖片描述

7.3、Nacos配置中心添加流控規則json(gateway-sentinel-flow-rules)

配置的內容和本文6.2.2中一致。
在這里插入圖片描述

7.4、配置文件配置加載Nacos配置中心API分組和流控規則json
spring:cloud:sentinel:# 設置sentinel為熱加載 默認為falseeager: true# API分組&流控規則配置文件配置datasource:ds1:nacos:server-addr: 172.16.8.169:8848data-id: gateway-sentinel-api-groupsnamespace: springcloud-component-examplegroup-id: DEFAULT_GROUPusername: nacospassword: nacosdata-type: jsonrule-type: gw-api-groupds2:nacos:server-addr: 172.16.8.169:8848data-id: gateway-sentinel-flow-rulesnamespace: springcloud-component-examplegroup-id: DEFAULT_GROUPusername: nacospassword: nacosdata-type: jsonrule-type: gw-flow
7.5、測試效果
  • 1、啟動網關服務,查看注冊API分組和流控規則
    在這里插入圖片描述
  • 2、Nacos配置中心修改流控規則
    在這里插入圖片描述
  • 3、查看sentinel控制臺同步情況
    在這里插入圖片描述

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

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

相關文章

Linux八股【1】-----虛擬內存

參考&#xff1a;小林coding 虛擬內存存在的目的&#xff1f; 為了能夠同時運行多個進程同時進程之間互不干擾 虛擬地址通過MMU找到物理地址 物理內存怎么映射的&#xff1f; 物理內存的映射方法主要有兩種&#xff0c;內存分段和內存分頁 內存分段 把程序的不同區&#…

驚艷呈現:探索數據可視化的藝術與科學

一張圖表真能勝過千言萬語&#xff1f;當超市銷售數據變成跳動的熱力圖&#xff0c;當城市交通擁堵狀況化作流動的光帶&#xff0c;數據可視化正以超乎想象的方式重塑我們認知世界的維度。但你是否想過&#xff0c;那些看似精美直觀的圖表背后&#xff0c;藏著怎樣精密的科學邏…

06-排序

排序 1. 排序的概念及其應用 1.1 排序的概念 排序&#xff1a;所謂排序&#xff0c;就是使一串記錄&#xff0c;按照其中的某個或某些關鍵字的大小&#xff0c;遞增或遞減的排列起來的操作。 穩定性&#xff1a;假定在待排序的記錄序列中&#xff0c;存在多個具有相同的關鍵…

從失效文檔到知識資產:Gitee Wiki 引領研發知識管理變革

在關鍵領域軟件研發的復雜生態中&#xff0c;知識管理正成為制約行業發展的關鍵瓶頸。隨著軟件系統規模不斷擴大、技術棧日益復雜&#xff0c;傳統文檔管理模式已難以滿足現代軟件工廠對知識沉淀、共享和傳承的需求。Gitee Wiki作為新一代知識管理平臺&#xff0c;通過技術創新…

MySQL 性能調優入門 - 慢查詢分析與索引優化基礎

MySQL 性能調優入門 - 慢查詢分析與索引優化基礎 性能問題診斷的通用思路 當數據庫出現性能問題時,切忌盲目猜測或隨意調整參數。一個科學的診斷流程通常包括: 基于數據,而非猜測 (Data-Driven, Not Guesswork):利用我們在上一篇討論的性能監控指標和建立的基線。查看哪些…

8天Python從入門到精通【itheima】-73~74(數據容器“集合”+案例練習)

目錄 73節-集合的基礎定義和操作 1.學習目標 2.為什么要用集合 3.集合的定義 4.關于集合的常用操作 【1】添加新元素&#xff1a;add方法 【2】移除元素&#xff1a;remove方法 【3】隨機取出元素&#xff1a;pop方法 【4】清空集合&#xff1a;clear方法 【5】取出兩…

國芯思辰| AD7894的優質替代方案:SC1424模數轉換器在分布式控制系統中的應用優勢

分布式控制系統將控制任務分散至多個節點&#xff0c;各節點協同工作以實現復雜的控制目標。在這一架構下&#xff0c;系統ADC提出了嚴苛要求。高精度是精準采集各類模擬信號&#xff08;如傳感器輸出的電壓、電流信號&#xff09;的基礎&#xff0c;關乎控制決策的準確性&…

Unity基礎-數學向量

Unity基礎-數學向量 二、向量相關用法 概述 向量在Unity游戲開發中扮演著重要角色&#xff0c;用于表示位置、方向、速度等。Unity提供了Vector2、Vector3等結構體來處理向量運算。 1. 向量基礎操作 1.1 向量創建和訪問 // 創建向量 Vector3 position new Vector3(1, 2,…

Neo4j 數據建模:原理、技術與實踐指南

Neo4j 作為領先的圖數據庫,其核心優勢在于利用圖結構直觀地表達和高效地查詢復雜關系。其數據建模理念與傳統關系型數據庫截然不同,專注于實體(節點)及其連接(關系)。以下基于官方文檔,系統闡述其建模原理、關鍵技術、實用技巧及最佳實踐: 一、 核心原理:以關系為中心…

volka 25個短語動詞

以下是分句分段后的內容&#xff1a; 3,000. Thats 95% of spoken English. And I am teaching you all of these words. First, Ill teach you todays words. And then youll hear them in real conversations. With my brother. Stick around until the end, because witho…

服務器中日志分析的作用都有哪些

服務器日志是用來檢測和排查可疑行為的主要工具&#xff0c;運維團隊可以通過分析和解讀日志文件&#xff0c;發現服務器中潛在的網絡安全威脅或異常活動&#xff0c;下面&#xff0c;就讓小編和大家一起來了解一下服務器中日志分析的作用都有什么吧&#xff01; 對于服務器中的…

嵌入式硬件篇---龍芯2k1000串口

針對串口錯誤 “device reports readiness to read but returned no data (Device disconnected or multiple access on port?)” 的排查和解決方法 硬件方面 檢查連接 確認串口設備(如串口線、連接的模塊等)與龍芯設備之間的物理連接是否牢固,沒有松動、脫落情況。嘗試重新…

基于langchain的簡單RAG的實現

閑來無事&#xff0c;想研究一下RAG的實現流程&#xff0c;看網上用langchain的比較多&#xff0c;我自己在下面也跑了跑&#xff0c;代碼很簡單&#xff0c;以次博客記錄一下&#xff0c;方便回顧 langchain LangChain 是一個基于大型語言模型&#xff08;LLM&#xff09;開發…

視頻監控平臺建設方案

第三方視頻監控平臺是整合視頻監控、門禁、報警等多業務的安防軟件系統,具備兼容性、開放性、多業務整合和多級聯網能力。其核心價值在于兼容友商編解碼設備(如 IPC、DVR)、整合第三方子系統(如報警聯動)、支持多級多域架構(適應平安城市等大規模場景)及提供集中存儲方案…

天機學堂(學習計劃和進度)

經過前面的努力&#xff0c;我們已經完成了《我的課程表》相關的功能的基礎部分&#xff0c;不過還有功能實現的并不完善。還記得昨天給大家的練習題嗎&#xff1f;《查詢我正在學習的課程》&#xff0c;在原型圖中有這樣的一個需求&#xff1a; 我們需要在查詢結果中返回已學習…

軟件項目管理(3) 軟件項目任務分解

一、相關概念 1.任務分解的方法和步驟 &#xff08;1&#xff09;方法 模板參照方法&#xff1a;參照有標準或半標準的任分解結構圖類比方法&#xff1a;任務分解結構圖經常被重復使用&#xff0c;具有相似性自頂向下方法&#xff1a;一般->特殊&#xff0c;演繹推理從大…

Vite 雙引擎架構 —— Esbuild 概念篇

Vite 底層采用 雙引擎架構&#xff0c;核心構建引擎是 Esbuild 和 Rollup&#xff0c;二者在開發和生產環境中分工協作&#xff0c;共同實現高性能構建。不可否認&#xff0c;作為 Vite 的雙引擎之一&#xff0c;Esbuild 在很多關鍵的構建階段(如依賴預編譯、TS 語法轉譯、代碼…

leetcode hot100 鏈表(二)

書接上回&#xff1a; leetcode hot100 鏈表&#xff08;一&#xff09;-CSDN博客 8.刪除鏈表的倒數第N個結點 class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* currhead;int len0;while(curr){currcurr->next;len;}int poslen-n…

Compose Multiplatform 實現自定義的系統托盤,解決托盤亂碼問題

Compose Multiplatform是 JetBrains 開發的聲明式 UI 框架&#xff0c;可讓您為 Android、iOS、桌面和 Web 開發共享 UI。將 Compose Multiplatform 集成到您的 Kotlin Multiplatform 項目中&#xff0c;即可更快地交付您的應用和功能&#xff0c;而無需維護多個 UI 實現。 在…

C++11 Move Constructors and Move Assignment Operators 從入門到精通

文章目錄 一、引言二、基本概念2.1 右值引用&#xff08;Rvalue References&#xff09;2.2 移動語義&#xff08;Move Semantics&#xff09; 三、移動構造函數&#xff08;Move Constructors&#xff09;3.1 定義和語法3.2 示例代碼3.3 使用場景 四、移動賦值運算符&#xff…