eProsima RPC over DDS User Manual翻译,第1-2章

1 引言
eProsima RPC over DDS 是一种高性能的远程过程调用(RPC)框架。它将软件栈与代码生成引擎相结合,为多种平台和编程语言构建高效的服务。

eProsima RPC over DDS使用使用对象管理组织(OMG) 的数据分发服务 (DDS) 标准作为通信引擎。该发行版专门使用eProsima Fast DDS来实现通信层。如果您有兴趣使用RTIDDS作为底层通信机制,您可以从eProsima网站下载eProsima RPC over DDS的发行版。

1.1 通过 DDS 进行客户端/服务器通信
分布式系统中使用的通信模式主要有三种:

    • Publish-Subscribe发布-订阅
    • Request-Reply请求-应答
    • Point to Point 点对点
      
远程过程调用(RPC)是请求-应答模式的一个示例。RPC允许应用程序调用另一个地址空间(通常在共享网络中的另一台计算机上)中的子程序或程序。 eProsima Fast RPC提供了这种一般概念的实现,使开发人员能够以最少的工作量构建分布式应用程序。

该框架从接口定义语言 (IDL) 定义的程序生成请求-应答代码,使开发人员能够专注于应用程序逻辑,而无需担心网络细节。

 

自动代码生成:
为了自动化生成RPC over DDS,可以使用接口定义语言(例如OMG IDL)来声明过程的定义,以及解析工具生成代码来管理所需的DDS实体,并且,它可以使用中间件技术(如Web服务Apache Thrift等)中的典型方法为客户端创建“proxy”,为服务端创建“skeleton”。

客户端代理对象将远端程序像本地程序一样公开,并管理DDS实体去发送请求。服务端框架对象是用户编写远端程序实现的对象。

1.2 主要特性

    • 同步,异步和单向调用. 
        ◦ 同步调用最常见,它会阻塞客户端线程,直到收到来自服务端的应答。
        ◦ 异步调用要求不阻塞客户端线程。开发者提供一个回调对象在收到回复时调用。
        ◦ 单向调用是一种发射后忘记的调用,客户端不关心程序的返回结果,不等待来自服务端的返回。
    • 服务端的不同线程策略. 这些策略定义了收到新的请求时服务端的行为。目前支持的策略有:
        ◦ 单线程策略: 只用一个线程来处理每个到来的请求。
        ◦ 线程池策略: 用固定数量的线程处理到来的请求。
        ◦ 每个请求一个线程策略: 为每个新到来的请求创建一个新线程。
    • 几种通信传输形式: 
        ◦ 可靠且高性能UDP传输
        ◦ 支持NAT且固件友好的TCP传输
        ◦ 共享内存传输
    • 自动发现:该框架使用底层 DDS 发现协议来发现不同的客户端、服务端和服务。
    • 完整的发布/订阅框架:用户可以在他们的程序中集成RPC over DDS的发布/订阅代码
    • 高性能:框架使用一种快速序列化机制来提高性能。

2 HelloWorld示例
本节通过对用例的逐步描述,介绍eProsima Fast RPC 的工作原理。

遵循客户端/服务端范例,服务端提供一组客户端可以远程调用的远端程序。服务端由一个代理对象表示,该对象提供它实现的远程过程,并且开发人员已使用我们的工具提供的服务器端框架实现。

此示例有一个远端程序:客户端调用它传递一个带有名称的字符串作为参数,服务器返回一个新字符串,该字符串将前者附加到问候语中。

构建一个应用程序的步骤:
开发者需要按照以下四个步骤来使用eProsima Fast RPC部署他们的发布程序。
    • 使用IDL定义期望的远端程序集合。
    • 使用IDL编译器生成特定的远端程序调用支持代码(一个客户端代理和一个服务端框架)
    • 实现程序,在服务端按照期望的行为填写服务端框架代码
    • 实现客户端,使用代理元素调用远端程序。

2.1  编写IDL文件
编写名为HelloWorld的简单的接口,里面包含hello函数。保存为IDL定义到名为HelloWorld.idl文件中。

// HelloWorld.idl

interface HelloWorld
{
	string hello(in string name);
};

此IDL文件用于根据它反映的结构为客户端/服务端C++应用程序生成代码。第3章包含这些IDL文件怎样工作的详细解释。

2.2  生成特定的代码
打开命令行,进入包含HelloWorld.idl文件的目录。我们将使用fastrpcgen将IDL文件翻译成可工作的C++实现。如果在Windows环境下运行这个示例,输入并执行如下命令:

rpcddsgen -example x64Win64VS2010 HelloWorld.idl

如果在Linux下运行,执行如下命令:

rpcddsgen -example x64Linux2.6gcc4.4.5 HelloWorld.idl

您可能需要更改平台以适应您的系统配置和体系结构。要查看支持的平台列表,请在不带参数的情况下运行程序(rpcddsgen)。
此命令生成客户端打桩函数和服务端框架,以及一些旨在构建 HelloWorld 示例的项目文件。
在Windows下, 会生成Visual Studio 2013解决方案文件,名为 rpcsolution-<target>.sln,<target> 是选中的示例平台。此解决方案由五个文件组成:
    - HelloWorld,  客户端和服务端的公共类,例如定义的类型和特定的通信协议
    - HelloWorldServer, 服务端代码
    - HelloWorldClient, 客户端代码
    - HelloWorldServerExample, 带有服务端的使用示例和 RPC 的实现框架。
    - HelloWorldClientExample, 带有客户端的使用示例
在Linux下,另外会生成一个包含编译解决方案所需信息的makefile。
客户端应用程序的行为和远端程序的实现有待在这些文件中实现。

2.3 客户端实现
编辑名为 HelloWorldClientExample.cxx 的文件。在这个文件中,使用一个生成的代理调用hello的远端程序代码。让我们添加两个声明:一个用来设置远端程序调用参数的值,另一个用来打印返回值。

int main(int argc, char **argv)
{
    HelloWorldProtocol *protocol = NULL;
    RTPSProxyTransport *transport = NULL;
    HelloWorldProxy *proxy = NULL;
    
    // Creation of the proxy for interface "HelloWorld".
    try
    {
        protocol = new HelloWorldProtocol();
        transport = new RTPSProxyTransport("HelloWorldService");
        proxy = new HelloWorldProxy(*transport, *protocol);
    }
    catch(InitializeException &ex)
    {
        std::cout << ex.what() << std::endl;
        return -1;
    }
    
    // Create and initialize parameters.
    std::string  name = "Richard";

    // Create and initialize return value.
    std::string  hello_ret = "";


    // Call to remote procedure "hello".
    try
    {
        hello_ret = proxy->hello(name);
    }
    catch(SystemException &ex)
    {
        std::cout << ex.what() << std::endl;
    }

    std::cout << hello_ret << std::endl;
        
    delete proxy;
    delete transport;
    delete protocol;
   
    return 0;
}

2.4 服务端实现
rpcddsgen在 HelloWorldServerImplExample.cxx 中生成服务端框架。此文件中定义远端程序并且必须被实现。让我们添加一个简单的实现到服务端。

#include "HelloWorldServerImpl.h"

std::string HelloWorldServerImpl::hello(/*in*/ const std::string &name) 
{
  std::string hello_ret;
  
  // Create the greeting sentence.
  hello_ret = “Hello “ + name + “!”;
  
  return hello_ret;
} 

2.5 构建和运行
您将获得一条消息:若要使用 Visual Studio 2015 生成代码,请确保你位于Debug(或Release)配置页,然后生成它。转到 <example_dir>binx64Win64VS2015 目录并执行 HelloWorldServerExample.exe。您将收到一条消息:
INFO<eprosima::rpc::server::Server::server>: Server is running

现在启动 HelloWorldClientExample.exe Richard。您将看到远端程序调用的结果:
Hello Richard!

此示例是静态生成的。若要创建一组包含协议和结构的 DLL,请选择“Debug DLL”(或“Release DLL”)配置文件并生成它。现在将生成您的 DLL 和 LIB 文件。
在Linux下使用如下命令生成代码:
make -f makefile_x64Linux2.6gcc4.4.5

现在您可以进入<example_dir>\bin\x64Linux2.6gcc4.4.5目录并执行像上面Windows部分描述的两个二进制文件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值