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 的简单测试。

浙公网安备 33010602011771号