Moduel Proxy 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
Moduel Proxy 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
Moduel Proxy 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 GPLv3
开发语言 Rust 查看源码 »
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 关中麦客
适用人群 未知
收录时间 2021-10-08

软件简介

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)
}

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

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
暂无内容
发表了博客
2018/05/17 11:54

Reverse Proxy Vs Forward Proxy

Reverse Proxy What is Reverse Proxy Server A reverse proxy server is an intermediate connection point positioned at a network’s edge. It receives initial HTTP connection requests, acting like the actual endpoint. Essentially your network’s traffic cop, the reverse proxy serves as a gateway between users and your application origin server. In so doing it handles all policy management and traff...

0
0
发表了博客
2014/03/11 09:25

Proxy

所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。 Proxy模式是很常见的模式,在我们生活中处处可见,例如我们买火车票不一定非要到火车站去买,可以到一些火车票的代售点去买。寄信不一定是自己去寄,可以把信委托给邮局,由邮局把信送到目的地。 代理模式涉及到的三个要点: 1,抽象行为 2,真实角色 3,...

0
2
2016/07/12 15:33

cannot be cast to javassist.util.proxy.Proxy

问题现象: 最近在做一个web项目,使用的是ssh技术,添加jar依赖时不小心多加了一个: 导致报: $$_javassist_13 cannot be cast to javassist.util.proxy.Proxy 这个错误提示。 解决方案: (1)检查依赖包 去除:javassist-3.11.jar 这个jar包。 (2)maven依赖 在maven依赖中去除: 刷新项目,在次启动时,问题消失。...

0
0
发表于大前端专区
2020/03/30 21:23

Proxy代理

# Proxy对象 在一个系统中,总要存储一些数据,对于这些数据,可能有一些是希望我们访问的,但是总有一些是中重要的,不希望我们访问的,希望保护起来,因此ES6新增了代理,在目标对象前架设个“拦截“层,外界对该对象的访问必须通过这层拦截,我们可以对外界的访问进行过滤和改写。 注意:Proxy修改了某些操作的默认行为,等同于在语言层做出修改,所以也属于”元编程“,即对语言进行编程。 语法: let proxy = new Proxy(ta...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
2 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部