gorpc: 一個簡單,易用,高效能,可插拔的微服務框架
安裝
在安裝 gorpc 之前,您需要安裝 go 並配置 go 環境。
gopath 模式下,您只需執行以下命令即可安裝:
go get -u -v github.com/lubanproj/gorpc
go modules 模式下,您只需匯入軟體包 “ github.com/lubanproj/gorpc”,該軟體包在執行 go [build | run | test] 時會自動下載依賴項。
快速開始
git clone https://github.com/lubanproj/gorpc.git
cd gorpc/examples/helloworld
# start server
go run server/server.go
# start client,start another terminal and execute
go run client/client.go
示例
發起一個服務呼叫只需要以下三個步驟:
- 定義一個服務
- server 釋出服務
- 使用一個客戶端發起呼叫
1.定義一個服務
type Service struct {
}
type HelloRequest struct {
Msg string
}
type HelloReply struct {
Msg string
}
func (s *Service) SayHello(ctx context.Context, req *HelloRequest) (*HelloReply, error) {
rsp := &HelloReply{
Msg : "world",
}
return rsp, nil
}
2. server 釋出服務
func main() {
opts := []gorpc.ServerOption{
gorpc.WithAddress("127.0.0.1:8000"),
gorpc.WithNetwork("tcp"),
gorpc.WithSerializationType("msgpack"),
gorpc.WithTimeout(time.Millisecond * 2000),
}
s := gorpc.NewServer(opts ...)
if err := s.RegisterService("/helloworld.Greeter", new(helloworld.Service)); err != nil {
panic(err)
}
s.Serve()
}
3. 使用一個客戶端發起呼叫
func main() {
opts := []client.Option {
client.WithTarget("127.0.0.1:8000"),
client.WithNetwork("tcp"),
client.WithTimeout(2000 * time.Millisecond),
client.WithSerializationType("msgpack"),
}
c := client.DefaultClient
req := &helloworld.HelloRequest{
Msg: "hello",
}
rsp := &helloworld.HelloReply{}
err := c.Call(context.Background(), "/helloworld.Greeter/SayHello", req, rsp, opts ...)
fmt.Println(rsp.Msg, err)
}
更多細節可以參考 helloworld
文件
特性
- 高效能,效能遠遠超過 grpc ,詳情可以參考 效能
- 支援 反射, 程式碼生成 兩種呼叫方式
- 可插拔 所有外掛都是可插拔、支援業務自定義的
- 多協議支援,目前支援 tcp、udp、http,後續會支援更多協議
- 實現了攔截器,支援業務自己定義攔截器
- 實現了連線池,支援業務自定義連線池
- 支援服務發現,提供了基於 consul 的預設服務發現實現,支援業務自定義服務發現實現。
- 支援負載均衡 ,提供了隨機、輪詢、加權輪詢、一致性雜湊等預設負載均衡實現,支援業務自定義負載均衡實現。
- 支援分散式鏈路追蹤,遵循業界 opentracing 規範,提供了基於 jaeger 的分散式鏈路追蹤預設實現,支援業務自定義。
- 支援多種序列化方式,框架預設採用 protocol 和 msgpack 序列化,用程式碼生成方式呼叫會使用 protocol 序列化。用反射方式呼叫會採用 msgpack 序列化,支援業務自定義序列化方式。
- 更多特性正在陸續支援中 ......
效能
環境 :
- CPU : Intel(R) Xeon(R) Gold 61xx CPU @2.44GHz
- CPU cores : 8
- Memory : 16G
- Disk : 540G
Result : 使用 gorpc-benchmark 進行測試,測試三次取效能最大值
gorpc :
git clone https://github.com/lubanproj/gorpc-benchmark.git
cd gorpc-benchmark
# start gorpc server
go run server.go
# start gorpc-benchmark client,start another terminal and execute
go run client.go -concurrency=100 -total=1000000
效能測試結果如下:
> go run client.go -concurrency=100 -total=1000000
2020/02/29 15:56:57 client.go:71: [INFO] took 5214 ms for 1000000 requests
2020/02/29 15:56:57 client.go:72: [INFO] sent requests : 1000000
2020/02/29 15:56:57 client.go:73: [INFO] received requests : 1000000
2020/02/29 15:56:57 client.go:74: [INFO] received requests succ : 1000000
2020/02/29 15:56:57 client.go:75: [INFO] received requests fail : 0
2020/02/29 15:56:57 client.go:76: [INFO] throughput (TPS) : 191791
grpc :
在相同機器上進行 grpc 效能測試,如下:
git clone https://github.com/lubanproj/gorpc-benchmark.git
cd gorpc-benchmark/grpc
# run gorpc server
go run server.go
# run gorpc-benchmark client, start another terminal and execute
go run client.go -concurrency=100 -total=1000000
效能測試結果如下:
> go run client.go -concurrency=100 -total=1000000
2020/02/29 15:46:14 client.go:77: [INFO] took 17169 ms for 1000000 requests
2020/02/29 15:46:14 client.go:78: [INFO] sent requests : 1000000
2020/02/29 15:46:14 client.go:79: [INFO] received requests : 1000000
2020/02/29 15:46:14 client.go:80: [INFO] received requests succ : 1000000
2020/02/29 15:46:14 client.go:81: [INFO] received requests fail : 0
2020/02/29 15:46:14 client.go:82: [INFO] throughput (TPS) : 58244
貢獻
如何進行貢獻?
可以參考 Contributing
微信群:聯絡 DIU191267432 入群
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 一個簡單易用高效的工具庫
- 一個簡單易用的 Vue 元件 V - DistpickerVue元件
- 一個非常簡單易用且功能豐富的純Swift下載框架-TiercelSwift框架
- 如何實現一個簡單易用的 RocketMQ SDKMQ
- 簡單易用的任務佇列-beanstalkd佇列Bean
- 如何快速搭建一個 “簡單模式” 的微服務架構模式微服務架構
- 一個.Net簡單、易用的配置檔案操作庫
- Goutte 一個簡單易用的 PHP 爬蟲類庫GoPHP爬蟲
- 一個簡單易用的 Android 導航欄TitleBarAndroid
- go-kit微服務:一個簡單的API閘道器Go微服務API
- Snow——簡單易用的 Go 語言業務框架Go框架
- 零基礎簡單易用的EmberJS框架JS框架
- 一個可以自我進化的微服務框架微服務框架
- 簡單幾步使用Dropwizard實現一個RESTful微服務REST微服務
- 一個簡簡單單的紅點系統框架框架
- 一個簡單易用的資料庫壞塊處理方案資料庫
- 寫一個簡單易用可擴充套件vue表單驗證外掛(vue-validate-easy)套件Vue
- Android 一起來封裝一個簡單易用的AdapterAndroid封裝APT
- Kite: 一個分散式微服務框架(翻譯)分散式微服務框架
- 甲骨文推出的 Java 微服務框架 Helidon:輕量簡單Java微服務框架
- 一個很簡單的PHP框架lyuePHP框架
- 用Golang寫了個簡單易用的微信SDKGolang
- 2020年總結-用學習過的技術搭建一個簡單的微服務框架 + 原始碼微服務框架原始碼
- cmdr 04 - 簡單微服務 (daemon)微服務
- 簡單聊聊SOA和微服務微服務
- 一個超級簡單的 go Web 框架GoWeb框架
- entitybuilder--一個簡單的業務通用框架UI框架
- 徒手擼一個簡單的RPC框架RPC框架
- 關於SSM框架的一個簡單DemoSSM框架
- 一個簡單的介面測試框架 demo框架
- 一個簡單的開源DIRECTUI介面框架UI框架
- 是一個簡單易用的生活物聯網和智慧家居平臺
- C# 編寫一個簡單易用的 Windows 截圖增強工具C#Windows
- 一個簡單易用的資料庫客戶端ajfdbviewer1.0資料庫客戶端View
- 微服務是什麼?帶你簡單瞭解微服務微服務
- 簡單易用NLP框架Flair釋出新版本!(附教程)框架AI
- 封裝一個在react上更易用的redux框架封裝ReactRedux框架
- 通過Dapr實現一個簡單的基於.net的微服務電商系統(二十)——Saga框架實現思路分享微服務框架