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













本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1759031 ,如需转载请自行联系原作者



目录
打赏
0
0
0
0
143
分享
相关文章
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
109 13
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
30 个实用的 Linux 命令贴与技巧,提升你的效率(附实战案例)
本文介绍了30个实用的Linux命令及其应用场景,帮助你提升命令行操作效率。涵盖返回目录、重新执行命令、查看磁盘使用情况、查找文件、进程管理、网络状态监控、定时任务设置等功能,适合各水平的Linux用户学习和参考。
|
4月前
|
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
213 6
|
4月前
|
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
214 3
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
63 1
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
5月前
|
揭秘Linux心脏:那些让你的编程事半功倍的主要系统调用
【8月更文挑战第31天】Linux中的系统调用是操作系统提供给应用程序的接口,用于请求内核服务,如文件操作、进程控制等。本文列举了22种主要系统调用,包括fork()、exec()、exit()、wait()、open()、close()、read()、write()等,并通过示例代码展示了如何使用fork()创建新进程及使用open()、write()、close()操作文件。这些系统调用是Linux中最基本的接口,帮助应用程序与内核交互。
79 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等