Golang搭建jsonRPC服务器,Python客户端高并发10000组请求压力测试

By jerryxjr1220 at 2022-10-31 • 0人收藏 • 255人看过

Golang原生支持多线程(协程),所以处理高并发有非常优异的性能表现,非常适合用来搭建服务器。


这里用Golang搭建jsonRPC服务器,Python客户端高并发10000组请求压力测试


Golang jsonRPC服务器:

package main

import (
   "net"
   "net/rpc"
   "net/rpc/jsonrpc"
   "strings"
)

type MyFunc struct {
}

func (self MyFunc) DoSomething(p []string, reply *string) error {
   *reply = strings.Join(p, ", ")
   return nil
}

func main() {
   server := rpc.NewServer()
   server.RegisterName("Do", new(MyFunc))

   listener, _ := net.Listen("tcp", "127.0.0.1:10001")
   defer listener.Close()

   for {
      conn, _ := listener.Accept()
      defer conn.Close()
      //rpc.ServeConn(conn)
      go server.ServeCodec(jsonrpc.NewServerCodec(conn))
   }
}

Python jsonRPC客户端

import json
import socket
import time
from threading import Thread

class RPCClient():
    def __init__(self, addr):
        self.socket = socket.create_connection(addr)
        self.id = 0

    def message(self, name, *params):
        self.id += 1
        return dict(id=self.id, params=list(params), method=name)

    def call(self, name, *params):
        req = self.message(name, *params)
        id = req.get('id')

        mesg = json.dumps(req)
        self.socket.sendall(mesg.encode())

        resp = self.socket.recv(4096)
        resp = json.loads(resp.decode())

        return resp

    def close(self):
        self.socket.close()

def call(names):
    rpc = RPCClient(("127.0.0.1", 10001))
    rpc.call("Do.DoSomething", list(names))


start = time.time()
for _ in range(10000):
    t = Thread(target=call, args=(("Tom", "Jerry"),))
    t.daemon = True
    t.start()
print("10000组jsonRPC高并发请求,用时", time.time()-start, "秒")

测试结果:

10000组jsonRPC高并发请求,用时 1.7656581401824951 秒


Golang的服务器响应还是非常令人满意的

8 个回复 | 最后更新于 2022-11-01
2022-10-31   #1

Golang性能优异,但Python的多线程就没那么高效了,所以,如果自己的电脑不太行的话,不要轻易尝试10000组高并发,很容易把电脑搞崩溃的

2022-10-31   #2

如果用Golang的jsonRPC客户端,同样进行10000次高并发请求

package main

import (
   "fmt"
   "net"
   "net/rpc"
   "net/rpc/jsonrpc"
   "time"
)

type ReplyStruct struct {
   Success bool
   Result  string
}

func main() {
   st := time.Now().UnixMilli()
   ch := make(chan string, 10000)
   for i := 1; i < 10000; i++ {
      go visit(ch)
   }
   for i := 1; i < 10000; i++ {
      <-ch
   }
   ed := time.Now().UnixMilli()
   fmt.Println("10000组jsonRPC高并发,耗时", ed-st, "毫秒")
}

func visit(ch chan string) {
   //client, _ := rpc.Dial("tcp", "127.0.0.1:10001")
   conn, _ := net.Dial("tcp", "127.0.0.1:10001")
   //defer client.Close()
   defer conn.Close()
   client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
   reply := new(ReplyStruct)
   client.Call("Do.DoSomething", []string{"I", "Love", "you"}, &reply)
   ch <- reply.Result
}

测试结果:

10000组jsonRPC高并发,耗时 1581 毫秒


2022-10-31   #3

发展太快了,学之不尽,继续努力中

2022-11-01   #4

回复#1 @jerryxjr1220 :

还好,看到你第2页

2022-11-01   #5

真羡慕你们什么都懂

看了aar里go rpc服务器和客户端的例程,有个疑问,好像是在同一台电脑上运行的,客户端里先打开了gotest.exe,请问能不能服务器端和客户端在两台电脑上

2022-11-01   #6

回复#5 @我高兴 :

rpc就是基于tcp , 示例里用的是locahost本地而已, 你修改为其他端口当然就可以两台电脑了

2022-11-01   #7

回复#5 @我高兴 :

可以看aardio里的rpc例程,其实rpc还分为基于tcp连接的和基于http连接的rpc,例程里也分别有基于http的jsonrpc和基于tcp的jsonrpc。


另外,rpc本身可以不用进行json序列化,但是如果希望跨平台或者跨系统的调用,比如我上面的例子中用python程序跨系统调用Golang的rpc服务,这样就必须有统一的标准,jsonrpc就是这个统一的标准,把rpc进行json序列化后,各个系统和各个平台之间就能相互调用了。

2022-11-01   #8

谢谢两位大佬的解答

登录后方可回帖

登 录
信息栏
公 告:

专注分享

谢绝纯提问

谢谢合作!
本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...