Ice 3.8 发布

内容分享6小时前发布
0 0 0

Ice 3.8 Changelog 相对于 3.7 的重大变化:


一、总体定位

Ice 3.8 是一个重大更新版本,包含大量架构性重构、API 简化、安全强化和现代化改造。它移除了许多历史遗留功能,统一了行为,并为未来(如与 IceRPC 的互操作)奠定基础。


⏱️二、连接与超时模型彻底重构(最重大变更之一)

❌移除旧 ACM/Timeout 模型

  • 完全废弃 Ice.ACM.* 和 Ice.Default.Timeout 等旧有超时属性。
  • 所有端点默认超时固定为 60,000ms(仅影响旧版客户端)。

✅引入四种新超时机制

超时类型

默认值

作用

配置属性示例

Idle Timeout

60s

连接无任何字节读取即视为“空闲”,会被强制中止

Ice.Connection.Client.IdleTimeout

Inactivity Timeout

300s

应用层无请求/响应(心跳不算),优雅关闭以释放资源

Ice.Connection.Server.InactivityTimeout

Connect Timeout

10s

连接建立失败阈值

Ice.Connection.Client.ConnectTimeout

Close Timeout

10s

优雅关闭转为强制中止的等待时间

Ice.Connection.Server.CloseTimeout

关键提示

  • Idle timeout 必须 < Inactivity timeout。
  • 与 Ice ≤3.7 互操作时,需在旧版启用 Ice.ACM.Heartbeat=3,或在 3.8 端禁用 idle check。

三、IceSSL 重大变更

架构变化

  • SSL 不再是插件,而是内建到核心库
  • Windows 不再支持 OpenSSL,强制使用 Schannel。
  • 提供平台原生 SSL 引擎配置 API(更灵活,替代旧属性)。

️移除的属性/API

  • IceSSL.CertVerifier, IceSSL.Ciphers, IceSSL.DHParams, IceSSL.PasswordCallback 等大量旧属性。
  • IceSSL::Certificate 类及相关证书 API。
  • 自定义密码回调、证书验证器被移除。

⚙️更新的属性

  • IceSSL.CertFile:不再支持多文件(RSA+DSA)。
  • IceSSL.CheckCertName:仅用于主机名验证,SNI 始终启用(对 DNS 端点)。
  • 协议版本、加密套件等由系统默认控制,高级需求需用新 API。

四、Slice 语言与编译器现代化

移除的功能

  • local 关键字
  • 类中定义操作(MyClass* 代理语法失效)
  • 接口按值传递(interface-by-value)
  • [“preserve-slice”]、[“protected”]、[“ice-prefix”] 等元数据
  • 自动转义关键字(需手动用 <lang>:identifier 重命名)
  • 序列作字典 key(自 3.3 已弃用)

✨新增/改善

  • 统一重命名元数据:[“cs:identifier:MyNs”] 替代 cs:namespace 等。
  • 嵌套模块简写:module A::B::C { }
  • 文档注释增强
    • 支持 ///(Triple-slash)
    • 新标签 @remark, @p
    • 支持 Markdown 代码段(` `code` `)
  • 元数据可分行书写:提高可读性。
  • 枚举项可加元数据
  • 移除 Slice 校验和 (slice2html 编译器也被移除)。

五、各语言映射(Mapping)升级

共同趋势

  • 全面拥抱异步:所有语言均生成 AsyncXXX 骨架(无需 [“amd”])。
  • 简化代理创建:new GreeterPrx(communicator, “proxy-string”) 成为首选。
  • 异常体系重构:派生关系更清晰,新增 ConnectionAbortedException 等。
  • SliceLoader 替代 ValueFactory:用于反序列化时创建类/异常实例(Java/MATLAB/Swift 需注意注册)。

各语言亮点

语言

主要变更

C++

仅 C++17+;std::optional 表明可空代理;移除 IceUtil 命名空间

C#

.NET 8 / C# 12;支持 IAsyncDisposable;struct 映射为 record

Java

Java 17;移除 Compat 映射;JVM 在严重错误时直接退出

JavaScript

移除 IE 支持;long → BigInt;Symbol.asyncDispose

Python

Python 3.12;集成 asyncio;None 替代 Ice.Unset;每定义一模块

PHP

移除 flattened 映射;移除 Windows/PHP5 支持

MATLAB

2024a;sequence<string> → string array;字典 → dictionary

Swift

Swift 6.1;全面 async/await;移除 Carthage/PromiseKit

Ruby

小幅调整初始化和 loadSlice

Objective-C

完全移除


六、打包与分发变更

  • .NET:单体 NuGet 包拆分为多个模块化包(如 ZeroC.Ice, ZeroC.Glacier2)。
  • C++:NuGet 包重命名为 ZeroC.Ice.Cpp,含 CMake 支持。
  • JavaScript:NPM 包改为 scoped 名称 @zeroc/ice,内置 slice2js。
  • Linux:RPM/DEB 构建脚本移入主仓库。

七、Ice 服务组件变更

组件

变更

DataStorm

正式集成进 Ice 主发行版

Glacier2

移除 buffered 模式、批处理、_ovrd;会话依赖新 idle timeout

IceBox

新增 isServiceRunning 管理接口

IceGrid

移除 IcePatch2 相关分发;会话依赖新 idle timeout;命令重命名(state → status)

IcePatch2

完全移除

IceStorm

配置前缀统一为 IceStorm;新增 createOrRetrieve 方法


八、其他重大移除/变更

  • 移除 secure 代理选项:不再支持“客户端选择安全级别”的混合端点(tcp+ssl)。
  • 严格属性校验:设置未知 Ice 属性将抛出异常。
  • collocation 优化:不再思考 UDP 端点(利于多播)。
  • 新增流控属性:MaxDispatches(背压)、MaxConnections(适配器级)。
  • 日志中间件:自动记录 dispatch(基于 Ice.Trace.Dispatch)。

✅总结:升级提议

  1. 重点检查连接超时配置,确保与旧系统兼容。
  2. 重构 SSL 配置,特别是 Windows 用户需迁移到 Schannel。
  3. 审查 Slice 文件,移除已废弃语法,使用新元数据重命名。
  4. 更新各语言代码
    • 使用新代理创建方式
    • 适配异步模型
    • 处理 null/None 行为变更(struct/enum 不再容忍 null)
  1. 替换 IcePatch2(如仍在使用)。
  2. 测试互操作性:Ice 3.8 与 3.7 部分组件不兼容(如 IceGrid)。

Ice 3.8 是一次面向未来的大清理,虽然迁移成本较高,但换来的是更简洁、安全、现代的架构。

© 版权声明

相关文章

暂无评论

none
暂无评论...