Java RPC框架的接口预热原理及无损实现

在这里插入图片描述

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀

🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。

💡 无论你是刚刚踏入编程世界的新人,还是希望进一步提升自己的资深开发者,在这里都能找到适合你的内容。我们共同探讨技术难题,一起进步,携手度过互联网行业的每一个挑战

📣 如果你觉得我的文章对你有帮助,请不要吝啬你的点赞👍分享💕和评论哦! 让我们一起打造一个充满正能量的技术社区吧!


目录标题

    • 1 引言 🚀
    • 2 什么是RPC接口预热?
      • 2.1 定义
      • 2.2 重要性
    • 3 接口预热的实现原理
      • 3.1 服务注册与发现
      • 3.2 健康检查
      • 3.3 流量控制
      • 3.4 预热标记
    • 4 接口预热的实现步骤
      • 4.1 服务启动
      • 4.2 设置预热标记
      • 4.3 接口预热
      • 4.4 健康检查
      • 4.5 清除预热标记
      • 4.6 流量控制
      • 4.7 监控与报警
    • 5 无损实现
      • 5.1 无损预热的关键点
      • 5.2 无损预热的实现步骤
    • 6 总结


1 引言 🚀

在分布式系统中,RPC(Remote Procedure Call,远程过程调用)框架是实现服务间通信的重要工具。服务启动后立即接收大量流量可能会导致性能问题或服务不可用。因此,RPC框架通常会实现接口预热机制,确保服务在正式接收流量之前已经达到了最佳运行状态。本文将详细讲解Java RPC框架的接口预热原理及其无损实现,帮助你更好地理解和应用这一机制。🚀

2 什么是RPC接口预热?

2.1 定义

RPC接口预热是指在服务启动后,通过一系列的操作使服务的接口达到最佳的运行状态,从而提高系统的稳定性和性能。预热的主要目的是确保服务在正式接收流量之前已经完成了所有的初始化工作,避免因为初始化不充分导致的服务不可用或性能下降。🔥

2.2 重要性

  • 提高系统稳定性:预热可以确保服务在启动初期就进入最佳状态,减少因初始化不充分导致的错误。
  • 优化性能:通过预热,可以提前加载必要的资源,减少首次请求的响应时间,提升用户体验。
  • 负载均衡:预热可以帮助负载均衡器更准确地评估各个节点的健康状态,合理分配流量。

3 接口预热的实现原理

3.1 服务注册与发现

  • 服务注册:服务启动后,向服务注册中心注册自身的信息,包括IP地址、端口号等。
  • 健康状态上报:服务启动后,定期向服务注册中心上报自身的健康状态。
  • 服务发现:客户端通过服务注册中心获取健康的服务列表,进行请求。

3.2 健康检查

  • 心跳检测:通过定期发送心跳包,检测服务的健康状态。
  • 状态报告:服务启动后,向监控系统报告自身的状态,包括CPU、内存、磁盘使用情况等。
  • 接口测试:调用服务的关键接口,验证接口的可用性。

3.3 流量控制

  • 限流:在预热阶段,可以设置较低的QPS(每秒查询率),逐步增加流量,确保服务能够平稳过渡到高负载状态。
  • 熔断:如果在预热过程中发现服务异常,立即触发熔断机制,停止流量的进一步流入。

3.4 预热标记

  • 预热标记:服务启动后,设置一个预热标记,表示服务正在预热中。
  • 预热完成:当预热完成后,清除预热标记,表示服务已经准备好。
  • 流量控制:负载均衡器和客户端在调度流量时,会检查节点的预热标记,只将流量分配到预热完成的节点。

4 接口预热的实现步骤

4.1 服务启动

  1. 基础初始化:启动服务,执行基础的初始化操作,如读取配置文件、初始化日志系统等。
    @SpringBootApplication
    public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
    }
    

4.2 设置预热标记

  1. 预热标记:在服务启动后,设置一个预热标记,表示服务正在预热中。
    # application.properties
    preheat=true
    

4.3 接口预热

  1. 调用关键接口:在预热阶段,调用服务的关键接口,验证接口的可用性。
    @Component
    public class PreheatRunner implements ApplicationRunner {@Autowiredprivate RestTemplate restTemplate;@Value("${service.url}")private String serviceUrl;@Value("${preheat}")private boolean isPreheating;@Autowiredprivate Environment environment;@Overridepublic void run(ApplicationArguments args) throws Exception {if (isPreheating) {// 调用关键接口进行预热ResponseEntity<String> response = restTemplate.getForEntity(serviceUrl + "/health", String.class);if (response.getStatusCode().is2xxSuccessful()) {logger.info("Preheat completed, key interfaces are available.");// 清除预热标记ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment) environment;configurableEnvironment.getPropertySources().remove("preheat");System.setProperty("preheat", "false");logger.info("Preheat completed, ready to receive traffic.");} else {logger.error("Health check failed, preheat not completed.");}}}
    }
    

4.4 健康检查

  1. 心跳检测:通过定期发送心跳包,检测服务的健康状态。

    @Component
    public class HeartbeatTask {@Value("${service.url}")private String serviceUrl;@Scheduled(fixedRate = 10000) // 每10秒执行一次public void heartbeat() {try {ResponseEntity<String> response = restTemplate.getForEntity(serviceUrl + "/health", String.class);if (response.getStatusCode().is2xxSuccessful()) {logger.info("Heartbeat successful.");} else {logger.warn("Heartbeat failed.");}} catch (Exception e) {logger.error("Heartbeat error: " + e.getMessage());}}
    }
    
  2. 状态报告:服务启动后,向监控系统报告自身的状态,包括CPU、内存、磁盘使用情况等。

    @RestController
    public class HealthController {@GetMapping("/health")public Map<String, String> health() {Map<String, String> healthMap = new HashMap<>();healthMap.put("status", "UP");healthMap.put("cpu", getCpuUsage());healthMap.put("memory", getMemoryUsage());healthMap.put("disk", getDiskUsage());return healthMap;}private String getCpuUsage() {// 获取CPU使用情况return "0.1"; // 示例值}private String getMemoryUsage() {// 获取内存使用情况return "0.2"; // 示例值}private String getDiskUsage() {// 获取磁盘使用情况return "0.3"; // 示例值}
    }
    

4.5 清除预热标记

  1. 预热完成:当预热完成后,清除预热标记,表示服务已经准备好。
    @Component
    public class PreheatRunner implements ApplicationRunner {@Autowiredprivate RestTemplate restTemplate;@Value("${service.url}")private String serviceUrl;@Value("${preheat}")private boolean isPreheating;@Autowiredprivate Environment environment;@Overridepublic void run(ApplicationArguments args) throws Exception {if (isPreheating) {// 调用关键接口进行预热ResponseEntity<String> response = restTemplate.getForEntity(serviceUrl + "/health", String.class);if (response.getStatusCode().is2xxSuccessful()) {logger.info("Preheat completed, key interfaces are available.");// 清除预热标记ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment) environment;configurableEnvironment.getPropertySources().remove("preheat");System.setProperty("preheat", "false");logger.info("Preheat completed, ready to receive traffic.");} else {logger.error("Health check failed, preheat not completed.");}}}
    }
    

4.6 流量控制

  1. 限流:设置限流策略,逐步增加流量,确保服务平稳过渡到高负载状态。

    @Configuration
    public class RateLimiterConfig {@Beanpublic RateLimiter rateLimiter() {return RateLimiter.create(1.0); // 每秒1个请求}@Beanpublic FilterRegistrationBean<RateLimitFilter> rateLimitFilter(RateLimiter rateLimiter) {FilterRegistrationBean<RateLimitFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new RateLimitFilter(rateLimiter));registrationBean.addUrlPatterns("/*");registrationBean.setOrder(1);return registrationBean;}
    }public class RateLimitFilter implements Filter {private final RateLimiter rateLimiter;public RateLimitFilter(RateLimiter rateLimiter) {this.rateLimiter = rateLimiter;}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {if (rateLimiter.tryAcquire()) {chain.doFilter(request, response);} else {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());httpResponse.getWriter().write("Too many requests");}}
    }
    
  2. 熔断:如果在预热过程中发现服务异常,立即触发熔断机制,停止流量的进一步流入。

    @Configuration
    public class CircuitBreakerConfig {@Beanpublic CircuitBreakerFactory circuitBreakerFactory() {Resilience4JCircuitBreakerFactory circuitBreakerFactory = new Resilience4JCircuitBreakerFactory();circuitBreakerFactory.configureDefault(id -> CircuitBreakerConfig.custom().slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED).slidingWindowSize(10).minimumNumberOfCalls(5).failureRateThreshold(50).waitDurationInOpenState(Duration.ofMillis(1000)).permittedNumberOfCallsInHalfOpenState(3).build());return circuitBreakerFactory;}
    }@RestController
    public class MyController {@Autowiredprivate CircuitBreakerFactory circuitBreakerFactory;@GetMapping("/data")public String getData() {CircuitBreaker circuitBreaker = circuitBreakerFactory.create("myCircuitBreaker");return circuitBreaker.run(() -> {// 调用远程服务return restTemplate.getForObject("http://remote-service/data", String.class);}, throwable -> "Fallback data");}
    }
    

4.7 监控与报警

  1. 持续监控:在整个预热过程中,持续监控服务的状态,如有异常立即报警。

    @Configuration
    public class PrometheusConfig {@Beanpublic MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {return registry -> registry.config().commonTags("application", "my-app");}
    }@RestController
    public class MetricsController {@Autowiredprivate MeterRegistry meterRegistry;@GetMapping("/metrics")public Map<String, Object> metrics() {Map<String, Object> metricsMap = new HashMap<>();meterRegistry.forEachMeter(meter -> {metricsMap.put(meter.getId().getName(), meter.measure().get(0).getValue());});return metricsMap;}
    }
    
  2. 报警工具:使用报警工具(如Alertmanager、Email、SMS)。

    # alertmanager.yml
    global:resolve_timeout: 5mroute:group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 1hreceiver: 'email'receivers:- name: 'email'email_configs:- to: 'your-email@example.com'from: 'alertmanager@example.com'smarthost: 'smtp.example.com:587'auth_username: 'alertmanager'auth_password: 'password'
    

5 无损实现

5.1 无损预热的关键点

  • 平滑过渡:在预热阶段,逐步增加流量,确保服务能够平稳过渡到高负载状态。
  • 熔断机制:如果在预热过程中发现服务异常,立即触发熔断机制,停止流量的进一步流入。
  • 健康检查:通过定期发送心跳包和调用关键接口,确保服务的健康状态。

5.2 无损预热的实现步骤

  1. 设置预热标记:在服务启动后,设置一个预热标记,表示服务正在预热中。

    preheat=true
    
  2. 调用关键接口:在预热阶段,调用服务的关键接口,验证接口的可用性。

    @Component
    public class PreheatRunner implements ApplicationRunner {@Autowiredprivate RestTemplate restTemplate;@Value("${service.url}")private String serviceUrl;@Value("${preheat}")private boolean isPreheating;@Autowiredprivate Environment environment;@Overridepublic void run(ApplicationArguments args) throws Exception {if (isPreheating) {// 调用关键接口进行预热ResponseEntity<String> response = restTemplate.getForEntity(serviceUrl + "/health", String.class);if (response.getStatusCode().is2xxSuccessful()) {logger.info("Preheat completed, key interfaces are available.");// 清除预热标记ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment) environment;configurableEnvironment.getPropertySources().remove("preheat");System.setProperty("preheat", "false");logger.info("Preheat completed, ready to receive traffic.");} else {logger.error("Health check failed, preheat not completed.");}}}
    }
    
  3. 逐步增加流量:在预热阶段,逐步增加流量,确保服务能够平稳过渡到高负载状态。

    @Configuration
    public class RateLimiterConfig {@Beanpublic RateLimiter rateLimiter() {return RateLimiter.create(1.0); // 每秒1个请求}@Beanpublic FilterRegistrationBean<RateLimitFilter> rateLimitFilter(RateLimiter rateLimiter) {FilterRegistrationBean<RateLimitFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new RateLimitFilter(rateLimiter));registrationBean.addUrlPatterns("/*");registrationBean.setOrder(1);return registrationBean;}
    }public class RateLimitFilter implements Filter {private final RateLimiter rateLimiter;public RateLimitFilter(RateLimiter rateLimiter) {this.rateLimiter = rateLimiter;}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {if (rateLimiter.tryAcquire()) {chain.doFilter(request, response);} else {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());httpResponse.getWriter().write("Too many requests");}}
    }
    
  4. 健康检查:通过定期发送心跳包和调用关键接口,确保服务的健康状态。

    @Component
    public class HeartbeatTask {@Value("${service.url}")private String serviceUrl;@Scheduled(fixedRate = 10000) // 每10秒执行一次public void heartbeat() {try {ResponseEntity<String> response = restTemplate.getForEntity(serviceUrl + "/health", String.class);if (response.getStatusCode().is2xxSuccessful()) {logger.info("Heartbeat successful.");} else {logger.warn("Heartbeat failed.");}} catch (Exception e) {logger.error("Heartbeat error: " + e.getMessage());}}
    }@RestController
    public class HealthController {@GetMapping("/health")public Map<String, String> health() {Map<String, String> healthMap = new HashMap<>();healthMap.put("status", "UP");healthMap.put("cpu", getCpuUsage());healthMap.put("memory", getMemoryUsage());healthMap.put("disk", getDiskUsage());return healthMap;}private String getCpuUsage() {// 获取CPU使用情况return "0.1"; // 示例值}private String getMemoryUsage() {// 获取内存使用情况return "0.2"; // 示例值}private String getDiskUsage() {// 获取磁盘使用情况return "0.3"; // 示例值}
    }
    
  5. 清除预热标记:当预热完成后,清除预热标记,表示服务已经准备好。

    @Component
    public class PreheatRunner implements ApplicationRunner {@Autowiredprivate RestTemplate restTemplate;@Value("${service.url}")private String serviceUrl;@Value("${preheat}")private boolean isPreheating;@Autowiredprivate Environment environment;@Overridepublic void run(ApplicationArguments args) throws Exception {if (isPreheating) {// 调用关键接口进行预热ResponseEntity<String> response = restTemplate.getForEntity(serviceUrl + "/health", String.class);if (response.getStatusCode().is2xxSuccessful()) {logger.info("Preheat completed, key interfaces are available.");// 清除预热标记ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment) environment;configurableEnvironment.getPropertySources().remove("preheat");System.setProperty("preheat", "false");logger.info("Preheat completed, ready to receive traffic.");} else {logger.error("Health check failed, preheat not completed.");}}}
    }
    
  6. 流量控制:负载均衡器和客户端在调度流量时,会检查节点的预热标记,只将流量分配到预热完成的节点。

    upstream backend {server 192.168.1.1:8080;server 192.168.1.2:8080;# 健康检查health_check;
    }server {listen 80;location / {proxy_pass http://backend;}
    }
    

6 总结

通过本文的介绍,我们详细了解了Java RPC框架的接口预热原理及其无损实现。预热机制不仅可以提高系统的稳定性和性能,还能确保负载均衡器更准确地评估各个节点的健康状态。希望本文的内容对你在面试中应对相关问题有所帮助。🌟

乐于分享和输出干货的WXGZG:JavaPersons

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的强,软,弱,虚引用介绍以及应用

写在前面 本文看下Java的强&#xff0c;软&#xff0c;弱&#xff0c;虚引用相关内容。 1&#xff1a;各种引用介绍 顶层类是java.lang.ref.Reference,注意是一个抽象类&#xff0c;而不是接口&#xff0c;其中比较重要的引用队列ReferenceQueue就在该类中定义&#xff0c;子…

已有docker增加端口号,不用重新创建Docker

已有docker增加端口号&#xff0c;不用重新创建Docker 1. 整体描述2. 具体实现2.1 查看容器id2.2 停止docker服务2.3 修改docker配置文件2.4 重启docker服务 3. 总结 1. 整体描述 docker目前使用的非常多&#xff0c;但是每次更新都需要重新创建docker&#xff0c;也不太方便&…

jmeter常用配置元件介绍总结之断言

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

OpenLayers教程12_WebGL自定义着色器:实现高级渲染效果

在 OpenLayers 中使用 WebGL 自定义着色器实现高级渲染效果 目录 一、引言二、WebGL 自定义着色器的优势三、示例应用&#xff1a;实现动态渲染效果 1. 项目结构2. 主要代码实现3. 运行与效果 四、代码讲解与扩展 1. 动态圆的半径和填充颜色2. 动态透明度与边框效果 五、总结…

Axure二级菜单下拉交互实例

1.使用boxlabe进行基础布局 2.设置鼠标悬浮和选中状态 3.转换为动态面板 选中所有二级菜单,进行按钮组转换 选中所有二级菜单,进行动态面板转换 4.给用户管理增加显示/隐藏事件 1)选择toggle代表上拉和下拉切换加载 2)勾选Bring to Front,并选择Push/Pull Widgets代表收缩时…

SpringSecurity+OAuth2权限管理

Spring Security 零 介绍 功能&#xff1a; 身份认证&#xff08;authentication&#xff09; 授权&#xff08;authorization&#xff09; 防御常见攻击&#xff08;protection against common attacks&#xff09; 身份认证&#xff1a; 身份认证是验证谁正在访问系统资…

为什么芯麦的 GC4931P 可以替代A4931/Allegro 的深度对比介绍

在电机驱动芯片领域&#xff0c;芯麦 GC4931P 和 A4931 都是备受关注的产品。它们在多种应用场景中发挥着关键作用&#xff0c;今天我们就来详细对比一下这两款芯片。 一、性能参数对比 &#xff08;一&#xff09;电流输出能力 A4931 具有一定的电流输出能力&#xff0c;但芯…

ThreadLocal原理及其内存泄漏

ThreadLocal通过为每个线程创建一个共享变量的副本来保证各个线程之间变量的访问和修改互不影响。 ThreadLocal存放的值是线程内共享的&#xff0c;线程间互斥的&#xff0c;主要用于线程内共享数据&#xff0c;避免通过参数传递。 ThreadLocal有四个方法&#xff1a; initialV…

工业大数据分析与应用:开启智能制造新时代

在全球工业4.0浪潮的推动下&#xff0c;工业大数据分析已经成为推动智能制造、提升生产效率和优化资源配置的重要工具。通过收集、存储、处理和分析海量工业数据&#xff0c;企业能够获得深刻的业务洞察&#xff0c;做出更明智的决策&#xff0c;并实现生产流程的全面优化。本文…

web安全测试渗透案例知识点总结(上)——小白入狱

目录 一、Web安全渗透测试概念详解1. Web安全与渗透测试2. Web安全的主要攻击面与漏洞类型3. 渗透测试的基本流程 二、知识点详细总结1. 常见Web漏洞分析2. 渗透测试常用工具及其功能 三、具体案例教程案例1&#xff1a;SQL注入漏洞利用教程案例2&#xff1a;跨站脚本&#xff…

每天五分钟机器学习:支持向量机算法数学基础之核函数

本文重点 从现在开始,我们将开启支持向量机算法的学习,不过在学习支持向量机算法之前,我们先来学习一些支持向量机所依赖的数学知识,这会帮助我们更加深刻的理解支持向量机算法,本文我们先来学习核函数。 定义 核函数(Kernel Function)是一种在支持向量机(SVM)、高…

【小程序】dialog组件

这个比较简单 我就直接上代码了 只需要传入title即可&#xff0c; 内容部分设置slot 代码 dialog.ttml <view class"dialog-wrapper" hidden"{{!visible}}"><view class"mask" /><view class"dialog"><view …

【MySQL】ubantu 系统 MySQL的安装与免密码登录的配置

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;MySQL初阶探索&#xff1a;构建数据库基础 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;mysql的安装&#x1f4d5;MySQL的登录&#x1f30f;MySQL配置免密码登录 &#x1f4da;mysql的…

Dubbo源码解析-服务注册(五)

一、服务注册 当确定好了最终的服务配置后&#xff0c;Dubbo就会根据这些配置信息生成对应的服务URL&#xff0c;比如&#xff1a; dubbo://192.168.65.221:20880/org.apache.dubbo.springboot.demo.DemoService? applicationdubbo-springboot-demo-provider&timeout300…

计算机网络-理论部分(二):应用层

网络应用体系结构 Client-Server客户-服务器体系结构&#xff1a;如Web&#xff0c;FTP&#xff0c;Telnet等Peer-Peer&#xff1a;点对点P2P结构&#xff0c;如BitTorrent 应用层协议定义了&#xff1a; 交换的报文类型&#xff0c;请求or响应报文类型的语法字段的含义如何…

麒麟时间同步搭建chrony服务器

搭建chrony服务器 在本例中&#xff0c;kyserver01&#xff08;172.16.200.10&#xff09;作为客户端&#xff0c;同步服务端时间&#xff1b;kyserver02&#xff08;172.16.200.11&#xff09;作为服务端&#xff0c;提供时间同步服务。 配置服务端&#xff0c;修改以下内容…

学习threejs,通过SkinnedMesh来创建骨骼和蒙皮动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.SkinnedMesh 蒙皮网格…

HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案概述

一、习惯推荐是HarmonyOS学习用户的行为习惯后做出的主动预测推荐。 1.开发者将用户在应用/元服务内的使用行为向HarmonyOS共享&#xff0c;使得HarmonyOS可以基于共享的数据学习用户的行为习惯。 2.在HarmonyOS学习到用户的行为习惯后&#xff0c;会给用户推荐相应功能&#x…

华为防火墙技术基本概念学习笔记

1.防火墙概述 1.1防火墙与交换机、路由器对比 路由器与交换机的本质是转发&#xff0c;防火墙的本质是控制。 防火墙与路由器、交换机是有区别的。路由器用来连接不同的网络&#xff0c;通过路由协议保证互联互通&#xff0c;确保将报文转发到目的地;交换机则通常用来组建局域…

shell(5)字符串运算符和逻辑运算符

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…