.NET Polly 全面指南:从5W2H维度深度解析

news/2025/9/22 15:10:41/文章来源:https://www.cnblogs.com/talentzemin/p/19105321

🎯 What - 什么是 Polly?

Polly 是一个专为 .NET 生态系统设计的开源弹性和容错处理库,它采用了现代化的流畅API设计,为开发者提供了处理瞬时故障的强大工具。Polly 的核心理念是帮助应用程序在面对不可避免的网络故障、服务中断和资源竞争时保持稳定运行。

核心概念

Polly 基于"策略模式"构建,将故障处理逻辑封装到可重用的策略对象中。这些策略可以单独使用,也可以组合使用,形成复杂的弹性处理链。

主要的策略类型包括:

  • 重试策略(Retry) - 自动重试失败的操作
  • 熔断器策略(Circuit Breaker) - 防止级联故障的保护机制
  • 超时策略(Timeout) - 控制操作的最大执行时间
  • 隔舱策略(Bulkhead) - 资源隔离,防止资源耗尽
  • 缓存策略(Cache) - 缓存成功的结果,减少重复调用
  • 降级策略(Fallback) - 提供失败时的备选方案
  • 限流策略(Rate Limiting) - 控制操作的执行频率

🤔 Why - 为什么需要 Polly?

现代分布式系统的挑战

在微服务架构和云计算时代,应用程序越来越依赖外部服务和网络通信。这种架构虽然带来了灵活性和可扩展性,但同时也引入了新的故障点和复杂性。

常见问题场景

  1. 网络不稳定

    • 网络延迟波动
    • 间歇性连接中断
    • DNS解析失败
  2. 服务依赖问题

    • 第三方API服务不稳定
    • 数据库连接池耗尽
    • 下游服务临时不可用
  3. 资源竞争

    • 高并发场景下的资源争用
    • 内存或CPU资源不足
    • 数据库锁竞争
  4. 部署和运维挑战

    • 滚动更新过程中的服务中断
    • 负载均衡器配置变更
    • 基础设施维护窗口

Polly 解决的核心问题

提升系统弹性:通过自动化的故障处理机制,减少人工干预需求,提高系统的自愈能力。

改善用户体验:避免因瞬时故障导致的用户请求失败,通过重试、降级等策略保证服务的连续性。

降低运维成本:减少因偶发故障引起的告警和紧急处理需求,让团队专注于真正需要关注的问题。

保护系统稳定性:通过熔断器和隔舱策略,防止局部故障扩散为系统性故障。


👥 Who - 谁在使用 Polly?

目标用户群体

企业级应用开发者

  • 金融服务公司:处理支付、交易等关键业务流程
  • 电商平台:确保订单处理和库存管理的可靠性
  • SaaS服务提供商:保证多租户环境下的服务稳定性

微服务架构团队

  • 云原生应用开发团队
  • DevOps工程师
  • 系统架构师

开源社区贡献者

  • 来自微软、Stack Overflow、GitHub等知名公司的工程师
  • 全球.NET社区的活跃开发者

行业应用案例

Microsoft:在多个内部服务中使用Polly处理Azure服务调用的弹性问题。

Stack Overflow:使用Polly提升其高流量网站的稳定性和响应能力。

GitHub:在其.NET服务中集成Polly来处理第三方API调用的可靠性。


📍 Where - 在哪些场景使用?

HTTP客户端调用

// 处理Web API调用的网络故障
var httpPolicy = Policy.Handle<HttpRequestException>().WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));var response = await httpPolicy.ExecuteAsync(async () =>
{return await httpClient.GetAsync("https://api.example.com/data");
});

数据库操作

// 处理数据库连接超时和死锁
var dbPolicy = Policy.Handle<SqlException>(ex => ex.Number == 2 || ex.Number == 1205).WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromMilliseconds(100 * retryAttempt));await dbPolicy.ExecuteAsync(async () =>
{await dbContext.SaveChangesAsync();
});

微服务间通信

// 服务间调用的熔断保护
var circuitBreakerPolicy = Policy.Handle<Exception>().CircuitBreakerAsync(3, TimeSpan.FromMinutes(1));var combinedPolicy = Policy.WrapAsync(retryPolicy, circuitBreakerPolicy);

资源密集型操作

// 限制并发执行数量
var bulkheadPolicy = Policy.BulkheadAsync(10, 5);await bulkheadPolicy.ExecuteAsync(async () =>
{// 执行资源密集型操作await ProcessLargeDataSet();
});

云服务集成场景

AWS服务调用:处理Lambda函数冷启动、S3存储访问限制等问题。

Azure服务调用:应对Azure Functions的并发限制、Cosmos DB的限流等情况。

第三方SaaS集成:处理支付网关、邮件服务、短信服务等第三方API的不稳定问题。


⏰ When - 什么时候使用?

设计阶段

在系统架构设计初期,就应该考虑集成Polly:

  • 识别系统中的外部依赖点
  • 评估各依赖服务的稳定性风险
  • 设计相应的弹性策略

开发阶段

在编写涉及外部调用的代码时:

  • HTTP客户端初始化时配置策略
  • 数据库访问层集成重试机制
  • 消息队列操作添加容错处理

生产环境监控

根据生产环境的实际表现调整策略:

  • 监控重试成功率和失败模式
  • 根据错误日志优化策略参数
  • 定期评估和更新策略配置

故障响应

在发生生产故障时:

  • 临时调整策略参数应对突发情况
  • 通过策略组合快速实施降级方案
  • 利用熔断器避免故障扩散

性能调优

在系统性能优化过程中:

  • 使用缓存策略减少重复调用
  • 通过隔舱策略优化资源利用
  • 调整超时策略改善响应时间

🛠️ How - 如何使用 Polly?

安装和配置

NuGet包安装

# 核心包
Install-Package Polly# HTTP集成包
Install-Package Microsoft.Extensions.Http.Polly# 依赖注入支持
Install-Package Polly.Extensions.Http

基本配置

public void ConfigureServices(IServiceCollection services)
{// 注册HttpClient with Polly策略services.AddHttpClient<MyApiClient>().AddPolicyHandler(GetRetryPolicy()).AddPolicyHandler(GetCircuitBreakerPolicy());
}private static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{return HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(retryCount: 3,sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),onRetry: (outcome, timespan, retryCount, context) =>{Console.WriteLine($"重试第 {retryCount} 次,等待 {timespan} 秒");});
}

策略详解和最佳实践

1. 重试策略(Retry Policy)

基础重试

// 固定间隔重试
var retryPolicy = Policy.Handle<HttpRequestException>().RetryAsync(3, onRetry: (exception, retryCount) =>{Console.WriteLine($"重试 #{retryCount}: {exception.Message}");});// 指数退避重试
var exponentialRetry = Policy.Handle<HttpRequestException>().WaitAndRetryAsync(retryCount: 5,sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)) + TimeSpan.FromMilliseconds(Random.Next(0, 100)), // 添加抖动onRetry: (exception, timeSpan, retryCount, context) =>{Console.WriteLine($"第 {retryCount} 次重试,延迟 {timeSpan}");});

条件重试

var conditionalRetry = Policy.Handle<SqlException>(ex => ex.Number == 2 ||     // 超时ex.Number == 1205 ||  // 死锁ex.Number == 1222)    // 锁请求超时.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromMilliseconds(100 * retryAttempt));

2. 熔断器策略(Circuit Breaker)

var circuitBreakerPolicy = Policy.Handle<HttpRequestException>().CircuitBreakerAsync(handledEventsAllowedBeforeBreaking: 3,  // 连续失败3次后熔断durationOfBreak: TimeSpan.FromMinutes(1), // 熔断持续1分钟onBreak: (exception, duration) =>{Console.WriteLine($"熔断器开启,持续时间:{duration}");},onReset: () =>{Console.WriteLine("熔断器重置");},onHalfOpen: () =>{Console.WriteLine("熔断器半开状态,尝试恢复");});

3. 超时策略(Timeout Policy)

// 悲观超时(会取消操作)
var pessimisticTimeout = Policy.TimeoutAsync(10, TimeoutStrategy.Pessimistic);// 乐观超时(仅等待结果)
var optimisticTimeout = Policy.TimeoutAsync(10, TimeoutStrategy.Optimistic);// 结合使用
var combinedPolicy = Policy.WrapAsync(pessimisticTimeout, retryPolicy);

4. 隔舱策略(Bulkhead Policy)

// 限制并发执行
var bulkheadPolicy = Policy.BulkheadAsync(maxParallelization: 10,    // 最大并发数maxQueuingActions: 5,      // 最大排队数onBulkheadRejectedAsync: context =>{Console.WriteLine("请求被隔舱策略拒绝");return Task.CompletedTask;});

5. 缓存策略(Cache Policy)

// 内存缓存
var memoryCache = new MemoryCache(new MemoryCacheOptions());
var cacheProvider = new MemoryCacheProvider(memoryCache);var cachePolicy = Policy.CacheAsync(cacheProvider, TimeSpan.FromMinutes(5),(context, key) => Console.WriteLine($"缓存未命中:{key}"));

6. 降级策略(Fallback Policy)

var fallbackPolicy = Policy.Handle<HttpRequestException>().FallbackAsync(fallbackAction: async (context) =>{// 返回默认值或从缓存获取return await GetCachedDataAsync();},onFallbackAsync: async (exception, context) =>{Console.WriteLine($"执行降级策略:{exception.Message}");});

策略组合(Policy Wrap)

// 创建策略链:降级 -> 熔断器 -> 重试 -> 超时
var policyWrap = Policy.WrapAsync(fallbackPolicy,      // 最外层circuitBreakerPolicy,retryPolicy,timeoutPolicy        // 最内层
);// 执行
var result = await policyWrap.ExecuteAsync(async () =>
{return await httpClient.GetStringAsync("https://api.example.com/data");
});

依赖注入集成

public class Startup
{public void ConfigureServices(IServiceCollection services){// 注册策略services.AddSingleton<IAsyncPolicy<HttpResponseMessage>>(provider =>{return HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(3, retryAttempt =>TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));});// 注册HttpClientservices.AddHttpClient<WeatherService>((serviceProvider, client) =>{client.BaseAddress = new Uri("https://api.weather.com/");}).AddPolicyHandler((serviceProvider, request) =>serviceProvider.GetRequiredService<IAsyncPolicy<HttpResponseMessage>>());}
}

监控和日志集成

var retryPolicy = Policy.Handle<HttpRequestException>().WaitAndRetryAsync(retryCount: 3,sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(retryAttempt),onRetry: (outcome, timespan, retryCount, context) =>{// 结构化日志记录logger.LogWarning("重试执行 {OperationKey} 第 {RetryCount} 次,延迟 {Delay}ms. 异常: {Exception}",context.OperationKey,retryCount,timespan.TotalMilliseconds,outcome.Exception?.Message);// 度量指标收集metrics.Increment("polly.retry.attempts", new Dictionary<string, object>{["operation"] = context.OperationKey,["retry_count"] = retryCount});});

💰 How Much - 成本考量

开发成本

学习成本

  • 初级开发者:需要2-3天理解基本概念和常用策略
  • 中级开发者:1天即可上手,1周内掌握高级特性
  • 高级开发者:半天即可集成到现有项目

实现成本

  • NuGet包大小:Polly核心包约200KB,对应用程序大小影响微乎其微
  • 代码复杂度增加:通常只需要在服务注册和关键调用点添加几行代码
  • 测试复杂度:Polly提供了丰富的测试工具,实际上简化了弹性场景的测试

运行时成本

性能开销

  • 内存占用:每个策略实例占用内存很少(通常<1KB)
  • CPU开销:策略执行的CPU消耗极低,主要是条件判断和计时器操作
  • 延迟影响:除了有意的延迟(如重试间隔),策略本身几乎不增加延迟

资源使用

// 性能友好的策略配置示例
var efficientPolicy = Policy.Handle<HttpRequestException>().WaitAndRetryAsync(retryCount: 3,sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Min(Math.Pow(2, retryAttempt), 30)), // 限制最大延迟onRetry: (outcome, timespan, retryCount, context) =>{// 使用结构化日志,避免字符串拼接logger.LogWarning("Retry {RetryCount} after {Delay}ms", retryCount, timespan.TotalMilliseconds);});

收益分析

直接收益

  • 减少故障处理时间:自动化故障处理可减少50-80%的手动干预时间
  • 提升系统可用性:通常可将系统可用性从99.5%提升到99.9%+
  • 降低客服成本:减少因瞬时故障导致的用户投诉和支持请求

间接收益

  • 提升开发效率:标准化的错误处理模式减少重复代码
  • 改善用户体验:用户感知到的错误减少,满意度提升
  • 降低运维压力:减少深夜故障告警,改善工程师工作体验

ROI计算示例

假设一个中型电商系统:

  • 开发投入:2个开发者 × 3天 × ¥1000/天 = ¥6,000
  • 年度故障处理成本节约:20次故障 × 2小时/次 × ¥500/小时 = ¥20,000
  • 用户流失减少收益:假设减少1%流失率,年GMV ¥1000万,毛利20% = ¥20,000

年度ROI = (¥40,000 - ¥6,000) / ¥6,000 × 100% = 567%


🚀 最佳实践和进阶技巧

1. 策略配置的外部化

// appsettings.json
{"PollyPolicies": {"HttpRetry": {"RetryCount": 3,"BackoffPower": 2,"BaseDelay": 1000},"CircuitBreaker": {"FailureThreshold": 5,"DurationOfBreak": 60000,"MinimumThroughput": 10}}
}// 配置类
public class PolicyConfiguration
{public HttpRetryConfig HttpRetry { get; set; }public CircuitBreakerConfig CircuitBreaker { get; set; }
}// 策略工厂
public class PolicyFactory
{private readonly PolicyConfiguration _config;public PolicyFactory(IOptions<PolicyConfiguration> config){_config = config.Value;}public IAsyncPolicy<HttpResponseMessage> CreateHttpRetryPolicy(){return HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(_config.HttpRetry.RetryCount,retryAttempt => TimeSpan.FromMilliseconds(_config.HttpRetry.BaseDelay * Math.Pow(_config.HttpRetry.BackoffPower, retryAttempt)));}
}

2. 自定义策略扩展

public static class CustomPolicyExtensions
{public static PolicyBuilder HandleDatabaseErrors(this PolicyBuilder policyBuilder){return policyBuilder.Handle<SqlException>(ex => IsTransientError(ex)).Or<TimeoutException>().Or<InvalidOperationException>(ex => ex.Message.Contains("pool"));}private static bool IsTransientError(SqlException ex){// SQL Server瞬时错误代码var transientErrorNumbers = new[] { 2, 53, 121, 1205, 1222 };return transientErrorNumbers.Contains(ex.Number);}public static IAsyncPolicy<T> AddDatabaseRetryPolicy<T>(this PolicyBuilder policyBuilder){return policyBuilder.HandleDatabaseErrors().WaitAndRetryAsync(retryCount: 3,sleepDurationProvider: retryAttempt => TimeSpan.FromMilliseconds(100 + Random.Next(0, 50)) // 添加抖动.Add(TimeSpan.FromMilliseconds(100 * Math.Pow(2, retryAttempt))));}
}

3. 测试策略

[Test]
public async Task RetryPolicy_Should_Retry_On_HttpRequestException()
{// Arrangevar mockHandler = new Mock<HttpMessageHandler>();var httpClient = new HttpClient(mockHandler.Object);mockHandler.SetupSequence(handler => handler.SendAsync(It.IsAny<HttpRequestMessage>(),It.IsAny<CancellationToken>())).Throws<HttpRequestException>()  // 第一次失败.Throws<HttpRequestException>()  // 第二次失败.Returns(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK))); // 第三次成功var retryPolicy = Policy.Handle<HttpRequestException>().RetryAsync(2);// Act & Assertvar response = await retryPolicy.ExecuteAsync(async () =>{return await httpClient.GetAsync("http://test.com");});Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);mockHandler.Verify(handler => handler.SendAsync(It.IsAny<HttpRequestMessage>(),It.IsAny<CancellationToken>()), Times.Exactly(3));
}

4. 监控和度量集成

public class PolicyTelemetry
{private readonly IMetrics _metrics;private readonly ILogger<PolicyTelemetry> _logger;public PolicyTelemetry(IMetrics metrics, ILogger<PolicyTelemetry> logger){_metrics = metrics;_logger = logger;}public IAsyncPolicy<T> CreateInstrumentedRetryPolicy<T>(string operationName){return Policy.Handle<Exception>().WaitAndRetryAsync(retryCount: 3,sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),onRetry: (outcome, timespan, retryCount, context) =>{// 记录重试指标_metrics.Increment("polly.retry.attempt", new Dictionary<string, object>{["operation"] = operationName,["retry_count"] = retryCount,["exception_type"] = outcome.Exception.GetType().Name});// 记录结构化日志_logger.LogWarning("Operation {OperationName} retry #{RetryCount} after {Delay}ms due to {ExceptionType}: {ExceptionMessage}",operationName, retryCount, timespan.TotalMilliseconds, outcome.Exception.GetType().Name, outcome.Exception.Message);});}
}

📊 总结

Polly作为.NET生态系统中最成熟的弹性处理库,已经成为构建可靠分布式系统的标准工具。它不仅提供了丰富的策略类型来应对各种故障场景,还具备出色的可扩展性和可测试性。

核心价值

  • 简化复杂性:将复杂的故障处理逻辑抽象为简洁的策略配置
  • 提升可靠性:通过多层次的防护机制显著提高系统稳定性
  • 降低成本:减少人工干预和故障处理成本,提高开发和运维效率
  • 改善体验:为最终用户提供更加稳定和流畅的服务体验

适用场景

  • 微服务架构的服务间通信
  • 外部API和第三方服务集成
  • 数据库访问和数据处理操作
  • 云服务和基础设施调用

无论是正在构建新系统的团队,还是希望提升现有系统稳定性的组织,Polly都是一个值得投资的技术选择。它的低学习成本、高投资回报率和活跃的社区支持,使其成为.NET开发者工具箱中不可或缺的一部分。

通过合理配置和使用Polly,可以让我们的应用程序在面对不确定的网络环境和服务依赖时,表现得更加优雅和健壮。这不仅是技术上的提升,更是向用户展示专业性和可靠性的重要方式。

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

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

相关文章

撒钱岛小游戏管理系统:私域流量变现新选择,趣味与收益双赢

一、概述总结 撒钱岛小游戏系统是一款依托微擎云端交付的创新型应用,融合 “4 大玩法微信小游戏 + H5 返佣系统”,打破传统游戏单一娱乐属性,实现 “娱乐 + 收益” 双重价值。 其核心优势在于精准解决流量变现痛点,…

Day19构造器详解

构造器的基本定义:作用:1,new本质是在调用构造方法2,初始化对象的值 package oop1;public class person {//一个类即使什么也不写,它也会默认存在一个方法(构造器,一种特殊的方法)String name;//接下来将这个构造器…

多商户的在线客服系统,直接在小程序的商家中嵌入我们的商家聊天链接

gofly.v1kf.com vx: llike620 ​ ​​1. 客服系统架构​​​​一个云端客服系统​​:您开发一个统一的客服平台​​商户区分​​:通过URL参数识别不同商户​​数据隔离​​:后端根据商户ID自动过滤数据​​2. 商户…

【院士报告|EI检索稳定|大连理工大学主办】第四届能源与动力工程国际学术会议(EPE 2025)

由大连理工大学主办、中国科学报社支持的第四届能源与动力工程国际学术会议(EPE 2025)将于2025年10月10日至12日在中国大连举行。EPE 2025作为第十六届创新发展论坛 • 以高水平科技供给智领产业未来专题活动之一开展…

多客云 Ai 短视频批量剪辑矩阵系统:高效创作与智能管理的一体化解决方案

1. 概述总结 多客云 Ai 短视频批量剪辑矩阵系统是一款专注于企业级短视频 AI 创意生产的平台,通过独创的 Ai 智能批量剪辑去重算法,实现 100% 保障每条素材每一帧画面仅使用一次,为企业带来 10-50 倍的创意生产效率…

[ABC077D] Small Multiple 同余最短路

之前写过一篇介绍同余最短路的文章,其实写的蛮烂得,鸽了这道题好久,今天中午好不容易算是做出来了。 题意 给定一个 \(K\),求出来 \(V=xk\)(\(x\) 为正整数),使得这个 \(V\) 的各数位和是最小的。 这个 \(K\) 的级…

20250509_信安一把梭_黑客

流量分析, 应急响应, webshell, 信安一把梭Tags:流量分析, 应急响应, webshell, 信安一把梭 0x00. 题目 某天晚上安服仔小辉辉上班摸鱼期间突然发现服务器登入页面被挤掉线了,于是第六感告诉他,服务器肯定是被黑客攻…

c# 保存文件 - 先保存到临时文件,保存成功后修改文件名

public static class FileSafeWrite{public static void WriteAllTextAtomically(string filePath, string content){// 定义临时文件路径string tempFilePath = filePath + ".tmp";try{// 将内容写入临时文…

达芬奇标记测量线文字标题动画预设(Tracked Measuring Lines)使用指南

在工程演示、科技解析、产品展示等视频创作中,专业的测量标注动画能极大提升内容的精准度与科技感。分享一款轻量化达芬奇预设 ——Tracked Measuring Lines,37MB 小巧体积即可实现 4K 分辨率的测量线文字标题动画一…

20250427_信安一把梭_No11

流量分析, 应急响应, ftp, ZIP, CRC碰撞, DASCTF, 信安一把梭Tags:流量分析, 应急响应, ftp, ZIP, CRC碰撞, DASCTF, 信安一把梭 0x00. 题目请通过分析数据包找出数据包里面一共有多少个压缩包。 请把破解出来的11压缩…

运营商数据分类分级:最佳实践、典型案例与智能化方案

运营商数据分类分级是构建数据安全体系的基石,直接满足《数据安全法》第21条合规要求,赋能5G新业务创新。通过AI驱动技术,实现99%识别率和10万张表/3小时处理效率,解决数据资产分散、敏感字段识别效率低下等核心痛…

AT_abc413_g [ABC413G] Big Banned Grid

考虑到障碍格子很少,从障碍格子入手,发现走不到 \(( n, m)\) 相当于有一条障碍线(八连通)将其分隔开来,发现就是从顶部往底部看有没有最短路,这样复杂度就只有关于障碍格子数了。

.NET性能优化-使用RecyclableBuffer取代RecyclableMemoryStream

介绍 RecyclableBuffer 是一个高性能的缓冲区管理库,它使用 ArrayPool<byte> 实现可回收内存段。该系统提供了两个互补的缓冲区写入器实现:一个针对连续内存方案进行了优化,另一个针对多段数据处理进行了优化…

css样式:button边框贪吃蛇加载效果

<!doctype html> <html lang="zh-CN"> <head> <meta charset="utf-8"/> <title>90x28圆角矩形蛇段动画</title> <script src="https://code.jquery.…

什么是NIC(网络接口卡)?

网络接口卡(NIC)是一种基本的硬件组件,它使计算机或设备能够连接到网络。它可以集成到主板中,也可以作为扩展卡安装在计算机上,这标志着它在计算机网络中不可或缺的作用。 NIC管理网络和计算机之间的数据转换和…

视频剪辑效率翻倍!CyberLink PowerDirector 从入门到专业的全能解决方案

对于视频编辑爱好者、自媒体创作者以及初入行业的剪辑新人而言,一款功能全面且操作友好的剪辑工具,是提升创作效率与作品质感的关键。CyberLink PowerDirector(威力导演)作为一款综合性视频剪辑软件,既具备满足专…

20250415_信安一把梭_encode

流量分析, 应急响应, tcp, 数据解析, pyshark, 正则匹配, json, 信安一把梭Tags:流量分析, 应急响应, 数据解析, tcp, pyshark, 正则匹配, json, 信安一把梭 0x00. 题目 请分析某设备导出的流量包,找到攻击IP和正确密…

日常练习另一部分

上次我的练习是使用vue3进行的前端训练,我上一个博客简单实现了使用路由的单页面跳转,他的好处的所有页面一起加载,并且只使用一个main和app.vue,我又在原有的基础上尝试了多页面跳转。 about.html <!DOCTYPE h…

每天一个安卓测试开发小知识之 (六)---常用的adb 命令第四期

每天一个安卓测试开发小知识之 (六)---常用的adb 命令第四期本期继续介绍adb命令root adb 查看app进程id adb服务端重启 获取当前界面的xml adb命令输入text1. root adbroot的作用是什么 如何进入root 如何退出 什么…

SAP-ABAP中STOP,EXIT,CHECK,RETURN,CONTINUE,LEAVE,REJECT的区别

Stop 命令使用该命令的程序位置INITIALIZATION, AT SELECTION-SCREEN, START-OF-SELECTION和GET 事件中处理说明1、 当在INITIALIZATION事件执行该命令,系统将直接触发应用服务器和客户端屏幕元素的发送;影响后续模块…