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协议,因此出现了问题之后,处了需要确定程序没有问题之外,还需要时刻留意网络系统设置,对整个系统的工作流程有个全面的了解,才能快速解决问题,提告开发效率。