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)。
✅总结:升级提议
- 重点检查连接超时配置,确保与旧系统兼容。
- 重构 SSL 配置,特别是 Windows 用户需迁移到 Schannel。
- 审查 Slice 文件,移除已废弃语法,使用新元数据重命名。
- 更新各语言代码:
- 使用新代理创建方式
- 适配异步模型
- 处理 null/None 行为变更(struct/enum 不再容忍 null)
- 替换 IcePatch2(如仍在使用)。
- 测试互操作性:Ice 3.8 与 3.7 部分组件不兼容(如 IceGrid)。
Ice 3.8 是一次面向未来的大清理,虽然迁移成本较高,但换来的是更简洁、安全、现代的架构。




