BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Alex Blewitt 关注 4 他的粉丝 ,译者 孙镜涛 关注 2 他的粉丝 发布于 2013年11月7日. 估计阅读时间: 6 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

在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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT