[Go][RPC]微服務

小黑
發佈於後端
2024/01/10閱讀時間約 6 分鐘

gRPC是一款跨平台、高性能的RPC框架,他可以在任何環境下執行,主要用於後端為服務開發。在用戶端應用程式中,可以像本地物件那樣呼叫遠端伺服器的方法,因此可以創建出分散式應用。


使用

./configure --prefix=/usr/local/protobuf


  • 編譯
make


  • 安裝
make install


  • 環境設定
cd~
vim .bash_profile

在bash_profile最後面增加

export PROTOBUF=/usr/local/protobuf

export PATH=$PROTOBUF/bin:$PATH

編輯完後

source .bash_profile


  • 檢查是否安裝成功
protoc --version


  • 安裝Go的protobuf套件
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
cp -r protoc-gen-go /usr/local/bin/


  • 建立proto檔案
//指定語法格式,注意proto3不再支援proto2的required和optional
syntax = "proto3";
//指定產生的programmer.pb.go的包名,防止命名衝突
package proto;

//service定義公開的服務
service ProgrammerService {
//rpc定義服務內的GetProgrammerInfo遠端呼叫
rpc GetProgrammerInfo (Request) returns (Response) {
}
}

//客戶端請求的資料格式
message Request {
// [修飾符] 類型 字段名 = 標識符;
string name = 1;
}

//服務端回應的資料格式
message Response {
int32 uid = 1;
string username = 2;
string job = 3;
//repeated修飾符表示欄位是可變數組,即slice類型
repeated string goodAt = 4;
}


  • 編譯proto檔案
protoc --go_out=plugins=grpc:. ./your_proto_file


服務端

package main

import (
"fmt"
"log"
"net"
//導入生成好的protobuf
pb "xxx"
"golang.org/x/net/context"
"google.golang.org/grpc"
)

//定義服務
type ProgrammerServiceServer struct{}

func (p *ProgrammerServiceServer) GetProgrammerInfo(ctx context.Context, req *pb.Request) (resp *pb.Response, err error) {
name := req.Name
if name == "xxx" {
resp = &pb.Response{
Uid: 6,
Username: name,
Job: "CTO",
GoodAt: []string{"Go","Java","PHP","Python"},
}

}
err = nil
return
}

func main() {
port := ":8078"
l, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("listen error: %v\n", err)
}
fmt.Printf("listen %s\n", port)
s := grpc.NewServer()
//將ProgrammerService註冊到gRPC
//注意第二個參數ProgrammerServiceServer是介面類型的變數
//需取地址傳參
pb.RegisterProgrammerServiceServer(s, &ProgrammerServiceServer{})
s.Serve(l)
}

啟動服務

go run grpc-server.go


用戶端

package main

import (
"fmt"
//導入生成好的protobuf
pb "xxx"
"golang.org/x/net/context"
"google.golang.org/grpc"
"log"
)

func main() {
conn, err := grpc.Dial(":8078", grpc.WithInsecure())
if err != nil {
log.Fatalf("dial error: %v\n", err)
}

defer conn.Close()

client := pb.NewProgrammerServiceClient(conn)

//呼叫服務
req := new(pb.Request)
req.Name = "shirdon"
resp, err := client.GetProgrammerInfo(context.Background(), req)
if err != nil {
log.Fatalf("resp error: %v\n", err)
}

fmt.Printf("Recevied: %v\n", resp)
}

啟動用戶

go run grpc-clien.go





7會員
78內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
發表第一個留言支持創作者!