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">$(fuctio(){//method是和后端服务的约定,这里表示调用后端的hello方法,data是前后端约定的业务数据varreq_jso={"head":{"method":"hello"},"data":{"hello":"world!!!","list":[1,2,3,4]}};$("#bt").click(fuctio(){$.ajax({type:"POST",//传输方式POSTurl:"/socket1/",//提交URL,socket1是模块名cotetType:"applicatio/jso;charset=utf-8",//Socket转发的固定格式data:JSON.strigify(req_jso),success:fuctio(rsp_jso){$("#myDiv").html('<h3>'+JSON.strigify(rsp_jso)+'</h3>');}});});});</script></head><body><buttoid="bt"type="butto">submit</butto><divid="myDiv"></div></body></html>Go语言实现的Socket端:packagemaiimport("ecodig/jso""fmt""et""strcov""strigs""time")fucmai(){listeer,err:=et.Liste("tcp","0.0.0.0:21231")//侦听端口21231iferr!=il{fmt.Pritl("listeerror:",err)retur}fmt.Pritl("serverstart...")for{co,err:=listeer.Accept()iferr!=il{fmt.Pritl("accepterror:",err)break}goprocess(co)//协程}}fucprocess(coet.Co){deferco.Close()//读取reqjso长度,长度行是ModuleProxy转发时在Jso数据前补充的buf:=make([]byte,12)//长度行总是12字节,_:=co.Read(buf)leStr:=strig(buf[:])leStr=strigs.Trim(leStr,"\r\")//去除行尾的回车换行leStr=strigs.Trim(leStr,"")//去除行左的空格le,_:=strcov.Atoi(leStr)//strig转it//读取reqjsojsoBuf:=make([]byte,le),_=co.Read(jsoBuf)//解析reqjsom:=make(map[strig]iterface{})//mapjso.Umarshal(jsoBuf,&m)//jso转mapmethod:=m["head"].(map[strig]iterface{})["method"]data:=m["data"]fmt.Pritl("method:",method)fmt.Pritl("data:",data)//调用业务函数varrspJso[]bytevarrspleitswitchmethod{case"hello":rspJso,rsple=hello(data.(map[strig]iterface{}))//只传入Jso中的data数据部分default:rspJso,rsple=foo()}//返回rspjsoleRsp:=fmt.Spritf("%10d\r\",rsple)//构建12字节长度行(左补空格,右补\r\)co.Write([]byte(leRsp))//socket返回长度行co.Write(rspJso)//socket返回rspjso}fuchello(mmap[strig]iterface{})([]byte,it){m["time"]=time.Now().Format("2006-01-0215:04:05")m["module"]="golag"b,_:=jso.Marshal(m)//map转jsoreturb,le(b)}fucfoo()([]byte,it){b:=[]byte("{}")returb,le(b)}说明:因篇幅原因,以上代码省略了必要的错误和异常处理,只起到示范说明作用。点击空白处退出提示











评论