一、NodeJS工程加密
Nodejs高效的运行机制,以及前后端使用JavaScript语言全栈式的开发,众多的Web开发者,趋之若鹜。
一方面,像使用python一样,通过本地配置nodejs环境,编写最基本的js文件,实现敏捷开发,例如使用以下两个函数,实现并发访问,相比较python而言,阅读性更好。
function sendHttpGet(url,port,path,data,callback){
/*
var data = {
a: 123,
time: new Date().getTime()};//这是需要提交的数据
*/
var callonce = true;
var content = querystring.stringify(data);
//console.log(JSON.stringify(data));
var options = {
hostname: url,
port: port,
path: path+'?' + content,
method: 'GET'
};
var req = http.request(options, function (res) {
//console.log('STATUS: ' + res.statusCode);
//console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
var _byteData = '';
res.on('data', function (data) { //加载到内存
_byteData += data;
}).on('end', function(){
//console.log('==========> Return: '+content+' Size:'+ _byteData.length);
if(callonce&&callback){
callonce = false;
callback();
}
});
res.on('data', function (data) {
if(callonce&&callback){
callonce = false;
callback();
}
});
res.on('end',function(){
if(callonce&&callback){
callonce = false;
callback();
}
});
res.on("close", function(e) {
console.log('close: '+content);
if(callonce&&callback){
callonce = false;
callback();
}
})
res.on("abort", function() {
console.log('abort: '+content);
if(callonce&&callback){
callonce = false;
callback();
}
});
/*
res.on('end', function(responseString) {
//这里接收的参数是字符串形式,需要格式化成json格式使用
//var resultObject = JSON.parse(responseString);
console.log('end return: ' + responseString);
});
res.on('data', function(chunk) {
console.log('data return: ' + chunk.length);
if(callback){
callback();
}
});
*/
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
if(callback){
callback();
}
});
req.end();
}
function execHttp(urls2){
if(urls2.length>1){
async.mapLimit(urls2, 10, function (urltmp, callback) {
sendHttpGet(tip,tport,"/getVTile/tms/"+tID+"/"+urltmp[0]+"/"+urltmp[1]+"/"+urltmp[2]+".pbf",{Z:urltmp[0],X:urltmp[1],Y:urltmp[2]},function(){
callback(null,{ID:urltmp[3],Z:urltmp[0],X:urltmp[1],Y:urltmp[2]});
});
}, function (err, result) {
//返回回调结果列表
//console.log('###############mapLimit final:'+JSON.stringify(result));
console.log("#################> Tiles:"+times +" "+(new Date()).Format("yyyy-MM-dd hh:mm:ss"));
getUrls();
});
}
}
另外一方面,js明码编译的方式,导致我们编写的有价值代码,暴露无遗,无法有效的控制代码安全。虽然网络上提供了代码压缩和混淆工具,降低代码的可读性,,建议使用gulp,可以直接在webstorm里面配置,不复杂。但是代码工程的结构却无法改变。
好在V8编译器可以使用字节码执行,即可以将js文件编译为jsc或者jsb,针对有限的js文件,建议使用bytenode编译为字节码文件。
二、回归正题,使用js轮询矢量切片
在GeoServer中,矢量切片支持预先缓存和实时生成,在惊叹开源强大的同时,问题来临,GeoServer矢量切片预先缓存出错,无法有效生成,看来GWC也不完善啊,所幸实时矢量切片,没有问题。针对此种情况,只好使用轮询的方式,逐一获取切片。由于前端使用mapbox加载矢量切片表达显示,注意,mapbox只支持EPSG 3857的坐标系,所以以3857坐标系矢量切片为基本分级规则,采用多线程的方式,并发获取。
1.设定矢量切片起始切片层级、行列号
2.设定每次切片层级、行列号,不设定的话,自动计算,即1分为4,行列各自x2分扩展
3.每次生成一定数量切片访问连接组,通过控制并发数,执行完访问连接,再进行下一组,即不停的迭代访问,分组---》并发---》分组---》并发。。。。。
原来使用python来做,由于切片服务端采用的是nodejs,何不用Nodejs客户端试试呢? 写完发现真的是高效,并不比python弱。
附件代码中,对接的是只定义的切片服务端,并不能够直接与Geoserver对接,稍作访问地址调整,即可以实现。