【Golang】Golang之grpc的牛刀小试

项目简介

一个基于gRPC协议的示例项目,旨在展示如何使用gRPC进行远程过程调用(RPC)和数据传输。

关于grpc

gRPC是Google开发的高性能、开源的RPC框架,支持多种语言,并且具有诸如双向流式数据传输、流式处理、身份验证等先进功能,可用于构建分布式系统、微服务、Web应用程序等。

项目目录

在这里插入图片描述

项目代码

  • calculator.proto
syntax = "proto3";

option go_package = "./calculator";

package calculator;  //包名

service Calculator {
  rpc Add(AddRequest) returns (AddResponse) {}
}

message AddRequest {
  int32 a = 1;
  int32 b = 2;
}

message AddResponse {
  int32 result = 1;
}
  • 生成pg.go和*_grpc.pb.go
protoc.exe --go_out=. --go-grpc_out=. calculator.proto
  • 服务端server.go
package main

import (
	"context"
	"flag"
	"fmt"
	"log"
	"net"

	"google.golang.org/grpc"

	pb "go_grpc_demo/calculator/calculator"
)

var (
	port = flag.Int("port", 50051, "The server port")
)

type server struct {
    
    
	pb.UnimplementedCalculatorServer
}

func (s *server) Add(ctx context.Context, req *pb.AddRequest) (*pb.AddResponse, error) {
    
    
	result := req.A + req.B
	return &pb.AddResponse{
    
    Result: result}, nil
}

func main() {
    
    
	flag.Parse()
	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
	if err != nil {
    
    
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterCalculatorServer(s, &server{
    
    })
	log.Printf("server listening at %v", lis.Addr())
	if err := s.Serve(lis); err != nil {
    
    
		log.Fatalf("failed to serve: %v", err)
	}
}
  • 客户端client.go
package main

import (
	"context"
	"flag"
	"log"
	"time"

	"google.golang.org/grpc"

	pb "go_grpc_demo/calculator/calculator"
)

var (
	serverAddr = flag.String("server_addr", "localhost:50051", "The server address in the format of host:port")
)

func main() {
    
    
	flag.Parse()

	// 连接到 gRPC 服务器
	conn, err := grpc.Dial(*serverAddr, grpc.WithInsecure())
	if err != nil {
    
    
		log.Fatalf("failed to connect: %v", err)
	}
	defer conn.Close()

	// 创建 Calculator 客户端
	c := pb.NewCalculatorClient(conn)

	// 发送 Add 请求
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	req := &pb.AddRequest{
    
    A: 1, B: 2}
	resp, err := c.Add(ctx, req)
	if err != nil {
    
    
		log.Fatalf("failed to add: %v", err)
	}
	log.Printf("%d + %d = %d", req.A, req.B, resp.Result)
}

项目运行效果

  • 服务端
    在这里插入图片描述
  • 客户端
    在这里插入图片描述

备注

安装 protoc 编译器
下载地址: https://github.com/protocolbuffers/protobuf/releases

# 安装protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/[email protected]

猜你喜欢

转载自blog.csdn.net/linjiuxiansheng/article/details/129980112