springcloud04——網關gateway、熔斷器 sentinel

目錄

注冊中心 nacos | eurekaServer |zookeeper(dubbo)

配置中心 nacos | config Server

遠程服務調用 httpClient | RestTemplate | OpenFeign

負載均衡服務 ribbon | loadbalancer

網關 zuul | gateway

熔斷器 hystrix | sentinel

網關

sentinel

流控

壓測工具

1、作用

2、熔斷

3、降級

配置啟動sentinel

注冊微服務到sentinel

測試流控

降級測試

流控模式詳解

Sentinel 流控效果詳解

hystrix 熔斷器


注冊中心 nacos | eurekaServer |zookeeper(dubbo)

配置中心 nacos | config Server

遠程服務調用 httpClient | RestTemplate | OpenFeign

負載均衡服務 ribbon | loadbalancer

網關 zuul | gateway

熔斷器 hystrix | sentinel

網關

1、統一項目入口 不需要關注每一個微服務的ip和端口,客戶端只需要網關的ip和端口

2、路由功能 轉發請求到達目標服務

網關的配置文件,通過路由鑒權(斷言匹配,路由地址匹配,路徑匹配),滿足規則,轉發請求到目標服務

- id: provider
# ? ? ? ?  uri: http://localhost:8080/  #靜態路由uri: lb://provider ?  #動態路由predicates: ? #斷言匹配- Path=/pro/**filters:- RewritePath=/pro/(?<segment>.*), /p/$\{segment}
# ? ? ? ? ?  - StripPrefix=1  #刪除前綴路徑  刪除一層
# ? ? ? ? ?  - PrefixPath=/p- AddRequestParameter=name,zhangsan

3、過濾無效請求,減少對目標服務器的壓力,可以同時起到安全性作用

4、負載均衡服務器 負載均衡算法(輪詢、隨機) nginx(反向代理和負載均衡服務器)

5、局部過濾器

修改請求路徑 StripPrefix=1 刪除一層路徑

- RewritePath=/pro/(?<segment>.*), /p/${segment} 重寫路徑

添加請求頭 AddRequestHeader

添加請求參數 AddRequestparameter=key,value

6、全局過濾器

package com.hl.filter;
?
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
?
/*
全局過濾器*/
@Component
public class GlobalGatewayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("filter.........");//放行,繼續到達下一個過濾器return chain.filter(exchange);}//數字越小,執行越往前@Overridepublic int getOrder() {return 0;}
}
  • GlobalFilter 全局過濾器,不需要在配置文件中配置,系統初始化時加載,并作用在每個路由上。

  • Spring Cloud Gateway 核心的功能也是通過內置的全局過濾器來完成。

sentinel

限流、降級

資源Sentinel中的核心概念之一。我們說的資源,可以是任何東西,服務,服務里的方法,甚至是一段代碼。最常用的資源是我們代碼中的Java方法。Sentinel提供了@SentinelResource注解用于定義資源,并提供了AspectJ的擴展用于自動定義資源、處理BlockException等。

流控

  • QPS(每秒請求數量):當調用該api的QPS達到閾值的時候,進行限流

  • 線程數:當調用該api的線程數達到閾值的時候,進行限流

壓測工具

壓力測試工具,jmeter

1、作用

  • 為什么要使用熔斷和降級

在一個分布式系統里,一個服務依賴多個服務,可能存在某個服務調用失敗,比如超時、異常等,需要保證在一個依賴出問題的情況下,不會導致整體服務失敗。

2、熔斷

暫時中斷程序,稍后可繼續訪問。

3、降級

走降級方案,返回之前指定的失敗給用戶。(柔性失敗)

避免服務整體崩潰,系統宕機。讓當前方法失敗,返回失敗響應給調用者。

配置啟動sentinel

1、下載安裝包 https://github.com/alibaba/Sentinel/releases

2、啟動(win+r? ? cmd)

java  -Dserver.port=8718  -jar 安裝包路徑/安裝包名稱
?java  -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8719 -jar D:\IDEA2024\sentinel-dashboard-1.8.0.jar

默認用戶名:sentinel

密碼: sentinel

注冊微服務到sentinel

配置文件:

# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 設置配置中心服務端地址
spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,請不要填寫這個值,直接留空即可
# spring.cloud.nacos.config.namespace=
spring.config.import=nacos:product.yml?refresh=true
?
?
?
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
spring.application.name=product
?
?
?
# Nacos認證信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public
?
?
# 應用服務 WEB 訪問端口
server.port=8088
# Sentinel 控制臺地址
spring.cloud.sentinel.transport.dashboard=localhost:8718
# 取消Sentinel控制臺懶加載
# 默認情況下 Sentinel 會在客戶端首次調用的時候進行初始化,開始向控制臺發送心跳包
# 配置 sentinel.eager=true 時,取消Sentinel控制臺懶加載功能
spring.cloud.sentinel.eager=true
# 如果有多套網絡,又無法正確獲取本機IP,則需要使用下面的參數設置當前機器可被外部訪問的IP地址,供admin控制臺使用
# spring.cloud.sentinel.transport.client-ip=

測試流控

@RestController
@RequestMapping("/demo")
public class DemoController {
?@Autowiredprivate DemoService demoService;
?@GetMapping("/bonjour/{name}")public String apiSayHelloLocal(@PathVariable String name) throws Exception {for(int i = 1;i<10;i++){String s1 = demoService.bonjour(name);System.out.println(s1);}return ff;}
@Service
public class DemoService {@SentinelResource(value = "DemoService#bonjour",defaultFallback = "bonjourFallback")public String bonjour(String name) throws Exception {return "Bonjour, " + name;}
?public String bonjourFallback(Throwable t) {if (BlockException.isBlockException(t)) {return "Blocked by Sentinel: " + t.getClass().getSimpleName();}return "Oops, failed: " + t.getClass().getCanonicalName();}
}

降級測試

/** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** ? ?  https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
?
package com.hl.product.demos.sentinel;
?
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
?
/*** @author Eric Zhao*/
@RestController
@RequestMapping("/demo")
public class DemoController {
?@Autowiredprivate DemoService demoService;
?@GetMapping("/bonjour/{name}")public String apiSayHelloLocal(@PathVariable String name) throws Exception {boolean flag = true;String s0 = demoService.bonjour(name,flag);System.out.println(s0);
?flag = false;for(int i = 1;i<10;i++){String s1 = demoService.bonjour(name,flag);System.out.println(s1);}System.out.println("---------------");flag = true;String ff = demoService.bonjour(name,flag);System.out.println(ff);
?return ff;}
?
?
}
/** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** ? ?  https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
?
package com.hl.product.demos.sentinel;
?
import org.springframework.stereotype.Service;
?
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
?
/*** @author Eric Zhao*/
@Service
public class DemoService {@SentinelResource(value = "DemoService#bonjour",defaultFallback = "bonjourFallback")public String bonjour(String name,Boolean flag) throws Exception {if(flag == false){throw new Exception("異常。。。。。。");}return "Bonjour, " + name;}
?public String bonjourFallback(Throwable t) {if (BlockException.isBlockException(t)) {return "Blocked by Sentinel: " + t.getClass().getSimpleName();}return "Oops, failed: " + t.getClass().getCanonicalName();}
}
/** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
package com.hl.product.demos.sentinel;import java.io.PrintWriter;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;/*** @author Eric Zhao*/
@Configuration
public class SentinelWebConfig {@Beanpublic BlockExceptionHandler sentinelBlockExceptionHandler() {return (request, response, e) -> {// 429 Too Many Requestsresponse.setStatus(429);PrintWriter out = response.getWriter();out.print("Oops, blocked by Sentinel: " + e.getClass().getSimpleName());out.flush();out.close();};}
}

流控模式詳解

  1. 直接模式

    • 概念:直接模式是最基本的流控模式。它是對當前資源(接口或方法)本身的請求進行流量控制。當請求到達被保護的資源時,Sentinel 會直接根據設置的規則(如 QPS 閾值、并發線程數閾值等)來判斷是否允許該請求通過。

    • 示例:假設有一個用戶登錄接口/login,設置其 QPS(每秒查詢率)的直接流控閾值為 100。這意味著當每秒請求該/login接口的次數超過 100 時,Sentinel 就會開始進行流量控制,可能會對超出的請求進行限流(如直接拒絕、排隊等待等處理方式)。

    • 應用場景:適用于對單一資源的流量進行簡單直接的控制,比如限制某個核心 API 接口的訪問頻率,以防止該接口被過度調用而導致系統崩潰或性能下降。

  2. 關聯模式

    • 概念:關聯模式是一種相對復雜的流控方式。它主要用于當兩個資源之間存在關聯關系時,通過對其中一個資源的流量控制來間接控制另一個資源的流量。當關聯的資源 A 達到流控閾值時,就會對目標資源 B 進行流量控制。

    • 示例:考慮一個電商系統,有一個商品詳情接口/product/detail和一個購買接口/product/buy。這兩個接口是關聯的,因為用戶在查看商品詳情后可能會進行購買。如果設置/product/detail接口與/product/buy接口為關聯模式,并且當/product/detail的 QPS 達到某個閾值(如 50)時,開始對/product/buy接口進行流量控制,比如限制/product/buy接口的 QPS 為 30。這樣可以防止在商品詳情頁被大量訪問時,購買接口被過度請求而導致庫存系統等后端服務壓力過大。

    • 應用場景:常用于存在先后調用關系或者關聯關系的資源之間,例如在一個業務流程中,前一個步驟的操作頻繁可能會導致后一個步驟的服務壓力過大,通過關聯模式可以提前控制后一個步驟的流量。

  3. 鏈路模式

    • 概念:鏈路模式主要是從調用鏈路的角度進行流量控制。它會根據請求的調用鏈路來判斷是否進行流量控制。在微服務架構或者復雜的分布式系統中,一個請求可能會經過多個服務和方法的調用鏈路。Sentinel 鏈路模式可以針對特定的調用鏈路進行流控,而不是簡單地基于資源本身。

    • 示例:假設有一個分布式系統,包括服務 A、服務 B 和服務 C。服務 A 調用服務 B,服務 B 又調用服務 C。在服務 B 中有一個方法methodB,在鏈路模式下,可以針對從服務 A - 服務 B - 服務 C 這個特定鏈路中對methodB進行流量控制。如果在其他鏈路中也調用了methodB,只要不是這個特定的鏈路,就不受這個鏈路模式下的流控規則限制。

    • 應用場景:特別適用于微服務架構和復雜的分布式系統,能夠精確地對特定的調用鏈路進行流量管理,避免因為某個鏈路的流量過大而影響整個系統的穩定性,同時又不會影響其他鏈路對相同資源的正常調用。

Sentinel 流控效果詳解

Sentinel 流控效果主要有快速失敗、Warm Up 和排隊等待三種,它們的區別如下:

  1. 快速失敗(Fail Fast)

    • 概念

      • 當請求流量超過設定的閾值時,直接拒絕超出的請求。這種方式能夠快速地對超出流量進行限制,以保護后端服務。

    • 示例

      • 假設對一個 API 接口設置的 QPS(每秒查詢率)閾值為 100,當每秒請求數達到 101 時,第 101 個及之后的請求會立即被拒絕,并返回相應的限流錯誤信息,如 HTTP 狀態碼為 429(Too Many Requests)。

    • 應用場景

      • 適用于對系統資源消耗較大,且對請求的實時性要求不是特別高的接口。例如,一些批量數據處理接口,當流量過載時,直接拒絕新請求可以避免系統因過度負載而崩潰。同時,對于一些非關鍵業務的接口,快速失敗可以簡單有效地控制流量,確保核心業務的穩定運行。

  2. Warm Up(預熱)

    • 概念

      • 預熱模式是一種漸進式的流量控制方式。它會根據設定的預熱時長和閾值,在系統啟動或者流量突然增加時,緩慢地增加允許通過的流量,直到達到設定的最大閾值。這樣可以避免系統在冷啟動或者流量突發時,因為瞬間的高負載而出現性能問題。

    • 示例

      • 假設設置一個接口的 QPS 閾值為 100,預熱時長為 5 分鐘。系統啟動時,開始允許通過的 QPS 可能只有 20,然后隨著時間逐漸增加,在 5 分鐘后達到 100。如果在預熱期間流量就超過了當前允許的閾值,超出部分會被拒絕。

    • 應用場景

      • 常用于系統冷啟動后需要逐步加載資源(如緩存預熱、數據庫連接池初始化等)的場景。同時,對于一些具有性能瓶頸,需要一定時間來適應高流量的服務,如數據庫密集型的接口或者計算資源消耗大的算法接口,Warm Up 模式可以讓系統有一個緩沖階段,平穩地過渡到高流量狀態。

  3. 排隊等待(Rate Limiter)

    • 概念

      • 當請求流量超過閾值時,不是直接拒絕請求,而是讓請求進行排隊等待。Sentinel 會按照請求的到達順序,將超出閾值部分的請求放入隊列中,當系統有能力處理新請求時,再從隊列中取出請求進行處理。這樣可以保證請求在一定程度上的公平性,避免大量請求被直接拒絕。

    • 示例

      • 設一個接口的 QPS 閾值為 100,隊列長度為 200。當每秒請求數達到 120 時,其中 20 個請求會被放入隊列中排隊等待。如果系統處理速度能夠跟上,這些排隊的請求會在后續得到處理。

    • 應用場景

      • 適用于對請求響應時間要求相對不那么嚴格,且希望盡可能處理所有請求的場景。比如,對于一些異步任務處理的接口,或者消息隊列消費者接口,排隊等待可以確保請求不會因為瞬間流量高峰而丟失,同時可以在一定程度上平滑流量,提高系統整體的資源利用率。

hystrix 熔斷器

熔斷和降級

熔斷(目標服務不讓訪問,暫時中斷)

降級(目標資源服務訪問時,走降級方法,備份方法,返回特定信息給調用者,避免無限制等待)

熔斷器 有三個狀態: 打開 半開 關閉

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

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

相關文章

XSS跨站腳本攻擊詳解

一、XSS攻擊簡介跨站腳本攻擊的英文全稱是Cross-Site Scripting&#xff0c;為了與CSS有所區別&#xff0c;因此縮寫為“XSS”由于同源策略的存在&#xff0c;攻擊者或者惡意網站的JavaScript代碼沒有辦法直接獲取用戶在其它網站的信息&#xff0c;但是如果攻擊者有辦法把惡意的…

Linux /proc/目錄詳解

文章目錄前言文件說明注意事項前言 在 Linux 系統中&#xff0c;/proc 目錄是一個特殊的虛擬文件系統&#xff0c;它提供了對系統內核和進程的訪問。/proc 目錄中的文件和目錄不是真實存在的&#xff0c;它們是在運行時由內核動態生成的&#xff0c;用于提供系統和進程的相關信…

北斗變形監測在地質災害監測中的應用

內容概要 北斗形變監測系統在地質災害監測領域發揮著核心作用&#xff0c;該系統基于北斗衛星導航技術&#xff0c;實現對地表變形的精確追蹤。通過毫米級精度定位能力&#xff0c;北斗形變監測技術為滑坡等災害提供關鍵數據支撐&#xff0c;尤其在偏遠地區應用中&#xff0c;單…

2025新征程杯全國54校園足球錦標賽在北京世園公園隆重開幕

2025年8月1日&#xff0c;備受矚目的2025新征程杯全國54校園足球錦標賽&#xff08;北京&#xff09;在北京世園公園盛大拉開帷幕。開幕式上&#xff0c;中國關心下一代健康體育基金會副秘書長、中國青少年研究會理事、全國 54 校園足球人才培養計劃創始人何占強主任表示&#…

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測 目錄分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測分類效果基本介紹程序設計分類效果 基本介紹 1.Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測&#xff0c;運…

機器學習——邏輯回歸(LogisticRegression)的核心參數:以約會數據集為例

理解 LogisticRegression 的核心參數&#xff1a;以約會數據集為例 邏輯回歸&#xff08;Logistic Regression&#xff09;是機器學習中一種基礎且重要的分類算法&#xff0c;特別適用于解決二分類和多分類問題。本文將基于 sklearn.linear_model.LogisticRegression 的用法&a…

深入解析 Apache Flink FLIP-511:優化 Kafka Sink 事務處理,減輕 Broker 負載

一、 背景與核心問題&#xff1a;Kafka Sink 事務的痛點 Flink Kafka Sink 在 Exactly-Once 模式下依賴 Kafka 事務來確保數據寫入的原子性&#xff0c;并與 Flink 檢查點對齊。然而&#xff0c;非優雅關閉&#xff08;如任務失敗、非 stop-with-savepoint 的停止&#xff09;會…

設計模式:組合模式 Composite

目錄前言問題解決方案結構代碼前言 組合是一種結構型設計模式&#xff0c;你可以使用它將對象組合成樹狀結構&#xff0c;并且能像使用獨立對象一樣使用它們。 問題 如果應用的核心模型能用樹狀結構表示&#xff0c; 在應用中使用組合模式才有價值。 例如&#xff0c; 你有兩…

嵌入式 C 語言入門:函數封裝與參數傳遞學習筆記 —— 從定義到內存機制

前言 大家好&#xff0c;這里是 Hello_Embed。在前一篇筆記中&#xff0c;我們用循環實現了 LED 閃爍&#xff0c;其中重復使用了兩段幾乎一樣的延時代碼&#xff1a; for(i 0; i < 100000000; i); // 延時這種重復不僅讓代碼冗余&#xff0c;還不利于后續修改&#xff08…

第一個大語言模型的微調

模型推理 現在,我們的模型應該能夠針對輸入的任何短句生成類似尤達大師風格的句子作為回應。 該模型要求其輸入格式規范。我們需要構建一個 “消息” 列表 —— 在這個案例中,就是來自用戶的消息 —— 并通過提示表明輪到模型進行輸出,以促使其做出回答。 add_generation…

Linux內核驅動開發核心問題全解

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry Linux內核驅動開發核心問題全解 本文系統梳理了 Linux 驅動開發、內核同步、中斷處理、內存管理、進程通信、系統啟動等典型…

【C++篇】C++11入門:踏入C++新世界的大門

文章目錄C11簡介列表初始化1. {}初始化2. initializer_list容器initializer_list的使用場景聲明1. auto2. decltype3. nullptrSTL中的變化1. 新容器array容器forward_list容器unordered_map和unordered_set容器2. 新接口C11簡介 C98/03&#xff1a;在2003年C標準委員會曾經提交…

Java 日期時間處理:分類、用途與性能分析

Java提供了多種日期時間處理API&#xff0c;隨著版本演進不斷改進。以下是主要日期時間類的分類、用途和性能分析&#xff1a;一、Java日期時間API分類1. 傳統日期時間API (Java 1.0/1.1)java.util.Date - 表示特定的瞬間&#xff0c;精確到毫秒java.util.Calendar - 抽象類&am…

[Linux]學習筆記系列 --GCC

文章目錄屬性__cleanup__attribute_malloc__ 用于標記函數返回一個新分配的內存塊__attribute_alloc_size__ 用于指定分配的內存大小__attribute__((const)) 標記為純函數(pure function)__attribute__((__externally_visible__)) 使其在編譯器優化過程中保持對外部模塊的可見性…

【龍澤科技】汽車維護與底盤拆裝檢修仿真教學軟件【風光580】

產品簡介汽車維護與底盤拆裝檢修仿真教學軟件是依托《全國職業院校技能大賽》“汽車維修”賽項中“汽車維護與底盤拆裝檢修模塊”競賽模塊&#xff0c;自主開發的一款仿真教學軟件。軟件采用仿真仿真技術模擬實際汽車維修工的崗位技能操作流程&#xff0c;操作內容主要包括&…

Spring之【循環引用】

目錄前置知識SingletonBeanRegistryDefaultSingletonBeanRegistrySpring中處理循環引用的流程分析定義兩個具有循環引用特點的Bean執行A的實例化執行A的屬性填充(執行過程中發現A依賴B&#xff0c;就去執行B的實例化邏輯)執行B的實例化執行B的屬性填充執行B的初始化執行A的屬性…

LRU緩存淘汰算法的詳細介紹與具體實現

LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;是一種基于時間局部性原理的緩存淘汰策略。其核心思想是&#xff1a;最近被訪問的數據在未來更可能被再次使用&#xff0c;而最久未被訪問的數據應優先被淘汰&#xff0c;從而在有限的緩存空間內保留高…

JS-第十九天-事件(一)

一、事件基礎概念1.1 事件三要素事件源&#xff1a;觸發事件的元素事件類型&#xff1a;事件的種類&#xff08;如click、mouseover等&#xff09;事件處理程序&#xff1a;響應事件的函數1.2 事件流機制事件傳播分為三個階段&#xff1a;捕獲階段&#xff1a;事件從頂層開始&a…

Matplotlib(三)- 圖表輔助元素

文章目錄一、圖表輔助元素簡介二、坐標軸的標簽、刻度范圍和刻度標簽1. 坐標軸標簽1.1 x軸標簽1.2 y軸標簽1.3 示例&#xff1a;繪制天氣氣溫折線圖2. 刻度范圍和刻度標簽2.1 刻度范圍2.1.1 x軸刻度范圍2.1.2 y軸刻度范圍2.2 刻度標簽2.2.1 x軸刻度標簽2.2.2 y軸刻度標簽2.3 示…

【Linux基礎知識系列】第七十八篇 - 初識Nmap:網絡掃描工具

在網絡管理和安全領域&#xff0c;網絡掃描是一個不可或缺的工具。它可以幫助網絡管理員了解網絡中的設備、服務以及潛在的安全漏洞。Nmap&#xff08;Network Mapper&#xff09;是一個功能強大的開源網絡掃描工具&#xff0c;它能夠快速發現網絡中的主機、端口和服務&#xf…