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服务器已经启动了。至于其他的操作,可以自行操作一下。
相关推荐
SpringBoot以其简洁、快速的特性,成为了现代Java开发中的首选框架,它使得构建基于RPC的服务变得非常简单。本教程将深入探讨如何在SpringBoot中实现RPC服务。 首先,理解RPC的基本概念是必要的。RPC允许服务提供者...
总的来说,基于TCP协议的WCF调用简单程序涵盖了服务开发的基本流程,从服务端的设计、实现到客户端的调用,都是学习和掌握WCF技术的关键步骤。这种通信方式在企业级应用中非常常见,尤其是在需要高性能、高可靠性的...
基于RPC服务的分布式TCP网络通信框架,基于muduo库和protobuf和zookeeper服务配置中心实现,在linux上用C++开发。 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室...
《网络连接服务开发人员参考库(第3卷)RPC与Wnet》是为网络服务开发者提供的一本详尽参考资料,涵盖了远程过程调用(RPC)和Windows网络(Wnet)两大核心主题。这本书以高清PDF格式呈现,为读者提供了清晰易读的体验...
总结,Protobuf RPC是一种高效的RPC通信方式,它利用protobuf进行数据序列化,基于TCP协议保证传输的可靠性。在Java中实现Protobuf RPC涉及服务接口定义、客户端和服务端的实现、TCP连接管理等多个方面,适合于对...
基于TCP协议的二进制RPC通信协议的Java实现源码+项目说明.zip 一种基于TCP协议的二进制高性能RPC通信协议实现。它以Protobuf作为基本的数据交换格式,支持完全基于POJO的发布方式,极大的简化了开发复杂性 - 完全...
基于Netty框架的RPC服务 项目简介 本项目是一个基于Netty框架实现的RPC(远程过程调用)服务。Netty是一个高性能、异步事件驱动的网络应用框架,适用于快速开发可维护的高性能协议服务器和客户端。本项目利用...
下面将详细阐述基于RPC方式的文件传输应用开发的关键知识点。 一、RPC原理 RPC的核心思想是通过网络调用远程计算机上的函数或方法,使得客户端可以透明地执行服务端的操作,而无需关心底层通信细节。它简化了分布式...
RPC(Remote Procedure Call)是一种进程间通信技术,它允许程序在不同的网络环境下调用另一台计算机上的函数或方法,就像是直接调用本地函数一样简单。本示例是基于Socket实现的RPC调用Demo,让我们深入探讨一下这...
本文将深入探讨如何基于Java实现一个简单的RPC框架,并涉及心跳检测和生产消费者模型这两个关键概念。 首先,RPC允许一个程序调用另一个在不同地址空间中的程序,这个地址空间可能在同一个机器上,也可能在远程网络...
Thrift是由Facebook开发的一种开源跨语言服务框架,它允许定义数据类型和服务接口,然后自动生成各种编程语言的代码,使得开发者可以轻松地在不同语言之间进行通信。RPC则是实现分布式系统中不同节点间通信的一种...
【基于TCP的远程字典服务(RemoteLookup)】是一种网络通信协议,它允许客户端应用程序通过TCP/IP协议连接到远程服务器,查询并获取字典数据。这种服务在各种场景下非常有用,例如软件开发中的词汇查找、语言翻译工具...
ONC RPC,全称为Open Network Computing Remote Procedure Call,是一种基于Internet协议栈的远程过程调用标准,它允许程序在不同的网络计算机之间进行通信,就像它们在同一台机器上运行一样。这个"ONCRPC.rar_ONC...
在本实例中,我们将关注一个基于Thrift的RPC调用实现,Thrift是由Facebook开发的一种高效的跨语言服务开发框架。 Thrift的核心思想是定义一种中间描述文件(.thrift),该文件包含了服务接口、数据结构以及服务间的...
Java语言在IT行业中占据着重要的地位,特别是在分布式系统开发中,其开源RPC(Remote Procedure Call)服务框架扮演了核心角色。RPC允许程序在不同的网络环境中像调用本地方法一样调用远程系统的服务,极大地简化了...
Curry是一个针对Java开发的轻量级框架,其核心特性是基于RPC(Remote Procedure Call)技术,用于构建面向服务的架构。RPC允许程序在分布式环境中像调用本地方法一样调用远程系统的服务,大大简化了分布式系统之间的...
**基于IOCP的远程函数调用...总的来说,基于IOCP的RPC在Delphi中实现了高效、低延迟的远程函数调用,使得分布式系统间的通信变得简单且高效。通过理解和掌握这一技术,开发者可以构建更强大、更灵活的网络应用程序。
森林(forest)是一个基于Netty构建的轻量级、高性能的分布式RPC服务框架。这个框架的设计目标是简化RPC调用,提高服务之间的通信效率,并且提供了丰富的功能来应对分布式环境中的各种挑战。让我们深入探讨一下forest...
首先,RPC的核心理念是“透明性”,即客户端调用远程服务就像调用本地函数一样简单。在名称获取RPC服务端的场景下,客户端并不需要知道服务的确切网络位置,只需要知道服务的名称即可。这样的设计极大地简化了分布式...