Moduel Proxy HTTP 反向代理中间件开源项目

我要开发同款
匿名用户2021年10月08日
41阅读
开发技术Rust
所属分类代理服务器软件、服务器软件
授权协议GPLv3

作品详情

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

无Web编程经验的程序员,可以轻松进行B/S后端的编程工作。几乎所有的现代编程语言,都可以被使用进行B/S后端的编程工作,使用中不需要这些编程语言有HTTP的实现。ModuleProxy中间件由Rust语言实现,使用了优秀的异步运行时Tokio和HTTP底层库hyper,具有高效、稳定、简单的特性。

Demo程序示例

Ajax客户端:

<!DOCTYPEHTML><html><head><metacharset="UTF-8"><scriptsrc="https://libs.baidu.com/jquery/2.0.0/jquery.js"></script><scripttype="text/javascript">$(function(){//method是和后端服务的约定,这里表示调用后端的hello方法,data是前后端约定的业务数据varreq_json={"head":{"method":"hello"},"data":{"hello":"world!!!","list":[1,2,3,4]}};$("#btn").click(function(){$.ajax({type:"POST",//传输方式POSTurl:"/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><buttonid="btn"type="button">submit</button><divid="myDiv"></div></body></html>Go语言实现的Socket端:

packagemainimport("encoding/json""fmt""net""strconv""strings""time")funcmain(){listener,err:=net.Listen("tcp","0.0.0.0:21231")//侦听端口21231iferr!=nil{fmt.Println("listenerror:",err)return}fmt.Println("serverstart...")for{conn,err:=listener.Accept()iferr!=nil{fmt.Println("accepterror:",err)break}goprocess(conn)//协程}}funcprocess(connnet.Conn){deferconn.Close()//读取reqjson长度,长度行是ModuleProxy转发时在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//读取reqjsonjsonBuf:=make([]byte,len)n,_=conn.Read(jsonBuf)//解析reqjsonm:=make(map[string]interface{})//mapjson.Unmarshal(jsonBuf,&m)//json转mapmethod:=m["head"].(map[string]interface{})["method"]data:=m["data"]fmt.Println("method:",method)fmt.Println("data:",data)//调用业务函数varrspJson[]bytevarrsplenintswitchmethod{case"hello":rspJson,rsplen=hello(data.(map[string]interface{}))//只传入Json中的data数据部分default:rspJson,rsplen=foo()}//返回rspjsonlenRsp:=fmt.Sprintf("%10d\r\n",rsplen)//构建12字节长度行(左补空格,右补\r\n)conn.Write([]byte(lenRsp))//socket返回长度行conn.Write(rspJson)//socket返回rspjson}funchello(mmap[string]interface{})([]byte,int){m["time"]=time.Now().Format("2006-01-0215:04:05")m["module"]="golang"b,_:=json.Marshal(m)//map转jsonreturnb,len(b)}funcfoo()([]byte,int){b:=[]byte("{}")returnb,len(b)}说明:因篇幅原因,以上代码省略了必要的错误和异常处理,只起到示范说明作用。

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论