目录

注册中心 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…