看了docker的原始碼就不得不了解一下grpc這個鬼東西。下面借鑑一下別人的例項,讓我這個初次接觸的人做乙個,最直接的分析。首先編譯安裝protobuf 工具。
// 定義將要用到的rpc呼叫方法,引數和返回值都在上面進行了定義
service userservice ;
rpc logout(userid) returns (funcresponse){};
}
編譯生成對應的go**。
protoc rpcsrv.go --go_out=plugins=grpc:
rpcsrv.pb.go檔案如下,主要就是生成了相應的結構體:
type
userinfo
struct
type
userid
struct
type
funcresponse
struct
變成服務端程式:
package main
import (
pb "xcl"
"log"
"net"
"os"
"golang.org/x/net/context"
"google.golang.org/grpc"
) func main()
s := grpc.newserver()
pb.registeruserserviceserver(s, &server{})
log.println("server......")
s.serve(lis)
} const (
port = ":50051" //監聽的埠
) type server struct{} //定義server的結構體
// 實現login的方法,引數和返回值與最上面定義的proto都有對應的關係。
func (s *server) login(ctx context.context, usr *pb.userinfo) (*pb.funcresponse, error) , nil
} // 實現logout的方法
func (s *server) logout(ctx context.context, uid *pb.userid) (*pb.funcresponse, error) , nil
}
定義客戶端:
package main
import (
"log"
"os"
"strconv"
pb "xcl"
"golang.org/x/net/context"
"google.golang.org/grpc"
) const (
address = "localhost:50051" // 伺服器的套接字
) func main()
defer conn.close()
// 一旦 grpc channel 建立起來,我們需要乙個客戶端存根去執行rpc。我們通過.proto生成的pb包提供的newuserserviceclient方法來完成。
c := pb.newuserserviceclient(conn)
var status pb.userstatus
status = pb.userstatus_online
userinfo := &pb.userinfo
// 直接呼叫相應的方法,來遠端呼叫服務端。
r, err := c.login(context.background(), userinfo)
if err != nil
log.println("login():", r)
uid, err := strconv.parseint(r.reply, 10, 32)
if err != nil
userid := &pb.userid
out, err := c.logout(context.background(), userid)
log.println("logout():", out)
}
參考:[1] grpc官方文件
gRPC使用簡介
grpc是一款語言中立 平台中立 開源的遠端過程呼叫 rpc 系統。在grpc裡,客戶端應用程式可以像呼叫本地物件一樣直接呼叫另一台不同機器上,服務端應用的方法,使得你能夠更容易的建立分布式應用和服務。與許多rpc系統類似,grpc也是基於以下理念 定義乙個服務,指定其能夠被遠端呼叫的方法 包括引數...
grpc框架分析一 Server分析
監聽tcp埠 生成乙個 grpc.server物件,把 grpc.server物件和 實現userserviceserver介面的例項繫結起來 啟動grpc伺服器 func main log.println userservice to listen 9000 success grpcserver ...
grpc 使用方法
php中使用grpc php需要安裝grpc擴充套件。使用protoc命令生成對應的php protoc php out plugins grpc exporttask.proto 生成 包括 exporttask wshexportformat.php wshexporttaskcreatetpl...