AWS SDK for Java v2 2.24.x 版本发布说明:S3 传输能力增强与 SRA 认证体系迁移全景解析
【免费下载链接】aws-sdk-java-v2The official AWS SDK for Java - Version 2项目地址: https://gitcode.com/GitHub_Trending/aw/aws-sdk-java-v2
AWS SDK for Java v2 的2.24.x系列(2024 年 2 月 9 日至 2 月 28 日,共 14 个版本)是 SDK 历史上一个承上启下的里程碑:它将全部服务客户端迁移到 2.21.0 引入的 SRA(Smithy Reference Architecture)身份与认证逻辑,同时集中交付了 S3 Transfer Manager 的 multipart 默认开启、暂停/恢复上传、TransferListener 支持等一系列传输能力增强。本文以官方 changelogs/2.24.x-CHANGELOG.md 为骨架,结合仓库内核心源码与测试,逐项解析这些变更背后的实现原理与升级要点,帮助你准确评估升级影响并利用新能力。
一、2.24.x 版本线速览
该版本线从2.24.0(2024-02-09)迭代到2.24.13(2024-02-28),其中既有服务端 API 新特性的同步(AWS Batch、Cost Explorer、WAFV2、Lambda 等),也有 SDK 自身的架构级变更与 Bugfix:
| 版本 | 发布日期 | SDK 自身核心变更 |
|---|---|---|
| 2.24.0 | 2024-02-09 | 签名属性(signing properties)改为基于 codegen 生成而非运行时设置;S3 SSE-C + Checksum 上传修复 |
| 2.24.2 | 2024-02-13 | S3 自动修剪对象元数据键的空白字符;URL Connection Client 多值 header 发送修复 |
| 2.24.3 | 2024-02-14 | 半数服务客户端切换至 SRA 身份与认证逻辑;事件流空事件 NPE 修复;S3 AWS_GLOBAL 跨区域访问修复 |
| 2.24.4 | 2024-02-15 | 初始发布 AWS Artifact 服务支持;更新 endpoint/partition 元数据 |
| 2.24.5 | 2024-02-16 | 更新 endpoint 与 partition 元数据 |
| 2.24.6 | 2024-02-19 | S3 Transfer Manager 支持 multipart 模式下的暂停/恢复上传 |
| 2.24.8 | 2024-02-21 | Json/Xml 协议显式 String/Binary Payload 补充 content-length 头 |
| 2.24.10 | 2024-02-23 | S3 Transfer Manager.create()默认启用 multipart 配置,默认与 S3AsyncClient 协同工作 |
| 2.24.12 | 2024-02-27 | Netty 升级至 4.1.107.Final;S3 Transfer Manager 上传支持 TransferListener |
| 2.24.13 | 2024-02-28 | 剩余服务客户端完成 SRA 迁移;修复 multipart 客户端writeInputStream卡死问题 |
二、SRA(Smithy Reference Architecture)身份与认证逻辑迁移
这是 2.24.x 系列最核心的架构级变更。SDK 团队自 2.21.0 起发布新的 SRA 身份与认证逻辑,并在 2.24.3 与 2.24.13 两个版本中分两批把全部 AWS 服务客户端迁移过去。
从仓库结构可以清楚看到新认证架构的落位:独立的core/http-auth-aws模块承载了 SigV4 相关的认证方案实现,例如 DefaultAwsV4HttpSigner.java、DefaultAwsV4aHttpSigner.java,以及配套的AwsV4AuthScheme/AwsV4aAuthScheme认证方案接口;core/http-auth-spi则定义了认证方案的 SPI 契约。这与 2.24.0 中"签名属性改为基于 codegen 生成而非运行时设置"的变更一脉相承——新的 SRA 认证管线通过 AuthScheme 抽象,将认证逻辑从各服务客户端中剥离并统一。
对使用者而言,SRA 迁移是行为兼容的:原有基于AwsCredentialsProvider、AwsSignerProperty、AwsIdentityProperty等执行属性(execution attributes)的用法在新架构下依然可用,但 changelog 明确提示 S3 场景下通过废弃的非公开执行属性S3SignerExecutionAttribute覆盖签名属性的方式在 2.24.0 起失效,官方推荐改用插件(plugins)来调整这些设置。如果你在 2.24.x 之前使用过此类内部 API 自定义签名行为,升级后应迁移到插件机制。
三、S3 Transfer Manager 的能力跃迁
2.24.x 对 S3 Transfer Manager 的改进是本系列对开发者最直接的利好,集中在三个版本:
1. multipart 配置默认开启(2.24.10)
S3TransferManager.create()创建实例时默认启用 multipart 配置;- Transfer Manager 默认与启用 multipart 的 S3AsyncClient 协同工作。
仓库中 TransferManagerFactory.java 的实现印证了这一默认行为:当调用方未显式传入S3AsyncClient时,工厂会优先在 classpath 中探测 AWS CRT(software.amazon.awssdk.crt.s3.S3Client),存在则使用S3AsyncClient::crtCreate,否则回退到S3AsyncClient.builder().multipartEnabled(true)构建的 Java 原生 multipart 客户端——无论走哪条路径,默认客户端都具备 multipart 上传/下载能力。同时工厂还会检查传入的客户端类型:若既不是 CRT 客户端也不是MultipartS3AsyncClient,会输出 debug 日志提醒改用crtBuilder()或multipartEnabled(true)以获得最大吞吐。
对应的官方用法见 S3TransferManager.java:
// 方式一:默认设置(推荐添加 aws-crt 依赖以启用自动 multipart) S3TransferManager transferManager = S3TransferManager.create(); // 方式二:基于 Java 原生 S3 Multipart Async Client S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .multipartEnabled(true) .multipartConfiguration(conf -> conf.apiCallBufferSizeInBytes(32 * MB)) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();2. 暂停/恢复上传(2.24.6)
2.24.6 起,基于 Java 客户端且启用 multipart 的 Transfer Manager 支持上传的pause/resume。结合 S3 Transfer Manager 的模型类(如ResumableFileUpload、UploadFileRequest),开发者可以在大文件传输过程中持久化传输状态、在后续进程中恢复,这在仓库的services-custom/s3-transfer-manager模块的model包中都有对应的公开 API 支持。
3. TransferListener 支持(2.24.12)
2.24.12 让基于 Java 客户端 + multipart 的 Transfer Manager 上传也能触发TransferListener回调,与下载、复制等操作对齐。仓库中 TransferListener.java 定义了监听器契约,LoggingTransferListener.java 提供了开箱即用的日志实现,集成测试中也有专门的 CaptureTransferListener.java 验证回调行为。用法示例:
UploadFileRequest uploadFileRequest = UploadFileRequest.builder() .putObjectRequest(req -> req.bucket("bucket").key("key")) .addTransferListener(LoggingTransferListener.create()) .source(Paths.get("myFile.txt")) .build();四、修复BlockingInputStreamAsyncRequestBody#writeInputStream卡死(2.24.13)
2.24.13 修复了 S3 multipart 客户端的一个隐蔽问题:当任意 multipart 请求失败时,BlockingInputStreamAsyncRequestBody#writeInputStream可能永久卡住(对应 issue #4801)。
从源码看,该类的实现位于 BlockingInputStreamAsyncRequestBody.java:
writeInputStream通过CountDownLatch(subscribedLatch)阻塞调用线程,等待下游订阅发生后再执行阻塞写入,默认超时 10 秒(DEFAULT_SUBSCRIBE_TIMEOUT);- 它底层委托给
InputStreamConsumingPublisher,并在设置了contentLength时用LengthAwareInputStream包装流以感知写入字节数; - 关键设计:
subscribe只允许被调用一次(AtomicBoolean+compareAndSet),重复订阅会收到NonRetryableException,提示"forBlockingInputStream 不支持重试,请改用支持 mark/reset 的流搭配AsyncRequestBody.fromInputStream"。
理解了这两点就不难看出卡死根因:一旦某个 multipart 分片请求失败、流的下游订阅中断或取消,而阻塞写入线程仍在等待订阅或等待流的完成信号,就会造成writeInputStream长时间挂起。2.24.13 的修复正是在失败路径上保证阻塞写入能够被正确唤醒/终止。这也提醒使用者:writeInputStream是阻塞 API,必须先把请求交给 SDK 再写入流(单线程调用场景下尤其如此),并注意其不支持重试的特性,必要时改用AsyncRequestBody.fromInputStream以获得重试支持。
五、签名与协议层的多项修复
2.24.x 在协议编解码与 HTTP 客户端层同样有值得关注的修复:
- 显式 payload 的 content-length(2.24.8):Json 与 Xml 协议 Marshaller 为 String/Binary 类型的显式 Payload 补充
content-length头,避免某些场景下因缺失长度头导致的传输问题。 - URL Connection Client 多值 header(2.24.2):修复了多值 header 在发送时只保留一个值、导致签名不匹配异常的问题(issue #4746)。使用
url-connection-client模块的用户应升级至此版本以上。 - S3 跨区域访问(2.24.3):修复客户端 region 为
AWS_GLOBAL时跨区域访问失败的问题(issue #4912)。 - SSE-C 与 Checksum 组合(2.24.0):修复启用 multipart 的 S3AsyncClient 在 SSE-C + Checksum 场景下 PUT 失败的问题;multipart 客户端在未禁用校验且用户未指定 checksum 时,为 putObject 启用 CRC32。
- 元数据键修剪(2.24.2):
PutObject与CreateMultipartUpload自动去除对象元数据键的首尾空白字符。 - 事件流 NPE(2.24.3):修复事件流操作输入中出现空事件时抛出 NPE 的问题。
六、DynamoDB Enhanced Client 新增逻辑运算符
2.24.2 为 DynamoDB Enhanced Client 的表达式 API 新增了and与or逻辑运算符(由社区贡献者 @akiesler 中可以看到:
public Expression and(Expression expression) // 两个表达式按 " AND " 连接 public Expression and(Expression... expressions) // 多个表达式按 AND 连接 public Expression or(Expression... expressions) // 多个表达式按 OR 连接内部通过join实现表达式的拼接,并在合并expressionNames/expressionValues时对冲突的占位符做严格校验(键相同但值不同会抛出IllegalArgumentException),保证生成的 DynamoDB 表达式合法。这让条件表达式、FilterExpression 等场景的组合写法更加直接,无需手动拼接字符串。
七、2.24.x 服务端新特性精选
除 SDK 自身变更外,2.24.x 同步了 AWS 服务侧的大量新 API,择要如下:
- AWS Batch(2.24.0/2.24.13):支持 ECS 作业的仓库凭据配置;支持 ECS、Fargate、EKS 上 multicontainer 作业(含 array job 与 multi-node parallel job)配置。
- Cost Explorer(2.24.13):新增
GetApproximateUsageRecordsAPI,按小时粒度或按天粒度的资源级数据获取估算用量记录。 - AWS WAFV2(2.24.13):基于速率规则的请求聚合时间窗口可配置,除原有 5 分钟外新增 1、2、10 分钟选项。
- AWS IoT(2.24.13):
SearchIndexAPI 单次查询最大返回数由 500 调整为 100(只要循环调用到nextToken为 null 即不受影响)。 - Lambda(2.24.7):新增 .NET 8(dotnet8)运行时支持。
- AWS Artifact(2.24.4):初始 SDK 发布,支持按需访问合规报告及第三方合规报告(List/Get 报告及元数据、通知设置)。
- AWS Chatbot(2.24.6):新增对 AWS Chatbot 的支持,可在 SDK 中进行交互式 ChatOps 监控、操作与排障。
- EC2(2.24.13):
GetNetworkInsightsAccessScopeAnalysisFindings的MaxResults上限提升至 1,000。 - CloudWatch(2.24.1):
PutMetricData请求负载默认启用压缩。 - Bedrock Agents Runtime(2.24.13):
Retrieve/RetrieveAndGenerate支持覆盖搜索策略。 - RDS(2.24.11):Multi-AZ DB 集群支持 gp3 数据卷。
- Amplify(2.24.6):支持为 Amplify 域配置自定义 SSL/TLS 证书。
- Polly(2.24.4):新增土耳其语(tr-TR)语音 Burcu。
八、依赖升级与社区贡献
2.24.12 将Netty 升级至 4.1.107.Final(由 @sullis 贡献),使用netty-nio-client的异步 HTTP 场景应随之获得该版本的安全与稳定性修复。此外 2.24.2 的 DynamoDB 表达式and/or功能由 @akiesler 贡献——两个社区 PR 均被正式合入并在 changelog 中致谢,体现了该项目对社区贡献的开放姿态。
九、升级建议
对于计划升级到 2.24.x 及以上的项目,建议重点核对以下几点:
- 签名自定义方式:若曾使用
S3SignerExecutionAttribute等非公开执行属性覆盖 S3 签名设置,需在升级前迁移到插件机制(见 2.24.0 变更)。 - SRA 迁移影响:虽然 SRA 认证迁移保持行为兼容,但涉及身份解析、签名链路的自定义扩展点(如自定义 AuthScheme、Signer)应回归验证。
- S3 Transfer Manager:升级后可享受 multipart 默认开启、pause/resume、TransferListener 等能力;若自行传入非 multipart 的
S3AsyncClient,注意工厂会给出 debug 提示,吞吐与断点续传能力将受限。 - 阻塞流写入:若使用
AsyncRequestBody.forBlockingInputStream配合 multipart 上传,务必升级到 2.24.13+ 以规避失败场景下的卡死问题。
完整的逐版本变更清单可查阅 2.24.x-CHANGELOG.md,所有相关实现与测试均可在当前仓库的core/sdk-core、services-custom/s3-transfer-manager、services-custom/dynamodb-enhanced、core/http-auth-aws等模块中深入研读。
【免费下载链接】aws-sdk-java-v2The official AWS SDK for Java - Version 2项目地址: https://gitcode.com/GitHub_Trending/aw/aws-sdk-java-v2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考