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

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

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

谢谢两位大佬的解答

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...