從0到1:帶你完整寫一個(gè) Golang Grpc 服務(wù)
# 1. 環(huán)境準(zhǔn)備
第一步:安裝 protoc
前往 protobuf,下載最新版的 protoc ,我下載的是 win 64
第二步:安裝 protoc-gen-go
前往 protobuf-go ,同樣下載最新版的 protoc,同樣下載的是 win 64
將下載后的 protoc.exe 和 protoc-gen-go 放到 %GOPATH%\bin\ 目錄下。
或者更簡(jiǎn)單的方法,直接執(zhí)行如下命令就可以安裝
- go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
 
第三步:下載 grpc
- # 安裝 grpc
 - go get -u google.golang.org/grpc
 - # gRPC運(yùn)行時(shí)接口編解碼支持庫(kù)
 - go get -u github.com/golang/protobuf/proto
 
# 2. 項(xiàng)目目錄結(jié)構(gòu)
在 $GOPATH/src 下新建 iswbm.com 目錄及三個(gè)子目錄(client,server,proto),在終端上進(jìn)入該目錄,執(zhí)行如下命令創(chuàng)建 go.mod
- mkdir $GOPATH/src/iswbm.com/{client,server,proto}
 - cd mkdir $GOPATH/src/iswbm.com/
 - # 設(shè)置環(huán)境變量,確保 GO111MODULE 是開啟的
 - go env -w GO111MODULE=auto
 - # 初始化項(xiàng)目
 - go mod init
 
# 3. 編寫 proto 文件
編寫 proto/simple.proto
- syntax = "proto3";
 - package proto;
 - option go_package ="/proto";
 - // 定義發(fā)送請(qǐng)求信息
 - message SimpleRequest{
 - // 參數(shù)類型 參數(shù)名稱 標(biāo)識(shí)號(hào)
 - string data = 1;
 - }
 - // 定義響應(yīng)信息
 - message SimpleResponse{
 - int32 code = 1;
 - string value = 2;
 - }
 - // 定義我們的服務(wù)(可以定義多個(gè)服務(wù),每個(gè)服務(wù)可以定義多個(gè)接口)
 - service Simple{
 - rpc GetSimpleInfo(SimpleRequest) returns (SimpleResponse){};
 
在 iswbm.com 目錄下,執(zhí)行如下命令
- protoc --go_out=. ./proto/simple.proto
 - protoc --go-grpc_out=. ./proto/simple.proto
 
完成后,會(huì)在當(dāng)前目錄下生成一個(gè) simple 目錄,該目錄下有一個(gè) simple.pb.go 和 simple_grpc.pb.go
# 4. 編寫 server.go
- package main
 - import (
 - "context"
 - pb "iswbm.com/proto"
 - "google.golang.org/grpc"
 - "log"
 - "net"
 - )
 - const (
 - Address string = ":8000"
 - Network string = "tcp"
 - )
 - // 定義我們的服務(wù)
 - type SimpleService struct{
 - pb.UnimplementedSimpleServer
 - }
 - // 實(shí)現(xiàn) GetSimpleInfo 方法
 - func (s *SimpleService) GetSimpleInfo(ctx context.Context, req *pb.SimpleRequest) (*pb.SimpleResponse, error) {
 - data := req.Data
 - log.Println("get from client: ", data)
 - resp := &pb.SimpleResponse{
 - Code: 8888,
 - Value: "grpc",
 - }
 - return resp, nil
 - }
 - func main() {
 - // 1.監(jiān)聽端口
 - listener, err := net.Listen(Network, Address)
 - if err != nil {
 - log.Fatalf("net.listen err: %v", err)
 - }
 - log.Println(Address, " net listening...")
 - // 2.實(shí)例化gRPC服務(wù)端
 - grpcServer := grpc.NewServer()
 - // 3.注冊(cè)我們實(shí)現(xiàn)的服務(wù) SimpleService
 - pb.RegisterSimpleServer(grpcServer, &SimpleService{})
 - // 4.啟動(dòng)gRPC服務(wù)端
 - err = grpcServer.Serve(listener)
 - if err != nil {
 - log.Fatalf("grpc server err: %v",err)
 - }
 - }
 
完成后,先安裝依賴包
- go install
 
執(zhí)行如下命令運(yùn)行服務(wù)端
- > go run server/server.go
 - 2021/07/28 18:31:42 :8000 net listening...
 
# 5. 編寫 client.go
- package main
 - import (
 - "context"
 - "google.golang.org/grpc"
 - "log"
 - pb "iswbm.com/proto"
 - )
 - const (
 - Address string = ":8000"
 - )
 - func main() {
 - // 1.創(chuàng)建于gRPC服務(wù)端的連接
 - conn, err := grpc.Dial(Address, grpc.WithInsecure())
 - if err != nil {
 - log.Fatalf("dial conn err: %v", err)
 - }
 - defer conn.Close()
 - // 2.創(chuàng)建grpc客戶端
 - client := pb.NewSimpleClient(conn)
 - // 3.調(diào)用服務(wù)端提供的服務(wù)
 - req := pb.SimpleRequest{
 - Data: "Hello,Server",
 - }
 - resp, err := client.GetSimpleInfo(context.Background(), &req)
 - if err != nil {
 - log.Fatalf("resp err: %v", err)
 - }
 - log.Printf("get from server,code: %v,value: %v", resp.Code, resp.Value)
 - }
 
執(zhí)行如下命令運(yùn)行,立馬就能收到來(lái)自 server 返回的消息
- > go run client/client.go
 - 2021/07/28 18:54:35 get from server,code: 8888,value: grpc
 
同時(shí),在 server 端也會(huì)打印來(lái)自 client 端的消息
- > go run server/server.go
 - 2021/07/28 18:51:59 :8000 net listening...
 - 2021/07/28 18:54:35 get from client: Hello,Server
 




















 
 
 












 
 
 
 