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

检查下所有的输出:

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

时间: 2025-01-08 02:14:42

Linux RPC编程实战要点的相关文章

Linux Shell 编程实战技巧

目前,越来越多的企业应用会部署在 Linux 系统上的,而 Linux Shell 脚本可以极大地帮助我们完成这些应用的运维任务.这使得 Linux Shell 开发技能成为开发人员的一项重要的.有竞争力的技能.本文就笔者的实际开发经验,以 Korn Shell 为例分享了脚本开发中的常见问题及相关技巧. 避免定时任务脚本的常见问题 很多脚本在实际使用的时候往往是以定时任务的方式运行,而非手工运行.但是实现同样功能的脚本在这两种运行方式下可能遇到的问题不尽相同. 以定时任务方式运行的脚本往往会遇

Linux rpc 编程最简单实例

通过rpcgen的man手册看到此工具的作用是把RPC源程序编译成C语言源程序,从而轻松实现远程过程调用.1.下面的例子程序的作用是客户端程序(fedora Linux下)取中心服务器也是Linux上)时间的,编程过程如下:先编写一个 “ RPC 语言 ” ( RPC Language ( Remote Procedure Call Language ) ) 的源文件 test.x ,文件后缀名为 x .源代码如下:program TESTPROG {   version VERSION {  

RPC编程实战之二

我们知道用rpcgen命令能生成服务器和客户端代码以及Makefile,开发人员可以在生成的demo code上进行二次开发,然后把代码集中到系统中去.基于Linux的开系统中,类似git的颁布管理工具和类似makefile的代码编译生成工具常常用到,那么在实际的项目实践中,rpc生成的哪些代码又该怎样用makefile和git管理维护呢?下面结合本人最近的工作实践和大家一起探讨,欢迎各位批评指正. 1.makefile里如何使用RPC及其生成代码 根据rpcgen生成代码的命名规则,可以在Ma

4412开发板Linux系统编程实战-字符设备控制

在 linux 驱动中字符驱动是必须掌握的,本章主要介绍字符设备应用的程序,无论是学习了后面的知识自己写的字符驱动,还是已有的字符驱动,都需要能够写一些简单的应用程序. 即使从事 linux 驱动的工作,linux 驱动写出来之后,也需要由驱动程序员编写简单的应用进行测试的. 另外,关于驱动部分,迅为电子有专门的驱动实验教程提供给大家学习,大家有了这些基础之后再去学习底层的知识就会很容易了. 在使用手册的第八章,大家可以看到这些 c 程序也是可以在 Android 下面运行的,只不过没有图形界面

Linux Shell编程实战---shell实现图片下载神器

$ cat dowonload_image.sh  #!/bin/bash ######################################### #图片下载器                              # #script_name: dowonload_image.sh         # #author:weixiaoxin write by 2017-09-20   #      #########################################

《linux c 编程实战 》 -我的纠错笔记

一切仅作为参考,欢迎任何人讨论 [页数] 151     [位置] my_rwl.c [类型]  代码错误 [描述]   从书上看 __LINE__,是一个下划线,但实际上内置宏是前后各两个下滑线组成的,即 _ _LINE_ _ [页数] 195     [位置] studyuid.c [类型]  代码错误 [描述]   strerror()的头文件是string.h ,需要添加之后才能代码才能运行 [页数] 251    [位置] ctrlpocess.c [类型]  代码错误 [描述]  

Linux Shell编程实战---计算特定目录下前10个大文件

计算特定目录下前10个大文件 在给定的目录下,想知道有哪些大文件存在,取前十个,按文件大小排行 (1).使用awk来实现 #!/bin/bash path=/root/shell find $path-type f | awk '{ var=$0 "ls -l "var |getline var1 split(var1,a," ") filename=a[9] filesize=a[5] printf("%s %s\n",filename,fil

Linux Shell编程实战---Shell中的文本切片技术

Shell中的文本切片技术 在shell中竟然也是有字符串切片这个东西存在的,一直在python中运用切片,下面记录一下shell中切片的用法. (1).替换变量内容中的部分文本 $var="This is a line of text" $ echo${var/line/REPLACED} This is aREPLACED of text" line被替换成REPLACED. (2).指定字符串的起始位置和长度来生成子串 语法如下: ${variable_name:sta

Linux Shell编程实战---以逆序形式打印行

以逆序形式打印行 使用awk或tac可以搞定. tac这个命令的名称其实就是反过来书写的cat. (1).使用tac 该命令的语法如下: tac file1file2 - 它也可以从stdin中读取: $ seq 5 |tac 5 4 3 2 1 在tac中,\n是默认的行分隔符.但我们也可以用 -s "分隔符"选项指定自己的分隔符. (2).使用awk 使用awk的实现方式如下: $ seq 9 |\ awk '{lifo[NR]=$0 } END{for(lno=NR;lno>