成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

讓我們一起編寫一個接口壓測工具

開發 開發工具
前段時間有個項目即將上線,需要對其中的核心接口進行壓測;由于我們的接口是 gRPC 協議,找了一圈發現壓測工具并不像 HTTP 那么多。

[[434976]]

前言

前段時間有個項目即將上線,需要對其中的核心接口進行壓測;由于我們的接口是 gRPC 協議,找了一圈發現壓測工具并不像 HTTP 那么多。

最終發現了 ghz 這個工具,功能也非常齊全。

事后我在想為啥做 gRPC 壓測的工具這么少,是有什么難點嘛?為了驗證這個問題于是我準備自己寫一個工具。

特性

前前后后大概花了個周末的時間完成了相關功能。

https://github.com/crossoverJie/ptg/

也是一個命令行工具,使用起來效果如上圖;完整的命令如下:

  1. NAME
  2.    ptg - Performance testing tool (Go) 
  3.  
  4. USAGE: 
  5.    ptg [global options] command [command options] [arguments...] 
  6.  
  7. COMMANDS: 
  8.    help, h  Shows a list of commands or help for one command 
  9.  
  10. GLOBAL OPTIONS: 
  11.    --thread value, -t value              -t 10 (default: 1 thread) 
  12.    --Request value, --proto value        -proto http/grpc (default: http) 
  13.    --protocol value, --pf value          -pf /file/order.proto 
  14.    --fully-qualified value, --fqn value  -fqn package.Service.Method 
  15.    --duration value, -d value            -d 10s (default: Duration of test in seconds, Default 10s) 
  16.    --request value, -c value             -c 100 (default: 100) 
  17.    --HTTP value, -M value                -m GET (default: GET) 
  18.    --bodyPath value, --body value        -body bodyPath.json 
  19.    --header value, -H value              HTTP header to add to request, e.g. "-H Content-Type: application/json" 
  20.    --target value, --tg value            http://gobyexample.com/grpc:127.0.0.1:5000 
  21.    --help, -h                            show help (default: false) 

考慮到受眾,所以同時支持 HTTP 與 gRPC 接口的壓測。

做 gRPC 壓測時所需的參數要多一些:

  1. ptg -t 10 -c 100 -proto grpc -pf /xx/xx.proto -fqn hello.Hi.Say -body test.json -tg "127.0.0.1:5000" 

比如需要提供 proto 文件的路徑、具體的請求參數還有請求接口的全路徑名稱。

目前只支持最常見的 unary call 調用,后續如果有需要的話也可以 stream。

同時也支持壓測時間、次數兩種壓測方式。

安裝

想體驗度朋友如果本地有 go 環境那直接運行:

  1. go get github.com/crossoverJie/ptg 

沒有環境也沒關系,可以再 release 頁面下載與自己環境對應的版本解壓使用。

https://github.com/crossoverJie/ptg/releases

設計模式

整個開發過程中還是有幾個點想和大家分享,首先是設計模式。

因為一開始設計時就考慮到需要支持不同的壓測模式(次數、時間;后續也可以新增其他的模式)。

所以我便根據壓測的生命周期定義了一套接口:

  1. type ( 
  2.  Model interface { 
  3.   Init() 
  4.   Run() 
  5.   Finish() 
  6.   PrintSate() 
  7.   Shutdown() 
  8.  } 
  9. )  

從名字也能看出來,分別對應:

  • 壓測初始化
  • 運行壓測
  • 停止壓測
  • 打印壓測信息
  • 關閉程序、釋放資源

然后在兩個不同的模式中進行實現。

這其實就是一個典型的依賴倒置原則。

程序員要依賴于抽象接口編程、不要依賴具體的實現。

其實大白話就是咱們 Java 里常說的面向接口編程;這個編程技巧在開發框架、SDK或是多種實現的業務中常用。

好處當然是顯而易見:當接口定義好之后,不同的業務只需要根據接口實現自己的業務就好,完全不會互相影響;維護、擴展都很方便。

支持 HTTP 和 gRPC 也是同理實現的:

  1. type ( 
  2.  Client interface { 
  3.   Request() (*Response, error) 
  4.  } 
  5. )  

當然前提得是前期的接口定義需要考慮周全、不能之后頻繁修改接口定義,這樣的接口就沒有意義了。

goroutine

另外一點則是不得不感嘆 goroutine+select+channel 這套并發編程模型真的好用,并且也非常容易理解。

很容易就能寫出一套并發代碼:

  1. func (c *CountModel) Init() { 
  2.  c.wait.Add(c.count
  3.  c.workCh = make(chan *Job, c.count
  4.  for i := 0; i < c.count; i++ { 
  5.   go func() { 
  6.    c.workCh <- &Job{ 
  7.     thread:   thread, 
  8.     duration: duration, 
  9.     count:    c.count
  10.     target:   target, 
  11.    } 
  12.   }() 
  13.  } 

比如這里需要初始化 N 個 goroutine 執行任務,只需要使用 go 關鍵字,然后利用 channel 將任務寫入。

當然在使用 goroutine+channel 配合使用時也得小心 goroutine 泄露的問題;簡單來說就是在程序員退出時還有 goroutine 沒有退出。

比較常見的例子就是向一個無緩沖的 channel 中寫數據,當沒有其他 goroutine 來讀取數時,寫入的 goroutine 就會被一直阻塞,最終導致泄露。

總結

有 gRPC 接口壓測需求的朋友歡迎試用,提出寶貴意見;當然 HTTP 接口也可以。

 

源碼地址:https://github.com/crossoverJie/ptg/

 

責任編輯:武曉燕 來源: crossoverJie
相關推薦

2022-08-29 07:48:27

文件數據參數類型

2022-03-31 18:59:43

數據庫InnoDBMySQL

2021-08-27 07:06:10

IOJava抽象

2021-12-29 08:27:05

ByteBuffer磁盤服務器

2022-03-08 17:52:58

TCP格式IP

2023-08-14 08:38:26

反射reflect結構體

2021-11-26 07:00:05

反轉整數數字

2021-07-15 07:23:28

Singlefligh設計

2022-02-14 10:16:22

Axios接口HTTP

2022-06-26 09:40:55

Django框架服務

2022-02-14 07:03:31

網站安全MFA

2016-09-06 10:39:30

Dell Techno

2022-06-27 08:00:49

hook工具庫函數

2022-07-10 23:15:46

Go語言內存

2023-08-02 08:35:54

文件操作數據源

2022-08-01 07:57:03

數組操作內存

2012-04-14 20:47:45

Android

2021-07-31 11:40:55

Openresty開源

2021-12-16 12:01:21

區塊鏈Libra貨幣

2021-05-17 10:50:15

系統調用內核
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人免费视频网站高清观看视频 | 欧美一级免费 | 亚洲一区成人 | 男女搞网站 | 欧美日韩在线一区 | 亚洲影音先锋 | 婷婷在线免费 | 日韩中字幕| 国产成人精品一区二区三区四区 | 中文字幕中文字幕 | 国产精品欧美一区二区 | 精品美女 | 青青草社区 | 国产成人精品久久二区二区91 | 在线成人 | 亚洲资源在线 | 看黄在线| 操操操操操 | 一区二区三区免费看 | 免费国产视频 | 黄篇网址 | 国产精品区二区三区日本 | 91免费在线 | 国产精品久久久久久av公交车 | 黄色中文字幕 | 亚洲国产精品日本 | 欧美日韩精品中文字幕 | 欧美在线观看黄色 | 久久久精品一区 | 一区二区亚洲 | 在线中文字幕av | 伊人伊人网 | 日韩久久久久久 | 日韩成人免费视频 | 亚洲成人自拍网 | 中文字幕国产 | 色约约视频 | 国产三区精品 | 欧美日韩一区在线 | 久久久久无码国产精品一区 | 欧美日韩在线高清 |