golang使用grpc
(1) 安装protoc,这是通用的,所有语言都需要
# 下载网址:
https://github.com/protocolbuffers/protobuf/releases/download/v3.9.0/protoc-3.9.0-win64.zip
解压后将将protoc的bin目录添加到环境变量中 如果不会添加环境变量请百度
运行 protoc --version 查看是否已经添加到环境变量
(2)go
install google.golang.org/protobuf/cmd/protoc-gen-
go
@latest
我好像没有用到
解释:因为protoc没有内置go生成器,想实现.proto->.go的转换的话还需要安装protobuf的golang编译器插件protoc-gen-go,用于生成go文件
安装后会在GOBIN目录下生成可执行文件,执行
protoc
命令会自动调用protobuf的编译器插件protoc-gen-go
插件(3) 新建golang项目 我使用的是goland go版本用1.21 刚开始用1.16会运行不了
在项目新建文件夹 grpc_proto 在此文件夹下编写一个 hello.proto
syntax = "proto3"; // 指定proto版本 package hello_grpc; // 指定默认包名 // 指定golang包名 option go_package = "/hello_grpc"; //定义rpc服务 service HelloService { // 定义函数 rpc SayHello (HelloRequest) returns (HelloResponse) {} } // HelloRequest 请求内容 message HelloRequest { string name = 1; string message = 2; } // HelloResponse 响应内容 message HelloResponse{ string name = 1; string message = 2; }
(4) 在grpc_proto 文件夹下运行 protoc -I . --go_out=plugins=grpc:. .\hello.proto 会在此文件夹下生成一个
hello_grpc 文件夹 hello.grpc文件夹下会有 hello.pb.go
(5)编写客户端和服务端代码 到项目根目录下 go mod tidy 拉取依赖包
编写server.go
package main import ( "context" "fmt" "google.golang.org/grpc" "google.golang.org/grpc/grpclog" "grpc/grpc_proto/hello_grpc" "net" ) // HelloServer 得有一个结构体,需要实现这个服务的全部方法,叫什么名字不重要 type HelloServer struct { } func (HelloServer) SayHello(ctx context.Context, request *hello_grpc.HelloRequest) (*hello_grpc.HelloResponse, error) { fmt.Println("入参:", request.Name, request.Message) return &hello_grpc.HelloResponse{ Name: "server", Message: "hello " + request.Name, }, nil } func main() { // 监听端口 listen, err := net.Listen("tcp", ":8080") if err != nil { grpclog.Fatalf("Failed to listen: %v", err) } // 创建一个gRPC服务器实例。 s := grpc.NewServer() server := HelloServer{} // 将server结构体注册为gRPC服务。 hello_grpc.RegisterHelloServiceServer(s, &server) fmt.Println("grpc server running :8080") // 开始处理客户端请求。 err = s.Serve(listen) }
编写client.go
package main import ( "context" "fmt" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "grpc/grpc_proto/hello_grpc" "log" ) func main() { addr := ":8080" // 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。 // 此处使用不安全的证书来实现 SSL/TLS 连接 conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err)) } defer conn.Close() // 初始化客户端 client := hello_grpc.NewHelloServiceClient(conn) result, err := client.SayHello(context.Background(), &hello_grpc.HelloRequest{ Name: "client", Message: "hello", }) fmt.Println(result, err) }
分别运行 go run server.go go run client.go
成功