文档章节

基于TCP的RPC服务的简单开发

 石锅_鱼
发布于 2017/03/31 10:59
字数 1320
阅读 24
收藏 0

RPC服务器可以让你从远程机器上发起过程调用。利用这个基于TCP的RPC服务器,人们只需要一个简单的TCP客户端就能连上erlang节点、执行erlang命令,并检查执行结果。

不过这个RPC应用部署到线上服务器上会造成一个安全漏洞,因为它允许用户在服务器上执行任意代码,不过这些问题并不是太严重,只要对该工具可访问的模块和函数进行限制就可以堵上这个漏洞。

首先我们要知道你所创建的是什么。该RPC服务器会监听TCP套接字并接受来自外来TCP客户端的连接。建立连接之后,客户端将可以通过TCP之上的建议ASCII文本协议执行函数调用。这样就能判断出需要两个进程,一个是监督进程,由它派生出实际的RPC服务器进程。第二个进程会创建一个监听套接字等待其他人连接。当连接到来时,它会从连接上读取描述普通erlang函数调用的ASCII文本,并在执行调用后将结果通过TCP流返回。

行为模式基础

行为模式的组成部分有:行为模式接口;行为模式实现;行为模式容器。

行为模式的接口时一组特定的函数和相关的调用规范。Gen_server行为模式的接口包含留个函数:init/1、handle_call/3、handle_cast/2、handle_info/2、terminate/2和code_change/3。

所谓实现,指的是由程序员提供的具体应用相关的代码。行为模式的实现是一个导出了接口所需的全部函数的回调模块。实现模块中还应包含一项属性-behaviour(...),用来说明该模块所实现的行为模式的名称,这样编译器便可以协助检查模块是否完整的导出了接口所需的所有函数。

行为模式容器,容器就是一个进程,它执行的是某个库模块中的代码,并且回调用与行为模式实现相对应的回调模块来处理应用相关的逻辑。

实现RPC服务器

首先要创建模块的首部。不过在创建首部之前你得创建一个容纳它的文件。我们将它命名为tr_server.erl。打开常用的编辑器,开始写代码吧。

文件创建好之后,我们要做的第一件事就是录入文件首部的文件级注释:

 

这可能是你头一次见到注释中包括EDoc标注。EDoc可以直接通过源码标注生成文档,是随标准erlang/OTP发行版一同发布的文档生成工具。

 

上图中,-module(...)属性,括号中的内容应与你的文件名一样,去掉后缀。-behaviour(gen_server)这个就是行为模式属性了,它告诉编译器这个模块是某行为模式的一个实现。接下来就是导出声明了,通常要写两个,第一个是写自己的API,第二个是行为模式接口要求导出的函数。

下面就要写自己的API段了:

 

从代码中可以看出tr_server所能做的三件事:用start_link()或start_link(Port)启动服务器;用get_count()查询服务器已处理的请求数;调用stop()终止服务器。

下面就该写回调函数段了:

 

 

如上图所示:init/1,初始化回调——每次启动新的gen_server容器进程这个函数都会被调用。Handle_call/3,同步请求回调——每次收到由gen_server:call/2发送的消息时这个函数就会被调用。Handle_cast/2,异步消息回调——API函数stop()会使用gen_server:cast/2向服务器派发异步消息stop,发送完毕后无需等待应答。Handle_info/2用来处理采用call或cast以外的手段发送给gen_server的消息,这些消息被称作带外消息。最后两个函数必不可少,但是当前我们对它们不感兴趣,所以不在此多介绍。

再接下来就是内部函数,内部函数就是如何处理输入、解析和执行元调用:

 

内部代码可分为4个部分:切分输入、解析函数参数、执行请求中的调用以及回传结果。首先,可以看到d0_rpc/2函数的内部逻辑都被包含在try表达式内,这是因为需要处理来自外部的数据。后面的模块的操作相对复杂,起作用就是为了格式化文本,在这里不予多做解释。

下面就可以运行RPC服务器了,执行第一步就是编译代码,会生成一个tr_server.beam的可执行文件。然后启动服务器:

 

当然你回看到我这代码多了一些前缀,那是节点,这无关紧要,看到这样的代码就证明咱们的代码写的没有问题,这个RPC服务器已经启动了。至于其他的操作,可以自行操作一下。

© 著作权归作者所有

粉丝 1
博文 4
码字总数 6621
作品 0
私信 提问
如何使用Netty开发实现高性能的RPC服务器

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议。说的再直白一点,就是客户端在不必知道调用细节的...

vshcxl
2017/10/20
0
0
新一代RPC框架-GRPC

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简...

kiwisoft
2016/10/27
59
0
Spring+Netty+Protostuff+ZooKeeper实现轻量级RPC服务

RPC简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。 RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协...

Listen_ing
2016/05/26
2.3K
12
基于Tcp协议与基于Http协议的RPC简介笔记

前言:之前对于RPC方面的学习多限于对RMI原理的学习,直到今天在看陈康贤前辈的《大型分布式网站架构-设计与实践》这本书的时候,才发现原来RPC可以基于TCP协议也可以基于HTTP协议(这里所说...

浮躁的码农
2018/05/28
0
0
Java游戏服务器通用基础框架

[作品和服务描述] 此框架为本人从事7年游戏后端开发的技术积累,为通用性服务器开发框架。整个框架基于自行编写的事件通知机制(原型基于观察者模式+命令模式)。每个业务对应一个Command,通...

银杏果果
2016/10/09
3
0

没有更多内容

加载失败,请刷新页面

加载更多

聚合与组合的关系

作者总结的很好 http://www.360doc.com/content/07/0612/11/16903_553244.shtml

南桥北木
5分钟前
0
0
好程序员web前端分享DIV+CSS3和html5+CSS3有什么区别

好程序员web前端分享DIV+CSS3和html5+CSS3有什么区别,不管是DIV+CSS3还是html5+CSS3,他们都是我们对网页开发布局方式的统称,但是DIV+CSS3作为网页的基础开发这句话其实并不严谨,因为而d...

好程序员IT
11分钟前
0
0
比特币应用开发10大必备NuGet包

如果要在.NET环境下开发比特币应用,本文列出的10个NuGet开发包是你不可或缺的利器。 如果要快速掌握.NET平台下比特币的应用开发,推荐访问汇智网的课程: C#比特币开发详解 1、NBitcoin C#...

汇智网教程
12分钟前
0
0
Debian 10 Buster发布的新功能

Debian 10 Buster即将发布。第一个候选版本已经出局,我们应该会在几周内看到最终版本。 Debian 10 Buster发布时间表 Debian 10 Buster没有设定的发布日期。为什么会这样?与其他发行版不同,...

叫我甘道夫
22分钟前
2
0
从入侵到变现——“黑洞”下的黑帽SEO分析

概述 由于互联网入口流量主要被搜索引擎占据,网站在搜索引擎中的排名直接影响到市场营销效果,因此SEO服务应运而生。SEO(Search Engine Optimization)全称为搜索引擎优化,是指利用搜索引擎...

zhaowei121
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部