点击围观!腾讯 TAPD 助力金融行业研发提效、敏捷转型最佳实践! 了解详情
写点什么

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

  • 2013-11-06
  • 本文字数:1925 字

    阅读完需:约 6 分钟

在 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

2013-11-06 08:374454
用户头像

发布了 321 篇内容, 共 113.0 次阅读, 收获喜欢 17 次。

关注

评论

发布
暂无评论
发现更多内容

百度工程师教你玩转设计模式(单例模式)

百度Geek说

设计模式

子网划分不会?瑞哥带你深入理解IP地址,手把手教你子网划分!

wljslmz

网络技术 6月月更 子网划分

Meetup回顾|DevOps&MLOps如何在企业中解决机器学习困境?

星策开源社区

开源 DevOps 算法 OpenMLDB MLOps

从“化学家”到开发者,从甲骨文到TDengine,我人生的两次重要抉择

TDengine

数据库 tdengine 开源 时序数据库

【云图说】每个成功的业务系统都离不开APIG的保驾护航

华为云开发者联盟

云计算 华为云 业务系统

“减负”,让“猪”可以飞得更高

鼎道智联

“易 +”开源计划丨基于 WebRTC 的低延时播放器设计和实践

网易智企

开源 IM 低延时直播

怎样简洁明了地说清楚产品需求?

LigaAI

高效工作 产品经理 需求 产品设计与思考

对接上百个第三方 API 后的思考与沉淀

AFlymamba

经验总结 Java EE 经验分享、

在线文档协作工具,是提高工作效率的第一步

小炮

深度剖析「圈组」关系系统设计 | 「圈组」技术系列文章

网易云信

音视频 IM Discord

【网易云信】深度剖析「圈组」消息系统设计 | 「圈组」技术系列文章

网易智企

音视频 IM Discord

大数据培训Flink高频面试题分享

@零度

flink 大数据开发

Fortex方达发布电子交易生态体系 与客户共享共赢

股市老人

中台:数据中台、业务中台、技术中台、应用中台、AI中台……

WorkPlus

为你推荐一款高效的IO组件——okio

HarmonyOS开发者

HarmonyOS

搜狐员工遭遇工资补助诈骗 黑产与灰产有何区别 又要如何溯源?

郑州埃文科技

网络安全 网络灰黑产 IP溯源

H.265编码原理入门

百度Geek说

视频编码

java培训自定义 ThreadPoolExecutor 线程池

@零度

jdk JAVA开发

API如何检测安全配置是否有错误?

百家饭隐私计算平台创业者

安全 API

【网易云信】深度剖析「圈组」关系系统设计 | 「圈组」技术系列文章

网易智企

音视频 IM Discord

C++应用程序可借助C++微服务实现OSGi API_C++_Alex Blewitt_InfoQ精选文章