【轉】Golang-RPC(五):golang的net-rpc結合protobuf實現rpc通訊

 

轉,原文:https://blog.csdn.net/raoxiaoya/article/details/109533275?share_token=27c49b7e-648a-4e26-920b-fad5f4874535

-----------------------

 

net/rpc 包實現了基於 tcp/http 協議的 gob 編碼的rpc客戶端與服務端。
net/rpc/jsonrpc 包實現了基於 tcp 協議 json 編碼的rpc客戶端與服務端。

要想實現基於 tcp 協議 protobuf 編碼的rpc客戶端與服務端,可以在 net/rpc 的基礎上實現一對 serverCodec 和 clientCodec 。

需要安裝 protoc 和 protoc-gen-go,可參考 https://blog.csdn.net/raoxiaoya/article/details/109496431

下載依賴

go get -u github.com/mars9/codec
1
編寫 message.proto 文件:

syntax = "proto3";

option go_package = "./pbs;message";

package message;

//訂單請求參數
message OrderRequest {
string orderId = 1;
}

//訂單信息
message OrderInfo {
string Id = 1;
float Price = 2;
int64 Status = 3;
}

此文件定義了請求參數的結構和響應參數的結構。

生成 pb 文件:

protoc ./message.proto --go_out=./
1
得到文件 pbs/message.pb.go

編寫服務 repo/order.go:

/*
-- @Time : 2020/11/3 14:41
-- @Author : raoxiaoya
-- @Desc :
*/
package repo

import (
"errors"

message "demo1/go-protobuf/pbs"
)

type Order struct {}

type OrderInfo struct {
Id string
Price float64
Status int
}

func (o *Order) GetOne(orderRequest *message.OrderRequest, orderInfo *message.OrderInfo) error {
if orderRequest.OrderId == "" {
return errors.New("orderId is invalid")
}

*orderInfo = message.OrderInfo{
Id: orderRequest.OrderId,
Price: 100.00,
Status: 1,
}

return nil
}


此服務提供一個方法 GetOne ,通過訂單編號查詢訂單信息。

服務端程序 service.go:

package main

import (
"net"
"net/rpc"

"demo1/go-protobuf/repo"
"github.com/mars9/codec"
)

func main() {
rpc.Register(new(repo.Order))

listen, err := net.Listen("tcp", ":8100")
if err != nil {
panic(err.Error())
}

for {
conn, err := listen.Accept()
if err != nil {
continue
}
go rpc.ServeCodec(codec.NewServerCodec(conn))
}
}


客戶端程序 client.go:

package main

import (
"fmt"
"net"
"net/rpc"

"demo1/go-protobuf/pbs"
"github.com/mars9/codec"
)

func main() {
Client()
}

func Client() {
conn, err := net.Dial("tcp", "localhost:8100")
if err != nil {
panic(err)
}
client := rpc.NewClientWithCodec(codec.NewClientCodec(conn))

request := message.OrderRequest{OrderId: "201907310001"}
var response message.OrderInfo
err = client.Call("Order.GetOne", &request, &response)
if err != nil {
panic(err)
}

fmt.Println(response)
}

go run service.go

go run client.go

客戶端輸出:

{{{} [] [] 0xc0001a48b8} 0 [] 201907310001 100 1}
1
說明通訊已成功建立。

其他編碼格式:
JSON-RPC 2.0
bsonrpc:
messagepack
protobuf

關於Go序列化庫的性能的比較你可以參考 gosercomp
————————————————
版權聲明:本文爲CSDN博主「raoxiaoya」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/raoxiaoya/article/details/109533275

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章