node(thrift)

thrift是一种跨语言的RPC框架,据说uber采在node.js项目中采用thrfit后,比原有的http+json的方式提高近20倍的性能。

所谓的RPC本质上就是客户端将需要调用的方法名和参数通过通信协议传递给服务端,服务端计算后将返回值同样以通信协议返回,该方法在需要实现分布式的应用系统中较常见。

复杂的话,可以做成内部总线的形式。

本文记录一个node.js下thrift的简单例子。

1、下载thrift编译工具,本人用的是最新的0.92版本(当天),在windows下安装后并配置环境变量;

2、编写服务定义文件,类似corba里的IDL文件,如下:

  struct User{
     1: string username,
     2: string password,
    }
    service UserService{
     void add(1: User u),
    }  

3、编译该文件,执行:thrift --gen js:node user.thrift,执行后会在gen-node.js中生成两个文件user_types.js和UserService.js,将两个文件拷贝到需要远程调用的工程中;

4、在node工程里安装thrift插件包,执行npm install thrift

5、编写server工程:

var thrift = require(‘thrift‘);

var UserService = require(‘./gen-nodejs/UserService.js‘);
var ttypes = require(‘./gen-nodejs/user_types‘);    

var users = [];

var server = thrift.createServer(UserService, {
   add: function(user, callback) {

    users.push(user);
    console.log("server add:", users);
    callback();
  }
},{});

server.listen(3344);
console.log(‘server start‘);

6、编写client工程:

var thrift = require(‘thrift‘);

var UserService = require(‘./gen-nodejs/UserService.js‘);
var ttypes = require(‘./gen-nodejs/user_types‘);

var connection = thrift.createConnection(‘localhost‘, 3344);
var  client = thrift.createClient(UserService, connection);

var user = new ttypes.User();
user.username = ‘fredric‘;
user.password = "sinny";

connection.on(‘error‘, function(err) {
  console.error(err);
});

client.add(user, function(err, response) {
  if (err) {
    console.error(err);
  } else {
    console.log("client stored:", user.username);
    connection.end();
  }
});

7、分别执行server和client工程,会看见client远程调用了server端的add方法。

时间: 2024-08-12 10:32:13

node(thrift)的相关文章

HTTP与RPC(Thrift)

什么是RPC 从网络协议来说,Http协议与Rpc同属于应用层, 他们的底层都是tcp协议. RPC(即Remote Procedure Call,远程过程调用)和HTTP(HyperText Transfer Protocol,超文本传输协议)他们最本质的区别,就是RPC主要工作在TCP协议之上,而HTTP服务主要是工作在HTTP协议之上,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹. 1.RPC服务 (1)RPC架构      先说说RPC服务的

前后端分离————VUE+node(express)

前后端分离----VUE+node(express) vue作为前端的框架,node(express)作为后端的框架.无数据库,使用端口保存数据. VUE: 使用vue-cli构建vue项目(vueapp). npm install -g vue-cli(安装,安装过的就不用了) vue init webpack vueapp axios:(与ajax相似) import axios from 'axios' var url="http://localhost:3000" //expr

初步认识Node(二)

上一篇我们认识了Node是什么之后,这一篇我们主要了解的就是它的框架了.而它的框架又分为两大类,Web框架和全栈框架,接下来我们一个一个的来了解. Web框架 Web框架可以细分为Web应用程序框架和API框架,前者能够开发出RESTful(一种软件架构风格)的API,后者在此基础上还包括渲染.模板等为前段准备的功能. 一.Web应用框架 根据风格来分又可以分为Rails和Sinatra两种. 1.Rails 风格:不重复自己和约定优于配置,以及严格遵循MVC结构开发. 知名框架有:(0)Sai

node(4)express 框架 EJS模板,cookie, session的学习

一.EJS 概述:前端咱们使用过的一个模板套路,是underscore的套路.接下来EJS它属于后台工程师人的模板. https://www.npmjs.com/package/ejs 官网地址 特点: Control flow with <% %>             流程控制语句用的是<% %>   :例如if   for循环等等 Escaped output with <%= %> (escape function configurable)     如果有赋

LeetCode Populating Next Right Pointers in Each Node (技巧)

题意: 给一棵满二叉树,要求将每层的节点从左到右用next指针连起来,层尾指向NULL即可. 思路: 可以递归也可以迭代.需要观察到next的左孩子恰好就是本节点的右孩子的next啦. (1)递归:这个更快. 1 /** 2 * Definition for binary tree with next pointer. 3 * struct TreeLinkNode { 4 * int val; 5 * TreeLinkNode *left, *right, *next; 6 * TreeLin

初学Node(四)事件循环

Node中的事件循环 事件循环是Node的核心,正是因为有了事件循环JS才能够在服务端占有一席之地.JS是一种单线程语言,但是它的执行环境是多线程的在加上JS的事件驱动这一特点,使使JS在执行的过程中没执行到一个异步操作就交由后台处理然后继续向下执行,在遇上一个异步操作又交由后台处理,JS的执行线程不会发生阻塞,一旦JS代码执行完毕就会去后台查看有没有满足条件的异步操作一旦有满足条件的就执行事先定义好的处理函数. 在Node中通过EventEmitter(事件发生器)来实现这种功能,EventE

初学Node(三)模块系统

模块系统 Node根据CommonJS规范实现了一套自己的模块机制,可以使用require()导入一个模块,使用module.exports导出一个模块. require使用 在Node中我们可以使用require()导入一个模块,此时我们就会获得一个被导入模块的对象,我们就可以利用这个对象来完成一些操作,例如: var fs = require("fs"); fs.readFile("content.txt",function(err,data){ if(err)

初学Node(一)国际惯例HelloWorld

简介 没有用过Node,记的这些只是学习的笔记,有什么错的地方,望各位前辈指正. Node是一个服务器端Javascript解释器,依赖于Chrome v8引擎进行代码编译,事件驱动.非阻塞I/O都是他显著的特点. 服务器能够处理的并发连接的最大数量是目前Web应用程序架构的瓶颈,Node的出现就打开了这个突破口,因此Node特别适合一些高并发的应用场景. npm是Node的包管理工具,这是Node的一个内置功能,用来安装和管理Node模块,现如今已经是在开发中不可或缺的一个利器. 更多的资料可

初学Node(五)文件I/O

文件读写 Node的出现的一个亮点就是让JS也有了读写文件的能力,而且实现起来要比其他语言更简单,对文件的一些操作我们都可通过fs模块来完成.fs即fileSystem的缩写,fs模块可以完成对文件的所有操作. 可以通过fs.readFileSync来同步的读取文件: var fs = require("fs"); var data = fs.readFileSync("content.txt"); console.log(data.toString()); fs已