C++应用程序可借助C++微服务实现OSGi API

在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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值