Skip to content

Clouda-team/rapid-webrpc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rapid-webrpc

基于websocket的rpc封装工具

#How to use the rapid-webrpc

示范一个简单的在server端发布方法与在client中使用发布接口的过程.

##At Server-Side

/**
 *  引入所需的rapid组成. 这里将示范一个简单的接口和rdb查询的操作接口, 
 *  所以这里使用了simple-mongodb来访问本地的mongodb
 */
require("rapid-core");
require("rapid-httpserver");
require("rapid-webrpc");
require("rapid-simple-mongo");

rapid.define({
	"config.rapid-service-sockjs":{
		prefix:"/haha/heihei"
	},
	// httpserver只做为一个文件server,没有其它内容
	"config.rapid-httpserver":{
		autoStart:true,
		mapping:[
		    {	
		    	url:"/*",
		    	resource:"/app/*"
    		}
		]
	}
});

rapid.watch("plugin.rapid-simple-mongo","plugin.rapid-service-sockjs",function(mongo,socketMgr){
	
	// 默认连接本地的mongodb.
	var db = mongo.getAgent({},{
		idle:1000 * 10
	});
	// 处理db的错误. 防止没有error handle引发的服务崩溃
	db.on("error",function(err){
		log.err(err);
	})
	
	/**
	 * addPoint方法
	 * 
	 * addPoint(factory,description,name);
	 * 
	 * factory是服务像,上面的方法将被发布为对像的接口.
	 * description是一个描述factory的对像,用来精确描述接口的参数及返回内容. 
	 * name,表示发布接口的名称, 如果description中未提供name,则这个参数升效,否则以description中的为准.
	 * 
	 * 如果未提供description与name, 方法将自动扫描factory的结构,自动生成一个description对像,以及一个随机的名称.
	 * 这个随机的名称,在每次服务启动的时候都会不同.所以,请小心.
	 */
	// 添加一个简单的服务接口
	 socketMgr.addPoint({
		 // 以下划线开头的,直接认为是内部方法,不会向外暴露
		 _notadd:function(){},
		 // 如果没有参数,也没有callback,认为是一个notify方法,只调用,但是并不确认是否执行成功
		 what:function(){
			 console.log(arguments);
		 },
		 // 如果有一个callback,由认为是正常的通迅方法,
		 hello:function(cb){
			 cb && cb(null, "what,what,what???");
		 },
		 // 带参数的方法
		 say:function(name,cb){
			 cb && cb(null, name + " say, what is that???");
		 }
	 },null,"test");
	 
	 // 添加另一个服务接口,这个接口将做一个简单的db查询.
	 socketMgr.addPoint({
		 // 只有一个简单的方法,用来查
		query:function(name,selector,cb){
			name = name || "test";
			selector = selector || {};
			
			db.find(name,selector,function(err,rs){
				cb(err,rs);
			});
		}
	 },null,"db");
	 
});

##At Browser-Side

首选需要将client-side目录下的 "rapid-webrpc.js" 放至到能从browser中访问的位置.

<!-- 引入两个依赖的库 -->
<script type="text/javascript" src="./socketjs.js"></script>

<script type="text/javascript" src="./rapid-webrpc.js"></script>

<script type="text/javascript">

// 指定连接位置并给出一个client的名称
RapidClient.setup("/haha/heihei","testclientid" + (Date.now() / 1000));

// 处理一系统的全局事件, error, close, online, offline, unknowMsg 
RapidClient.on("error",function(err){
	console.log(error);
});

RapidClient.on("close",function(reason){
	console.log(reason);
});

RapidClient.on("unknownMsg",function(reason){
	console.log(reason);
});

//通过getProxy获得一个后端方法的代理对像
RapidClient.getProxy("test",function(err,test){
	
	if(err){
		console.log(err.stack);
		return;
	}
	
	// 直接使用.
	test.what();
	
	test.say("client ",function(err,rv){
		console.log(rv);
	});
	
	test.hello(function(err,rv){
		console.log(err,rv);
	});
});

RapidClient.getProxy("db",function(err,db){
	
	if(err){
		console.log(err.stack);
		return;
	}
	
	if(db){
		db.query("demo",{},function(err,rs){
			console.log(err,rs);
		});
	}
});

</script>

About

基于websocket的rpc封装工具

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published