go grpc快速开始 入门 windows系统下

官网:https://grpc.io/  有时访问很慢,可以访问 https://grpc.p2hp.com/ 说是gRPC中文官网,但其实绝大部分内容都是英文

写在前面:本文假定你已经对grpc有一定的了解,至少知道它是什么以及基本的一些功能。

 

gRPC 是在http2的基础上,传输的是二进制数据。

 

介绍下几个必要插件安装和功能介绍:

  1、protocol buffer 用于将编写的 proto 文件编译为目标语言代码,配合相应的插件可编译为 go、java、python代码;

  2、protoc-gen-go、protoc-gen-go-grpc 这两个插件是配合 protocol buffer 程序使用的,用来协助其生成 golang 代码;

  安装:

    protocol buffer 下载地址:https://protobuf.dev/downloads/   文件下载地址:https://github.com/protocolbuffers/protobuf/releases/latest  向下拉,找到对应的win版本即可,注意32位和64位系统差别。

    将下载的zip文件解压,然后找到bin目录下的 protoc.exe 程序,只需要将 protoc.exe 扔到 windows 对应的 path 目录中即可(如果你没看懂,那么按照下面步骤操作),创建 D:\Program Files\protoc 目录,

    然后将下载的zip解压到这个目录,再修改windows系统的环境变量的 path,新加一条 D:\Program Files\protoc\bin 即可;

    protoc-gen-go、protoc-gen-go-grpc 这两个插件使用 

$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

    即可完成安装,如果是网络问题导致包无法下载,简单的做法自己花钱弄个VPN或者自己配置代理

    需要注意 protoc-gen-go、protoc-gen-go-grpc 使用 go install 安装之后编译成可执行程序,生成文件在 GOPATH 环境目录下的bin目录中,go env 命令可以查看 GOPATH 的值,到目前位置 protoc-gen-go、protoc-gen-go-grpc 仅仅

    只是编译生成了可执行文件,还不能参与 protocol buffer 的编译过程,两种方式:1、将 protoc-gen-go、protoc-gen-go-grpc 生成的可执行文件拷贝到 D:\Program Files\protoc\bin 目录下即可;2、将 GOPATH 的值后面加上 \bin 添加

    到windows的系统环境变量中的 path 中即可;

 

创建一个golang项目,如项目名 goGrpcTest

  在项目目录中创建 grpcCnf、client、server 三个目录

  安装 go 语言的 grpc 包: go get -u google.golang.org/grpc

  在 grpcCnf 目录下创建 helloworld.proto 文件,内容如下

syntax = "proto3";

// go 语言特有,每个消息单独一个文件, 注意是完整的导包路径
option go_package = "goGrpcTest/grpcCnf/helloworld";
// go 包名
package grpcCnf;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1; // 1 是顺序,从1开始遇到{}则重新从1开始
}

message data {
  string name = 1;
  string job = 2;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

  打开命令行工具,路径切换到 grpcCnf 目录下,执行:

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld.proto

  即可看到目录下生成 helloworld.pb.go、helloworld_grpc.pb.go 两个文件,后续的golang编码直接导入该包,然后调用里面的函数即可。

 

server代码,在 server 目录下创建 main.go 文件,内容如下:

package main

import (
	"context"
	"flag"
	"fmt"
	pb "goGrpcTest/grpcCnf"
	"google.golang.org/grpc"
	"log"
	"net"
)

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

// server is used to implement helloworld.GreeterServer.
type server struct {
	pb.UnimplementedGreeterServer
}

// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(_ context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	log.Printf("Received: %v", in.GetName())
	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil // 获取请求携带的名称直接返回给客户端
}

func main() {
	// 参数解析
	flag.Parse()
	// 常见 TCP 链接对象,暂时还未进行 TCP 端口监听
	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	// 创建一个新的 grpc 的 server
	s := grpc.NewServer()
	// 注册 grpc 服务
	pb.RegisterGreeterServer(s, &server{})
	log.Printf("server listening at %v", lis.Addr())
	// 启动 GRPC 服务
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

  

client 代码,在 client 目录下创建 main.go 文件,内容如下:

package main

import (
	"context"
	"flag"
	_ "fmt"
	pb "goGrpcTest/grpcCnf"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"log"
	"time"
)

const (
	defaultName = "World!"
)

var (
	addr = flag.String("addr", "localhost:50051", "the address to connect to")
	name = flag.String("name", defaultName, "Name to greet")
)

func main() {
	// 命令行参数解析
	flag.Parse()
	// Set up a connection to the server.
	conn, err := grpc.NewClient(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	c := pb.NewGreeterClient(conn)

	// Contact the server and print out its response.
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	// 调用服务端函数
	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}
	log.Printf("Greeting: %s", r.GetMessage())
}

  只需要编译运行server 和 client 代码,即可完成 grpc 的简单测试。

posted @ 2025-05-06 14:38  青灯浊酒  阅读(118)  评论(0)    收藏  举报