찾다
웹 프론트엔드JS 튜토리얼node.js_node.js의 RPC(원격 프로시저 호출) 구현 원칙 소개

방금 원격 시스템의 프로그램을 로컬에서 호출할 수 있는 방법인 RPC(원격 프로시저 호출)를 접하게 되었습니다. RPC의 원리를 학습하는 데 매우 좋은 간단한 nodejs 구현을 보았습니다. nodejs light_rpc

사용 예:

코드 복사 코드는 다음과 같습니다.

//서버
var light_rpc = require('./index.js');
var 포트 = 5556;
var rpc = 새로운 light_rpc({
결합: 함수(a, b, 콜백){
         콜백(a b);
},
​ 곱하기: 함수(t, cb){
         cb(t*2);
}
}).listen(포트);

샘플 클라이언트:

코드 복사 코드는 다음과 같습니다.

//클라이언트
rpc.connect(5556, 'localhost', function(remote, conn){
Remote.combine(1, 2, 함수(res){
If(res != 3){
console.log('ERROR', res);
}
});
});

전체 과정을 간략히 설명해주세요:

1. 서버는 프로그램을 시작하고, 포트를 수신하고, 클라이언트가 호출한 기능(예: 위 예의 결합 및 곱하기)을 구현하고 이를 개체에 저장합니다.
2. 클라이언트는 프로그램을 시작하고, 서버에 연결하고, 연결이 완료된 후 설명 명령을 보내 서버에 호출에 제공할 수 있는 함수 이름을 반환하도록 요청합니다.

코드 복사 코드는 다음과 같습니다.

Connection.on('연결', function(){
연결.쓰기(명령(descrCmd));
});

3. 서버는 설명 명령을 수신하고 호출 가능한 함수 이름을 래핑하여 전송합니다("결합", "곱하기")
4. 클라이언트는 서버에서 보낸 함수 이름을 받아 자체 개체에 등록하고 각 함수 이름에 대한 메서드를 래핑하므로 이러한 함수를 로컬에서 호출할 때 실제로 서버에 요청을 보냅니다.

코드 복사 코드는 다음과 같습니다.

for(cmd.data의 var p){
remoteObj[p] = getRemoteCallFunction(p, self.callbacks, 연결);
//getRemoteCallFunction 구현은 아래와 같습니다
}

5. 클라이언트가 서버 측 함수를 호출합니다.

1) callbackId라는 수신 콜백 함수에 대한 고유 ID를 생성하고 이를 클라이언트 개체에 기록합니다.
2) 호출 함수 이름, JSON 직렬화된 매개변수 목록, callbackId

등의 데이터를 패키징하여 서버로 보냅니다.

코드 복사 코드는 다음과 같습니다.

함수 getRemoteCallFunction(cmdName, 콜백, 연결){
반환 함수(){
var id = uuid.generate();
If(인수 유형[arguments.length-1] == '함수'){
​​ 콜백[id] = 인수[arguments.length-1];
}
var args = parsArgumentsToArray.call(this, 인수);
var newCmd = command(cmdName, {id: id, args: args});
Connection.write(newCmd);
}
}

6. 서버는 위의 정보를 받아 데이터를 파싱하고 매개변수 목록을 역직렬화한 후 함수 이름과 매개변수에 따라 함수를 호출합니다.

코드 복사 코드는 다음과 같습니다.

var args = cmd.data.args;
args.push(getSendCommandBackFunction(c, cmd.data.id));
self.wrapper[cmd.command].apply({}, args);

7. 함수가 완료된 후 결과를 직렬화하고 이전에 받은 callbackId와 함께 클라이언트에 다시 보냅니다.

코드 복사 코드는 다음과 같습니다.

함수 getSendCommandBackFunction(연결, cmdId){
반환 함수(){
var innerArgs =parseArgumentsToArray.call({}, 인수);
var resultCommand = command(resultCmd, {id: cmdId, args: innerArgs});
Connection.write(resultCommand);
};
}

8. 클라이언트는 함수 연산 결과와 callbackId를 수신하고, callbackId를 기반으로 콜백 함수를 꺼내어 연산 결과를 콜백 함수에 전달하여 실행합니다.

9. 전체 프로세스가 완료되었습니다. 자세한 내용은 소스 코드를 참조하세요. https://github.com/romulka/nodejs-light_rpc

몇 가지 참고 사항:

1. 클라이언트와 서버는 전체 프로세스 동안 연결을 유지합니다. http 프로토콜과 달리 전송 및 수신 후에 연결이 끊어지기 때문에 연결을 끊는 것으로 데이터 전송 완료를 판단할 수 없습니다. 데이터 수신 완료를 판단하기 위해 클라이언트와 서버에서 보낸 데이터는 간단한 프로토콜을 따릅니다. 데이터 패킷의 길이와 데이터 앞에 구분 기호를 추가합니다. 예를 들어 구분 기호는 n: [패킷 길이]입니다. data]를 이용하여 데이터를 수신한 후 먼저 데이터 패킷의 길이를 꺼내어 수신한 누적 데이터 패킷이 이 길이 이상인지 지속적으로 판단하면 1회의 데이터 전송이 완료됩니다. 데이터 분석 및 추출을 시작합니다.

2. 이 RPC는 매개변수의 함수 유형을 고려하지 않기 때문에 간단합니다. 예를 들어 매개변수가 객체이고 이 객체 아래에 함수 멤버가 있는 경우 JSON 직렬화 중에 함수가 무시됩니다. 함수는 서버 측에서 실행될 수 없습니다.

이 문제를 해결하려면 복잡한 처리가 필요합니다.

1. 원격 엔드로 전송될 각 매개변수를 심층적으로 탐색하고, 함수 멤버를 추출하고, 이 함수에 대한 고유 ID를 생성하고, 이를 로컬 객체에 넣고, 이 함수 멤버를 이 ID 문자열로 바꾸고 식별합니다. 멤버는 실제로 함수입니다. 이런 방식으로 객체를 직렬화하여 전송할 수 있습니다.
2. 서버는 호출을 수신하고 매개변수 객체에 있는 함수를 사용하려고 할 때 이것이 클라이언트에서 처리한 함수이고 ID를 가지고 있는지 확인하여 클라이언트에 다시 보냅니다. 동일한 방법으로 자체 콜백 함수를 설정하고 ID를 클라이언트에 전달하고 클라이언트의 콜백을 기다립니다.
3. 클라이언트는 함수 ID를 수신하고, 함수 엔터티를 찾아 호출하고, 완료 후 서버에서 제공한 콜백 ID에 따라 서버로 다시 보냅니다.
4. 서버는 결과를 받아 콜백 함수를 찾아 실행을 계속하고 완료합니다.

함수의 기록 방법은 다른 방법으로 완성할 수 있습니다. 일반적인 아이디어는 함수를 직렬화할 수 있는 것으로 대체하고, 원격 측에서 호출할 때 해당 함수를 로컬에서 찾을 수 있도록 기록하는 것입니다. dnode 구현을 참조할 수 있습니다.

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node.js gm是什么node.js gm是什么Jul 12, 2022 pm 06:28 PM

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

怎么使用pkg将Node.js项目打包为可执行文件?怎么使用pkg将Node.js项目打包为可执行文件?Jul 26, 2022 pm 07:33 PM

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

一文解析package.json和package-lock.json一文解析package.json和package-lock.jsonSep 01, 2022 pm 08:02 PM

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

分享一个Nodejs web框架:Fastify分享一个Nodejs web框架:FastifyAug 04, 2022 pm 09:23 PM

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

手把手带你使用Node.js和adb开发一个手机备份小工具手把手带你使用Node.js和adb开发一个手机备份小工具Apr 14, 2022 pm 09:06 PM

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

图文详解node.js如何构建web服务器图文详解node.js如何构建web服务器Aug 08, 2022 am 10:27 AM

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경