在 EclipseCon Europe 大会上,Sascha Zelzer 展现了一个称为 C++ 微服务的本地 OSGi 服务层。该服务层的目标是为 C++ 程序提供一个和 PojoSR 项目相似的服务层, 从而能够使用互相连接的服务构建应用程序。C++ 微服务和 PojoSR 都没有完整的可以置换出活跃代码的 OSGi 能力;相反的,它们都工作在相同的内存进程 /ClassLoader 中。
我们知道 OSGi 的强项之一是它的多 ClassLoader 模型,该模型能够动态地停止和重启 bundle(模块),那么 OSGi Lite 还有用武之地么?PojoSR 和本地方法(包括 Apache Celix ,另一个 OSGi C 运行时)的创建者认为我们能够从微服务编程模型中受益,因为我们可以使用协同服务构建应用程序。此时可以使用一般的依赖注入机制,有一个能够保持有效服务列表的全球服务目录,需要这些服务的组件能够查询服务注册表从而找到一个合适的实现。
尽管模块中并没有“OSGi Lite”的味道,但是它依然能够动态地从注册表中停止(或者移除)服务。虽然它不提供热代码替换,但是这样做依然可以获得一定程度的活性。另一方面,一些 Java 程序和类库要忍受除了扁平(flat)classpath 之外的所有内容,因此“OSGi Lite”模式在典型的 spaghetti 模型和重构成服务之间提供了一段过渡时期。
在今年的早些时候 C++ 微服务项目发布了它的 1.0.0 版本,你可以从 GitHub 或者项目下载类库中获取它,随之发布的还有一个介绍如何使用它的详细教程。该类库在 us:: 命名空间(微服务的缩写词)之下提供,同时还提供了us::ModuleContext(类似于OSGi 的BundleContext)、us::GetServiceReference 和us::GetService。还有一个带有Load 和UnLoad 方法的us::ModuleActivator 基类,在模块启动或者停止的时候我们可以使用这两个方法预置它的状态,还有一个us::ServiceTracker,它能够用于跟踪安装或者移除的服务。
InfoQ 对 Zelzer 做了一次采访,在采访中我们首先询问了他之所以要开始 C++ 微服务项目的原因:
Zelzer:我在一个非常大的医学成像 C++ 代码库上工作,很多学生使用该库开发自己的算法。为了管理这样的一个代码库及其开发者(他们通常不是受过训练的软件工程师),模块化和重用性非常重要。这是 OSGi 擅长的地方。无论怎样,我们之前的尝试——引入一个完整的 C++ OSGi 框架——受到了一些因素的阻碍:两个重要的因素是已有的代码库太复杂以致于难以适应一个纯的 OSGi 架构,另外我们的 C++ 开发者对引入另一个复杂的框架持保守态度。总之,我们最感兴趣的层是服务层——实际上我们并没有在运行时热交换代码的用例,模块层也没有灵活的依赖解析机制。因此我开始创建 C++ 微服务项目。
InfoQ:你如何处理来来往往的服务;模块依然要保持加载么?
Zelzer:通常情况下,模块并不会被卸载(尽管程序能够做到这一点)。为了解决编译时的链接依赖我们在启动时由动态链接器加载模块。客户程序可以选择在运行时(但是很少做卸载)动态地加载或者卸载模块。服务监听器需要处理消失的服务。如果一个模块已经被卸载,但是另一个模块依然在使用该服务对象那么会引发程序错误。
InfoQ:能够动态地加载和卸载模块么,只加载同一个代码版本?
Zelzer:是的,但这是由程序决定的。你可以选择使用提供的 OS 函数(dlopen()、LoadLibrary() 等)在运行时动态地加载一个共享类库。
InfoQ:加载的 bundle 如何工作——有没有一种标准的格式可以用于表示一个 bundle,就像 JAR 那样?
Zelzer:C++ 微服务的好处是它将这些事情完全交给了 OS。因此,在 Linux 上 bundle 的格式是“ELF 共享对象”(也可能是静态的),在 Windows 上格式是“PE”(可移植的可执行文件,它们是.dll 或者 exe 文件)。加载是由 OS 的动态链接器完成的。
InfoQ: CPP 微服务支持哪些平台?
Zelzer:它是使用标准的 C++ 98 编写的,能够在所有拥有兼容 C++ 编译器的平台上编译。我们在 Linux、Windows 和 MacOS 平台上使用了不同的编译器版本对它做了测试。
InfoQ:该项目与 OSGi 本地提案和 Apache Celix 有什么关系?
Zelzer:我将 C++ 微服务项目看作是服务层本地 C++ API 的一个现场测试。从中获得的经验将帮助我们规范化本地 OSGi API 的处理。
InfoQ:现在它能够应用于哪些地方?如何应用?
Zelzer:该项目在医疗成像交互工具箱( MITK )中得到了广泛的应用,所有使用该工具箱的项目都有它的影子。一个商业化的例子是 Mint Medical ,该公司在医疗成像领域提供 C++ 解决方案。航空电子设备、嵌入式系统和重要安全软件项目中的人对该项目也非常感兴趣。
有很多人对本地 OSGi 领域感兴趣,这就是为什么 OSGi 会有请求提案(RTP) 156 对规范化本地类库中的 OSGi API 进行讨论的原因。你对在本地代码中使用 OSGi API 感兴趣么?
查看英文原文: C++ Micro Services adds OSGi API to C++ applications
评论