Http请求转发服务器实现

news2024/10/19 11:02:13

Http请求转发服务器实现

需求场景

云服务器通过VPN连接了现场的n台工控机,每台工控机上都在跑web程序,现在我想通过公网直接访问工控机上的web服务,给客户查看现场的具体运行情况,而不是让客户再装一个VPN,简化操作。

现在我们有以下几种方案可以实现:

1.使用代理,将每台工控机的web服务端口代理到云服务器上的一个空闲端口,这种方式的优点是不需要额外写代码实现,只需要通过配置代理即可,缺点是云服务器上端口占用过多,每打开现场的网址url上面都会带一个端口号。

2.使用Http请求转发服务器,将现场和他对应的VPN的ip地址映射起来存到数据库里,前端先请求服务器本地IP地址(127.0.0.1),当通过主界面跳转到某个现场时,通过数据库查询现场VPN的IP地址,然后将之后的请求都转发到对应的VPN地址,即可获取对应现场的数据

具体实现

使用Python实现请求转发服务器
  1. 使用Python实现请求转发服务器非常简单,用flask库即可轻松实现

    import queue
    import threading
    
    import requests
    from flask import Flask, request, jsonify
    
    from log import log
    
    # 初始化Flask应用
    app = Flask(__name__, static_folder="dist")
    
    # 捕获所有请求并转发
    @app.route("/", defaults={"path": ""}, methods=["GET", "POST", "PUT", "DELETE"])
    @app.route("/<path:path>", methods=["GET", "POST", "PUT", "DELETE"])
    def catch_all(path):
        # 构建转发的目标 URL,我这里将请求都转发到10.8.0.126服务器上
        forward_url = f"http://10.8.0.126/{path}"
        # 转发请求,并传递请求头、数据以及文件(如果有)
        headers = {key: value for key, value in request.headers if key != "Host"}
        # 获取请求的数据,根据请求方法选择适当的数据处理方式
        data = request.get_json() if request.is_json else request.form or request.data
    
        json_data = data or {}
        try:
            response = requests.request(
                method=request.method,
                url=forward_url,
                headers=headers,
                json=json_data,
                files=request.files,
                params=request.args,
            )
        except requests.RequestException as e:
            return str(e), 500
        # 返回转发请求的响应
        return response.content, response.status_code, response.headers.items()
    
    if __name__ == "__main__":
        app.run(debug=False, host="0.0.0.0", port=9095)
    
  2. 安装gunicorn库,部署转发服务程序(普通运行只供调试使用,不适用于生产环境)

    pip install gunicorn
    
  3. 运行转发服务程序

    gunicorn -b 0.0.0.0 -w 4 main:app
    

    在这里插入图片描述

使用C++实现请求转发服务器

在用Python完成请求转发服务器的开发后,方案却被领导否决了,因为后台程序都是用C++写的,用Python写不好融合,然后我继续开始研究C++服务端的方案,先采用cpp-httplib库实现。

  1. 代码实现,这里捕获所有请求使用了正则表达式,刚开始因为对这个库和正则不熟悉,卡了较长时间。

    #include <iostream>
    #include <httplib.h>
    #include <string>
    
    // 定义一个简单的路由处理器
    void catch_all(const httplib::Request& req, httplib::Response& res)
    {
        // 构建转发的目标 URL
        std::string path = req.path;
        std::cout << "path: " << path << std::endl;
        std::cout << "method: " << req.method << std::endl;
        std::string forward_url = "http://10.8.0.126/" + path;
    
        // 转发请求,并传递请求头、数据以及文件(如果有)
        httplib::Headers headers;
        headers = req.headers;
        headers.erase("Host");
    
        // 获取请求的数据,根据请求方法选择适当的数据处理方式
        std::string data;
        data = req.body;
    
        // 使用 httplib 客户端进行转发
        httplib::Client client("10.10.112.139", 9092);
        httplib::Result result;
        if (req.method == "GET") {
            result = client.Get(path, headers);
        } else if (req.method == "POST") {
            result = client.Post(path, headers, data, "application/json");
            std::cout << result->body << std::endl;
        } else if (req.method == "PUT") {
            result = client.Put(path, headers, data, "application/json");
        } else if (req.method == "DELETE") {
            result = client.Delete(path, headers);
        } else {
            res.set_content("Unsupported method", "text/plain");
            res.status = 405;
            return;
        }
    
        if (result && result->status == 200) {
            res.set_content(result->body, result->get_header_value("Content-Type"));
            res.status = result->status;
            for (const auto& header : result->headers) {
                res.headers.emplace(header.first, header.second);
            }
        } else {
            res.set_content("Forward request failed", "text/plain");
            res.status = 500;
        }
    }
    
    int main()
    {
        httplib::Server svr;
    
        // 捕获所有请求并转发
        svr.Get(R"(/.*)", &catch_all);
        svr.Post(R"(/.*)", &catch_all);
    
        auto ret = svr.set_mount_point("/", "/home/narada/ems/www");
    
        svr.listen("0.0.0.0", 8080);
        return 0;
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2218424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Axure重要元件三——中继器函数

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;中继器函数 主要内容&#xff1a;Item、Reperter、TargetItem 1、中继器的函数&#xff1a;Item\Reperter\TargetItem Item item&#xff1a;获取…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第五篇-着色器投影-投射阴影部分】

投射阴影 最初打算将投影内容放在上一篇中&#xff0c;因为实现非常快速简单&#xff0c;没必要单独成篇。不过因为这里面涉及一些问题&#xff0c;我觉得还是单独作为一篇讲一下比较好。 原理 这里要用到的是 Shadow Pass Switch ,它可以为非不透明的材质替换阴影 某些版本…

ubuntu22.04下GStreamer源码编译单步调试

前言 本文会通过介绍在linux平台下的GStreamer的源码编译和单步调试example实例。官网介绍直接通过命令行来安装gstreamer可以参考链接&#xff1a;Installing on Linux。 这种方法安装后&#xff0c;基于gstreamer的程序&#xff0c;单步调试的时候并不会进入到gstreamer源码…

架构师:Nginx 实现负载均衡的技术指南

1、简述 NGINX 是一种高性能的 HTTP 服务器和反向代理服务器,广泛应用于 web 服务器场景中。负载均衡是 NGINX 的重要功能之一,能够将请求分发到多个服务器上,提高应用的可用性和性能。 NGINX 负载均衡的主要策略: 轮询 (Round Robin): 将请求依次分发到后端服务器,每个…

中国移动机器人将投入养老场景;华为与APUS共筑AI医疗多场景应用

AgeTech News 一周行业大事件 华为与APUS合作&#xff0c;共筑AI医疗多场景应用 中国移动展出人形机器人&#xff0c;预计投入养老等场景 作为科技与奥富能签约&#xff0c;共拓智能适老化改造领域 天与养老与香港科技园&#xff0c;共探智慧养老新模式 中山大学合作中国…

Web应用程序的设计与前端开发

我们的客户专门从事自动化系统的开发和支持&#xff0c;用于分析、报告、规划和其他业务任务&#xff0c;以及集成外部产品。 任务 我们的客户开始开发一个用于企业业务分析的web应用程序。他们自己处理后端&#xff0c;而我们的团队负责界面和前端。界面不仅在视觉上具有吸引…

论文阅读(十六):Deep Residual Learning for Image Recognition

文章目录 1.介绍2.基本原理3.两种残差块4.网络结构 论文&#xff1a;Deep Residual Learning for Image Recognition   论文链接&#xff1a;Deep Residual Learning for Image Recognition   代码链接&#xff1a;Github 1.介绍 在ResNet网络提出之前&#xff0c;传统的卷…

医疗领域的RAG技术:如何通过知识图谱提升准确性

在医学领域&#xff0c;准确的信息检索和处理至关重要。随着大型语言模型&#xff08;LLMs&#xff09;的兴起&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术在医学信息处理中的应用越来越受到关注。本文将探讨RAG技术在医学领域的应用&#xff0c;特别是如何利用知…

动态规划 - 完全背包问题

文章目录 题目描述题解思路题解代码 题目描述 题解思路 完全背包问题和01背包问题不同的地方就是完全背包问题中每个物品能选无数次&#xff0c;而01背包问题中每个物品最多只能选择一次 如果你还没有学过01背包&#xff0c;请先看这篇博客学习01背包&#xff1a;https://blo…

基于Javaweb的医院挂号预约管理系统

系统展示 用户前台界面 管理员后台界面 医生后台界面 系统背景 在现代社会&#xff0c;随着医疗需求的不断增长&#xff0c;病患挂号成为医院面临的一大挑战。传统的挂号方式不仅耗时耗力&#xff0c;还容易引发混乱和不满。病患需要排队等候&#xff0c;挂号过程繁琐&#xff…

杨氏矩阵(有一个数字矩阵,矩阵的每行从左到右的递增的,矩阵从上到下是递增的请编写一个程序,在这样的矩阵中查找某个数字是否存在)

//杨氏矩阵 //有一个数字矩阵&#xff0c;矩阵的每行从左到右的递增的&#xff0c;矩阵从上到下是递增的 //请编写一个程序&#xff0c;在这样的矩阵中查找某个数字是否存在 // 1 2 3 // 4 5 6 // 7 8 9 #include<stdio.h> int main() {int a[3][3] { 0 };int i 0, j …

【设计一个恒流转恒压用于电池充电管理】2022-01-25

设计一个恒流转恒压用于电池充电管理&#xff0c;恒流定时恒压&#xff0c;看到一个限流稳压电路图。以下参数进行设计限流恒流<5安培稳压恒压12.6伏特&#xff0c;功率管选型NMOS场效应管IRF7403&#xff08;AO4407A&#xff09;&#xff0c;输入电压与输出压差必须大于4.4…

【计算机网络】HTTP报文详解,HTTPS基于HTTP做了哪些改进?(面试经典题)

HTTP协议基本报文格式 在计算机网络中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;是应用层的一种协议&#xff0c;用于客户端&#xff08;通常是浏览器&#xff09;和服务器之间的通信。HTTP报文分为请求报文和响应报文&#xff0c;以下是它们的基本格式。 1. H…

服务器数据恢复—服务器硬盘指示灯亮黄灯,raid崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; 一台浪潮服务器中有一组由6块SAS硬盘组建的RAID。服务器上划分了1个卷&#xff0c;存放Oracle数据库文件。 服务器故障&检测&#xff1a; 服务器上有两个硬盘指示灯亮黄灯&#xff0c;RAID崩溃&#xff0c;服务器不可用。 将故障服务器中所…

【机器学习】图像识别——计算机视觉在工业自动化中的应用

1. 引言 随着人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;的快速发展&#xff0c;计算机视觉已成为工业自动化中的核心技术之一。图像识别&#xff0c;作为计算机视觉领域的重要分支&#xff0c;能够通过分析和理解图像或视频数据来识别、分类或检…

【LeetCode:349. 两个数组的交集 + 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

如何使用 Browserless 抓取动态网站?

什么是动态网页&#xff1f; 动态网页是指其内容并非完全直接嵌入在静态HTML中&#xff0c;而是通过服务器端或客户端渲染生成的网页。 它可以根据用户的操作实时显示数据&#xff0c;例如在用户点击按钮或向下滚动页面时加载更多内容&#xff08;如无限滚动&#xff09;。这…

查缺补漏----三次握手与四次挥手

注意事项&#xff1a; ① 如果是和FTP服务器建立连接&#xff0c;那么要建立两个TCP连接。一个是控制连接一个是数据连接。 ② SYN报文段不能携带数据。三次握手的最后一个报文段可以捎带数据&#xff0c;但是如果不携带数据&#xff0c;那么就不消耗序号。 ③ 在断开连接过程中…

线性代数学习

1.标量由只有一个元素的张量表示 import torchx torch.tensor([3,0]) y torch.tensor([2,0])x y, x * y, x / y, x**y 2.可以将向量视为标量值组成的列表 x torch.arange(4) x 3.通过张量的索引访问任一元素 x[3] 4.访问张量长度 len(x) 5.只有一个轴的张量&#xff0c…

Apache Seata Raft模式配置中心

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata Raft模式配置中心 title: Seata Raft模式配置中心 author: 蒋奕晨-清华大学&…