Moduel Proxy

HTTP 反向代理中间件
授权协议 GPLv3
开发语言 Rust
所属分类 服务器软件、 代理服务器软件
软件类型 开源软件
地区 国产
投 递 者 归泽宇
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Module Proxy是一款HTTP反向代理中间件,突出的靓点是将HTTP协议代理为TCP Socket协议,特别适合Web前后台分离的编程架构项目,使用Module Proxy可以让后端编程从HTTP技术体系中抽身出来,这将带来两个重要的改变:

  • 无Web编程经验的程序员,可以轻松进行B/S后端的编程工作 。
  • 几乎所有的现代编程语言,都可以被使用进行B/S后端的编程工作,使用中不需要这些编程语言有HTTP的实现。

Module Proxy中间件由Rust语言实现,使用了优秀的异步运行时Tokio和HTTP底层库hyper,具有高效、稳定、简单的特性。

Demo 程序示例

Ajax客户端:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
<script type="text/javascript">
$(function(){
	// method是和后端服务的约定,这里表示调用后端的hello方法,data是前后端约定的业务数据
	var req_json =  {
                       "head":{"method":"hello"},
                       "data":{"hello":"world!!!", "list":[1,2,3,4]}
                    };
	$("#btn").click(function(){
		$.ajax({
			type: "POST",       //传输方式POST
			url: "/socket1/",   //提交URL, socket1是模块名
			contentType : "application/json; charset=utf-8",  //Socket转发的固定格式
			data: JSON.stringify(req_json),
			success: function(rsp_json){
				$("#myDiv").html('<h3>'+JSON.stringify(rsp_json)+'</h3>');
			}
		});		
	 });
});
</script>    
</head>
    <body>
        <button id="btn" type="button">submit</button>
        <div id="myDiv"></div>
    </body>
</html>

Go语言实现的Socket端:

package main

import (
	"encoding/json"
	"fmt"
	"net"
	"strconv"
	"strings"
	"time"
)

func main() {
	listener, err := net.Listen("tcp", "0.0.0.0:21231") //侦听端口21231
	if err != nil {
		fmt.Println("listen error:", err)
		return
	}
	fmt.Println("server start...")

	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("accept error:", err)
			break
		}

		go process(conn) //协程
	}
}

func process(conn net.Conn) {

	defer conn.Close()

	//读取req json长度,长度行是Module Proxy转发时在Json数据前补充的
	buf := make([]byte, 12) //长度行总是12字节
	n, _ := conn.Read(buf)
	lenStr := string(buf[:n])
	lenStr = strings.Trim(lenStr, "\r\n") //去除行尾的回车换行
	lenStr = strings.Trim(lenStr, " ")    //去除行左的空格
	len, _ := strconv.Atoi(lenStr)        //string转int

	//读取req json
	jsonBuf := make([]byte, len)
	n, _ = conn.Read(jsonBuf)

	//解析req json
	m := make(map[string]interface{}) //map
	json.Unmarshal(jsonBuf, &m)       //json转map
	method := m["head"].(map[string]interface{})["method"]
	data := m["data"]
	fmt.Println("method: ", method)
	fmt.Println("data: ", data)

	//调用业务函数
	var rspJson []byte
	var rsplen int
	switch method {
	case "hello":
		rspJson, rsplen = hello(data.(map[string]interface{})) //只传入Json中的data数据部分
	default:
		rspJson, rsplen = foo()
	}

	//返回 rsp json
	lenRsp := fmt.Sprintf("%10d\r\n", rsplen) //构建12字节长度行(左补空格,右补\r\n)
	conn.Write([]byte(lenRsp)) //socket返回 长度行
	conn.Write(rspJson)        //socket返回 rsp json
}

func hello(m map[string]interface{}) ([]byte, int) {
	m["time"] = time.Now().Format("2006-01-02 15:04:05")
	m["module"] = "golang"
	b, _ := json.Marshal(m) //map转json
	return b, len(b)
}

func foo() ([]byte, int) {
	b := []byte("{}")
	return b, len(b)
}

说明:因篇幅原因,以上代码省略了必要的错误和异常处理,只起到示范说明作用。

  • 目录 一、背景 二、问题 三、解决方案 一、背景 最近对贫僧的个人页https://stackoperator.top进行升级,将Apache升级到2.4.46,PHP升级到7.4.15。升级后没啥问题,但是第二天却宕机了。经过查证是内存不足,导致mysql服务宕机了。那么是谁占用了这么多内存呢? 利用free、top等工具发现在页面刷新时,httpd进程的内存消耗会增加,而且是每点击、刷新一次页

  • 众所周知,vue跨域有很多种解决方案,这里主要讲述一下使用proxyTable时遇到的一些问题 vue环境:脚手架cli3.0 本地地址:http://localhost:96 修改文件:vue.config.js module.exports = { devServer: { proxy: { 'aaa': { //跨域标识 target:

  • Proxy(代理) 是 ES6 中新增的一个特性。Proxy 让我们能够以简洁易懂的方式控制外部对对象的访问。其功能非常类似于设计模式中的代理模式。 使用 Proxy 的好处是:对象只需关注于核心逻辑,一些非核心的逻辑(如:读取或设置对象的某些属性前记录日志;设置对象的某些属性值前,需要验证;某些属性的访问控制等)可以让 Proxy 来做。从而达到关注点分离,降级对象复杂度的目的。 使用方法 va

  • 今天在重启Apache的时候碰到这个Warn,在这里记录一下: 首先发现如下Warn: # service apache2 restart [Thu Apr 25 09:39:06 2019] [warn] module headers_module is already loaded, skipping Syntax OK Shutting down httpd2 (waiting for a

  • 近期由于项目需要使用到https正向代理,而nginx官方模块仅支持做http正向代理,一番百度学习后发现了该模块,故今日记录下此笔记供大家一起学习交流 ngx_http_proxy_connect_module模块主要用于隧道SSL请求的代理服务器 GitHub地址:http://www.github.com/chobits/ngx_http_proxy_connect_module nginx

  • 我们安装完golang后,我们在windows的cmd命令下就可以直接查看和使用go命令和环境变量了,同样的在linux下可以在控制台使用,如下图所示: C:\Users\lijie1>go env set GO111MODULE= set GOARCH=amd64 set GOBIN= set GOCACHE=C:\Users\lijie1\AppData\Local\go-build set

 相关资料
  • 什么是反向代理 反向代理(Reverse Proxy)方式是指用代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 举个例子,一个用户访问 http://www.example.com/readme,但是 www.example.com 上并不存在

  • 反向代理是一个 V2Ray 的附加功能,可以把服务器端的流量向客户端转发,即逆向流量转发。 反向代理功能在 V2Ray 4.0+ 可用。目前处于测试阶段,可能会有一些问题。 反向代理的大致工作原理如下: 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP,无法在公网上直接访问。另有一台主机 B,它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。 在主机 A 中配置一

  • 主要内容:1. 简单的反向代理,2. 集群和平衡器,3. Balancer和BalancerMember配置,3. 故障转移,4. 均衡器管理器除了作为“基本”Web服务器,并为最终用户提供静态和动态内容之外,Apache httpd(以及大多数其他Web服务器)也可以充当反向代理服务器,也称为“网关” “服务器。 在这种情况下,httpd本身不生成或托管数据,而是由一个或多个后端服务器获取内容,后端服务器通常没有直接连接到外部网络。当httpd收到来自客户端的请求时,请求本身被代理到这些后端服

  • 主要内容:1. 代理服务器介绍,2. 将请求传递给代理的服务器,3. 传递请求标头,4. 配置缓冲区,5. 选择传出IP地址本文介绍代理服务器的基本配置。 您将学习如何通过不同协议将NGINX请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。 代理服务器的基本配置目录 代理服务器介绍 将请求传递给代理的服务器 传递请求标头 配置缓冲区 选择传出IP地址 1. 代理服务器介绍 代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过

  • 1. 什么叫反向代理服务器? 要说反向代理服务器,先来说一般的代理服务器。代理就是受委托去做一些事。假如用户A委托B去做一些事,做完之后B告诉A结果。在代理服务器中也是一样的道理,用户A通过代理服务器B访问网站C(www.example.com),请求先到代理服务器B,B再转发请求到网站C,代理服务器B是真正访问网站C的,访问之后再把网站C的应答结果发给用户A。这样给用户A的感觉是C直接提供服务的

  • Nginx 是一个高性能的 HTTP 和反向代理服务器,代码完全用 C 实现,基于它的高性能以及诸多优点,我们可以把它设置为 hyperf 的前置服务器,实现负载均衡或 HTTPS 前置服务器等。 配置 Http 代理 # 至少需要一个 Hyperf 节点,多个配置多行 upstream hyperf { # Hyperf HTTP Server 的 IP 及 端口 server

  • 以下是我对这些的理解,我看到了很少的差距;特别是何时何地使用 HTTP(s)代理: 可用作TLS终止代理 可用于修改HTTP标头 可用作DMZ前面的负载均衡器或公共IP提供程序,以屏蔽后端服务器 TCP代理 可以用作TCP连接的反向代理,不仅支持HTTP而且支持其他应用层协议,如FTP 我的问题 如果我只接受HTTP web流量,我们应该使用TCP代理而不是HTTP代理的用例是什么 这种理解是连接

  • 如果您想使用 Nginx 作为 Gitea 的反向代理服务,您可以参照以下 nginx.conf 配置中 server 的 http 部分: server { listen 80; server_name git.example.com; location / { proxy_pass http://localhost:3000; } } 使用