ios技术交流Android技术交流

nodejs 中间件 反向代理 接口转发

2021-03-10  本文已影响0人  浪人残风

背景

随着后端业务系统的增加,纵向需求不断扩展,一个业务系统已经无法满足需求了,衍生出多个业务系统,对外暴露的ip、端口就可能有多个,此时不方便外部接口调用,有些特殊行业客户出于安全性考虑不发提供多个对外端口,对外只能提供一个IP一个端口。
这时中间件就产生了!

概念

中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。
一个统一过滤请求的中间层,这就是中间件。

用途

中间件常见的用途有:

技术选型

案例demo

这里以nodejs为例,实现接口反向代理和合并端口功能
功能描述:
有两个业务系统:财务系统(financeSys)、用户系统(userSys),
分别部署到:
财务系统(financeSys):http://192.168.0.2/find
用户系统(userSys):http://192.168.0.3/login
对外暴露的接口分别是:
http://www.xxx.com/financeSys/find
http://www.xxx.com/userSys/login
对外暴露的接口格式为:http://www.xxx.com/系统名/业务URL,中间件系统根据请求地址的系统名来转发到对应的业务系统中
这时在www.xxx.com这个服务器上部署一个中间件,
收到http://www.xxx.com/financeSys/find的请求时转发到财务系统(financeSys)http://192.168.0.2/find
收到http://www.xxx.com/userSys/login的请求时转发到用户系统(userSys)http://192.168.0.3/login

架构图

图片.png

Nodejs项目分析

{
    "RequestLog": true, // 是否打印请求日志
    "ResponseLog": true, // 是否打印响应日志
    "ServerPort": 80, // 中间件服务端口,即对外暴露的接口端口
    "financeSys": "http://192.168.0.2", // 财务系统(financeSys)的转发地址
    "userSys": "http://192.168.0.3" // 用户系统(userSys)的转发地址
}
router: function(req) {
                const path = req.url;
                let pathArray = path.split("/");
                let projectContext = pathArray[1];
                // let suffix = path.substring(projectContext.length + 1, path.length);
                let serverUrl = config[projectContext];
                if (serverUrl != undefined && serverUrl != null) { // 配置文件已经配置转发路由
                    let proxyServer = serverUrl;
                    return proxyServer;
                } else { // 没有配置路由转发
                    if (config.RequestLog) {
                        logger.info("No Proxy Server!! path:" + path);
                    }
                    return {
                        protocol: req.protocol,
                        host: req.host,
                        port: config.ServerPort
                    };
                }
            }
            pathRewrite: function(path, req) {
                let pathArray = path.split("/");
                let projectContext = pathArray[1];
                let suffix = path.substring(projectContext.length + 1, path.length);
                return suffix;
            }
            onProxyReq: async function(proxyReq, req, res) {
                // 禁用缓存
                proxyReq.setHeader('Cache-Control', 'no-cache');
                // 标示接口赖在中间件
                proxyReq.setHeader('Interface-From', 'Middleware');
                if (config.RequestLog) {
                    logger.info("---------------------------- Request ----------------------------");
                    logger.info('URL:' + req.url);
                    logger.info('Method:' + req.method);
                    logger.info('Headers:' + JSON.stringify(req.headers));
                    const responseBodyStr = await getBody(req)
                    logger.info("Body:" + responseBodyStr);
                }
            },
            onProxyRes: async function(proxyRes, req, res) {
                if (config.ResponseLog) {
                    logger.info("---------------------------- Response ----------------------------");
                    logger.info("URL:" + req.url);
                    const responseBodyStr = await getBody(proxyRes)
                    logger.info("Body:" + responseBodyStr);
                }
            }
app.use(async (ctx, next) => {
    let url = ctx.originalUrl;
    if (url != '/favicon.ico') {
        await next();
    } else {
        let resStr = JSON.stringify({})
        ctx.response.body = resStr;
    }
});

项目运行打包

npm install
npm run start
node index.js

项目源码下载

项目源码:https://codechina.csdn.net/it1/project-middleware.git

如果觉得可以就点个👍吧,欢迎粉丝收藏,土豪打赏,您的关注就是我们创作的动力!

读者有什么想看的相关技术篇章,欢迎评论留言!

QQ交流群:908058499

上一篇下一篇

猜你喜欢

热点阅读