Go gRPC使用demo


准備工作:
1. 安裝protobuf 編譯環境   https://github.com/protocolbuffers/protobuf/releases
2. 安裝go語言的protobuf代碼轉換工具protoc-gen-go  go get -u github.com/golang/protobuf/protoc-gen-go
3. 運行go mod init grpc_demo創建模塊
 
使用
1. 定義和編譯user.proto文件
// 定義proto語法版本,這里指定使用proto3版本
syntax = "proto3";

// 這里隨便定義個包名
package grpc.user;

// go需要增加這個選項,否則會報錯;值用分號分隔,前者表示生成*.pb.go文件目錄,會自動創建,這里指定當前目錄中的protobuf目錄,后者表示生成go文件里的包名,最好和當前目錄名一致否則無法使用到
option go_package = "./protobuf;protobuf";

// 定義服務,可以有多個方法
service UserService {
  // 使用rpc開頭標識方法
  rpc Login(LoginRequest) returns (LoginResponse) {};
}

// 定義請求信息
message LoginRequest {
  // 參數類型 參數名稱 標識號
  string username = 1;
  string password = 2;
}

// 定義響應信息
message LoginResponse {
  // 參數類型 參數名稱 標識號
  int32 code = 1;
  string message = 2;
}

// 最后使用  protoc --go_out=plugins=grpc:. ./protobuf/user.proto  來生成*.pb.go文件
運行 protoc --go_out=plugins=grpc:. ./protobuf/user.proto 來生成*.pb.go文件
 
 
2. 定義服務及實現
user_service.go
// 這里定義服務接口及實現

package service

import (
	"context"
	"grpc_demo/protobuf"
)

// 定義服務接口
type UserService interface {
	Login(ctx context.Context, req *protobuf.LoginRequest) (*protobuf.LoginResponse, error)
}

// 定義服務實現者,這里開頭小寫,不能被別的包使用,所以會增加一個工廠函數來創建實例
type userService struct {
}

// 工廠函數創建服務實例
func NewUserService() UserService {
	return &userService{}
}

// 實現者實現服務接口
func (userService *userService) Login(ctx context.Context, req *protobuf.LoginRequest) (*protobuf.LoginResponse, error) {
	if req.Username == "admin" && req.Password == "123456" {
		resp := &protobuf.LoginResponse{
			Code:    10000,
			Message: "登錄成功",
		}
		return resp, nil
	}

	resp := &protobuf.LoginResponse{
		Code:    10001,
		Message: "登錄失敗",
	}
	return resp, nil
}

 

 
3.  定義gRPC服務端並運行
// gRPC服務端

package main

import (
	"fmt"
	"google.golang.org/grpc"
	"grpc_demo/protobuf"
	"grpc_demo/service"
	"log"
	"net"
)

func main() {
	// 1. 監聽端口
	l, err := net.Listen("tcp", "127.0.0.1:8888")
	if err != nil {
		panic(err)
	}
	fmt.Println("listen on 127.0.0.1:8888")

	// 2. 實例化gRPC服務端
	grpcServer := grpc.NewServer()

	// 3. 注冊實現的服務實例
	var userService service.UserService
	userService = service.NewUserService()
	protobuf.RegisterUserServiceServer(grpcServer, userService)

	// 4. 啟動gRPC服務端
	fmt.Println("gRPC is running...")
	err = grpcServer.Serve(l)
	if err != nil {
		log.Fatalf("gRPC server err:%s\n", err)
	}
}

 
4.  定義gRPC客戶端並發送消息
// gRPC客戶端
package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"grpc_demo/protobuf"
)

func main() {
	// 1. 打開gRPC服務端鏈接
	conn, err := grpc.Dial("127.0.0.1:8888", grpc.WithInsecure())
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	// 2. 創建gRPC客戶端
	client := protobuf.NewUserServiceClient(conn)

	// 3. 構造請求參數
	req := &protobuf.LoginRequest{
		Username: "admin",
		Password: "123456",
	}

	// 4. 調用服務端提供的服務
	response, _ := client.Login(context.Background(), req)
	fmt.Println("Login Response: ", response)
}
 
目錄結構

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM