zoukankan      html  css  js  c++  java
  • 玩转nodeJS系列:使用原生API实现简单灵活高效的路由功能(支持nodeJs单机集群),nodeJS本就应该这样轻快

    前言:

    使用nodeJS原生API实现快速灵活路由,方便与其他库/框架进行整合;

    1、原生API,简洁高效的轻度封装,加速路由解析,nodeJS本就应该这样轻快

    2、不包含任何第三方库/框架,可以灵活的搭配其他库/框架进行web开发


    github项目地址:https://github.com/eguid/eguidRouter

    1、API介绍及使用说明

    注:新版本新增一个修改/自定义静态路由处理方法和开启单机集群功能集群
    nodejs单机多进程(集群)实现:http://blog.csdn.net/eguid_1/article/details/52849472

    1.1、在入口中引入eguidRoute路由模块

    var eguid = require("./eguidRouter");

    1.2、定义一个REST请求处理方法

    var getNowTime = function(req, res, pathName) {
        res.writeHead(200, { 'Content-Type': 'application/json;charset=utf-8' });
        res.write("{'retSt': 200,'retMsg': '请求成功','retData':' 当前时间:" + new Date().toLocaleString() + "'}");
        res.end();
    };

    1.3、添加REST请求处理方法到动态路由

    add("请求名","请求对应的处理方法")
    例如:

    eguid.add("/getNowTime", getNowTime);//getNowTime请求会自动调用上面定义的getNowTime方法

    如果不喜欢上面这种写法的话,当然也可以这样:

    eguid.add("/getNowTime",function(req, res, pathName){...});

    1.4、设置静态请求的别名

    index("别名","原始静态资源路径")设置的是静态资源请求的别名

    eguid.index('/', '/index.html');//设置首页


    eguid.index('/helloWorld', '/index.html');//设置原始页面别名打开,/helloWolrd请求打开的是/index.html静态页面

    1.5、创建新的静态路由处理

    modStatic(req,res,pathName)
    该方法允许更改静态资源访问方式,该方法会覆盖默认的静态路由处理方式,方便从缓存中读取静态资源或者进行模板操作

    1.6、开启服务器,监听端口

    eguid.start(8081);


    新版支持eguid.start(8081,8);//多进程共享端口号8081,开启8个进程,其中包含1个主进程,7个子进程


    开启服务器后会自动进行静态资源路由和根据添加的路由进行解析

    2、eguid路由0.2.1代码一览,如丝般顺滑的原生API体验 :-D

    新版本请转到github项目地址查看,github项目地址:https://github.com/eguid/eguidRouter
    const http = require('http');
    const url = require('url');
    const path = require('path');
    const fs = require('fs');
    const cluster = require('cluster');
    //路由表
    var routeArr = {};
    //进程列表
    var workers = {};
    //进程数量
    var clusterNum;
    //解析请求地址
    var getPathName = function(reqUrl) {
        var urlParse = getUrlParse(reqUrl);
        return urlParse.pathname;
    };
    //获取url解析
    var getUrlParse = function(reqUrl) {
        return url.parse(reqUrl);
    };
    //是否是一个请求
    var isFunc = function(pathName) {
        return typeof routeArr[pathName] === 'function';
    };
    /**静态资源处理 param(req:请求,res:响应,pathName:路径) */
    var resStatic = function(req, res, pathName) {
        fs.readFile(pathName.substr(1), function(err, data) {
            err ? endErrorReq(res, 501) : endStaticReq(res, pathName, data);
            res.end();
        });
    };
    //响应静态资源
    var endStaticReq = function(res, pathName, data) {
        var suffix = path.extname(pathName);
        res.writeHead(200, { 'Content-Type': suffix === ".css" ? 'text/css' : 'text/html;' + 'charset=utf-8' });
        res.write(data);
    };
    //结束错误请求
    var endErrorReq = function(res, err) {
        res.writeHead(err);
        res.end();
    };
    /** 路由分发处理器 */
    var routeHandler = function(req, res) {
        var pathName = getPathName(req.url);
        isFunc(pathName) ? routeArr[pathName](req, res, pathName) : resStatic(req, res, pathName);
        console.log("处理了一个请求:" + pathName);
    };
    /** 添加动态路由解析  
     * param{
     * reqUrl:请求地址, 
     * service:function(request:请求,response:响应,pathName:请求名)}
     */
    var addDynamicRoute = function(reqUrl, service) {
        console.log("添加的服务名:" + reqUrl);
        routeArr[reqUrl] = service;
    };
    /**  开启服务器并监听端口  param{port:端口号}*/
    var startServer = function(port, num) {
        clusterNum = num;
        if (num) {
            startClusterSever(port, num);
        } else {
            //创建服务器  
            http.createServer(function(req, res) {
                routeHandler(req, res);
            }).listen(port); //注意这里的端口改成了变量
            //开启后在控制台显示该服务正在运行  
            console.log('Server running at http://127.0.0.1:' + port);
        }
    };
    /** 设置静态页面请求别名 param(newUrl:新的请求路径, oldUrl:原始路径) */
    var setIndex = function(newUrl, oldUrl) {
        addDynamicRoute(newUrl, function(req, res) {
            resStatic(req, res, oldUrl);
        });
    };
    /**自定义静态页面处理方式 staticHandlerService=function(req,res,pathName)*/
    var setresStaticFunc = function(staticHandlerService) {
        resStatic = staticHandlerService;
    };
    
    //开启集群服务
    var startClusterSever = function(port, numCPUs) {
        if (cluster.isMaster) {
            for (var i = 0; i < numCPUs; i++) {
                const work = cluster.fork();
                console.log(work.process.pid);
                workers[i] = work;
            }
            cluster.on('exit', (worker, code, signal) => {
                console.log(`worker ${worker.process.pid} died`);
            });
        } else {
            console.log(cluster.worker.id);
            http.createServer((req, res) => {
                console.log("子进程:" + cluster.worker.id + "正在处理请求...");
                routeHandler(req, res);
            }).listen(port);
    
        }
    }
    exports.route = routeHandler;
    exports.add = addDynamicRoute;
    exports.start = startServer;
    exports.index = setIndex;
    exports.modStatic = setresStaticFunc;
    /**
     * eguidRouter快速灵活的路由
     * 功能实现:
     * 1、自动静态路由解析
     * 2、支持手动设置静态路由别名
     * 3、支持创建新的静态路由实现(方便加载模板)
     * 4、动态路由解析
     * 5、自动错误响应
     * 6、使用原生API,无第三方框架
     * 7、支持cluster单机集群(机器性能压榨机)
     */











  • 相关阅读:
    SpringBoot整合Spring Data Elasticsearch
    Elasticsearch(一)基础入门
    二叉排序树
    数据结构之栈
    数据结构之队列
    MySQL主从备份
    Redis主从复制之哨兵模式(sentinel)
    shiro核心
    MySQL常用命令
    Docker常用命令
  • 原文地址:https://www.cnblogs.com/eguid/p/6821584.html
Copyright © 2011-2022 走看看