虚位以待(AD)
虚位以待(AD)
首页 > 操作系统 > LINUX > Linux RPC编程实战要点

Linux RPC编程实战要点
类别:LINUX   作者:码皇   来源:互联网   点击:

Linux RPC编程实战要点。当前云计算、大数据发展得如火如荼,作为其主要架构的分布式系统也得以大行其道。而构成分布式系统的一个重要基础功能就是RPC(remote process call),因此了解RPC的基本原理、编程实现和部署方法显得尤为必要。

Linux RPC编程实战要点。当前云计算、大数据发展得如火如荼,作为其主要架构的分布式系统也得以大行其道。而构成分布式系统的一个重要基础功能就是RPC(remote process call),因此了解RPC的基本原理、编程实现和部署方法显得尤为必要。

一、RPC的基本原理

网上介绍RPC的博客比较多,系统和零碎的文章也有不少,个人建议找一两个链接看懂、真正理解即可。

笔者这里想推荐的是《RPC原理详解》和《RPC Porgram》。说简单点,RPC就是基于网络TCP或者UDP协议的通信过程,客户端和服务器端根据事先约定好的数据传输接口和框架,分别实现各自的功能:服务器端实现客户端想要的业务的函数的功能,并把这些函数和指定的远程调用编号关联起来,然后向RPC框架注册这些函数;客户端利用约定的远程调用编号向RPC框架申请对应的服务,并从网络包中解析出期望的返回值。

二、编程实现

借助于现有的RPC框架,工程师可以只用关注具体的业务功能相关的函数,而不用考虑框架代码的实现和流程。这些便捷性来自于RPC框架提供的自动代码生成工具,以Linux C RPC为例,正是因为有了rpcgen,开发人员一旦设计好了对应的.x接口文件,一个命令就可以生成所有的框架代码,并且显式地 预留了实现业务功能代码的位置,工程师就像填砖一样往框架结构里塞入代码即可。

下面以sample.x为例,简单介绍一下client端、server端代码、Makefile的生成过程。

1.根据rpc语法,实现和自己接口相关的.x文件,它是生成client端和server端的种子;

const ADD = 0;
const SUB = 1;
const MUL = 2;
const DIV = 3;
struct MATH
{
    int op; /* 0-ADD, 1-SUB, 2-MUL, 3-DIV */
    float arg1;
    float arg2;
    float result;
};
program MATH_PROG
{
    version MATH_VER
    {
        struct MATH MATH_PROC(struct MATH) = 1;
    } = 2;
} = 0x20000001;

2.利用rpc生成所有的程序:

rpcgen -a cal.x

检查下所有的输出:

[root@localhost rpc]# ls -alrt

total 40

-rw-r--r--. 1 root root 247 Mar 31 22:59 cal.x

drwxrwxr-x. 22 xqch xqch 4096 Mar 31 23:00 ..

-rw-r--r--. 1 root root 341 Mar 31 23:00 cal_xdr.c

-rw-r--r--. 1 root root 1115 Mar 31 23:00 cal.h

-rw-r--r--. 1 root root 588 Mar 31 23:00 cal_clnt.c

-rw-r--r--. 1 root root 2230 Mar 31 23:00 cal_svc.c

-rw-r--r--. 1 root root 347 Mar 31 23:00 cal_server.c

-rw-r--r--. 1 root root 1058 Mar 31 23:00 Makefile.cal

-rw-r--r--. 1 root root 842 Mar 31 23:00 cal_client.c

3.往cal_client.c和cal_server.c中添加需要的代码,然后运行:

make -f Makefile.cal 生成客户端和服务器端的程序:cal_client/cal_server。

三、部署方法

理解了RPC的原理并且熟悉了rpcgen命令之后,进行RPC程序开发并不难。难的是在实际调试运行RPC程序,特别是在不同的节点、网络环境下运行RPC应用程序时,可能由于网络、防火墙、RPC服务的不同的设置出现各种问题,常见的有:

1. connection refused;

2. unable to route to XXX (IP);

3. Connection timeout;

一旦出现了上面的问题,记得用firewall-cmd/rpc-bind/rpcinfo等命令检查防火墙、端口设置、rpc服务设置,保证该关闭的服务要关闭,该打开的服务务必打开,这样才能保证RPC程序实现跨节点的运行。

总之,由于RPC不是在本地调用,而是依赖于现有的TCP/UDP协议,因此出现了问题之后,处了需要确定程序没有问题之外,还需要时刻留意网络系统设置,对整个系统的工作流程有个全面的了解,才能快速解决问题,提告开发效率。

相关热词搜索: