您现在的位置是:亿华云 > 系统运维
从0到1:带你完整写一个 Golang Grpc 服务
亿华云2025-10-03 11:48:28【系统运维】4人已围观
简介# 1. 环境准备第一步:安装 protoc前往 protobuf,下载最新版的 protoc ,我下载的是 win 64第二步:安装 protoc-gen-go前往 protobuf-go ,同样下
# 1. 环境准备
第一步:安装 protoc
前往 protobuf,整写下载最新版的整写 protoc ,我下载的整写是 win 64
第二步:安装 protoc-gen-go
前往 protobuf-go ,同样下载最新版的整写 protoc,同样下载的整写是 win 64
将下载后的 protoc.exe 和 protoc-gen-go 放到 %GOPATH%\bin\ 目录下。
或者更简单的整写方法,亿华云直接执行如下命令就可以安装
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc第三步:下载 grpc
# 安装 grpc go get -u google.golang.org/grpc # gRPC运行时接口编解码支持库 go get -u github.com/golang/protobuf/proto# 2. 项目目录结构
在 $GOPATH/src 下新建 iswbm.com 目录及三个子目录(client,整写server,整写proto),整写在终端上进入该目录,整写执行如下命令创建 go.mod
mkdir $GOPATH/src/iswbm.com/{ client,整写server,proto} cd mkdir $GOPATH/src/iswbm.com/ # 设置环境变量,确保 GO111MODULE 是整写开启的 go env -w GO111MODULE=auto # 初始化项目 go mod init# 3. 编写 proto 文件
编写 proto/simple.proto
syntax = "proto3"; package proto; option go_package ="/proto"; // 定义发送请求信息 message SimpleRequest{ // 参数类型 参数名称 标识号 string data = 1; } // 定义响应信息 message SimpleResponse{ int32 code = 1; string value = 2; } // 定义我们的服务(可以定义多个服务,每个服务可以定义多个接口) service Simple{ rpc GetSimpleInfo(SimpleRequest) returns (SimpleResponse){ };在 iswbm.com 目录下,整写执行如下命令
protoc --go_out=. ./proto/simple.proto protoc --go-grpc_out=. ./proto/simple.proto完成后,整写会在当前目录下生成一个 simple 目录,整写该目录下有一个 simple.pb.go 和 simple_grpc.pb.go
# 4. 编写 server.go
package main import ( "context" pb "iswbm.com/proto" "google.golang.org/grpc" "log" "net" ) const ( Address string = ":8000" Network string = "tcp" ) // 定义我们的高防服务器服务 type SimpleService struct{ pb.UnimplementedSimpleServer } // 实现 GetSimpleInfo 方法 func (s *SimpleService) GetSimpleInfo(ctx context.Context, req *pb.SimpleRequest) (*pb.SimpleResponse, error) { data := req.Data log.Println("get from client: ", data) resp := &pb.SimpleResponse{ Code: 8888, Value: "grpc", } return resp, nil } func main() { // 1.监听端口 listener, err := net.Listen(Network, Address) if err != nil { log.Fatalf("net.listen err: %v", err) } log.Println(Address, " net listening...") // 2.实例化gRPC服务端 grpcServer := grpc.NewServer() // 3.注册我们实现的服务 SimpleService pb.RegisterSimpleServer(grpcServer, &SimpleService{ }) // 4.启动gRPC服务端 err = grpcServer.Serve(listener) if err != nil { log.Fatalf("grpc server err: %v",err) } }完成后,先安装依赖包
go install执行如下命令运行服务端
> go run server/server.go 2021/07/28 18:31:42 :8000 net listening...# 5. 编写 client.go
package main import ( "context" "google.golang.org/grpc" "log" pb "iswbm.com/proto" ) const ( Address string = ":8000" ) func main() { // 1.创建于gRPC服务端的连接 conn, err := grpc.Dial(Address, grpc.WithInsecure()) if err != nil { log.Fatalf("dial conn err: %v", err) } defer conn.Close() // 2.创建grpc客户端 client := pb.NewSimpleClient(conn) // 3.调用服务端提供的服务 req := pb.SimpleRequest{ Data: "Hello,Server", } resp, err := client.GetSimpleInfo(context.Background(), &req) if err != nil { log.Fatalf("resp err: %v", err) } log.Printf("get from server,code: %v,value: %v", resp.Code, resp.Value) }执行如下命令运行,立马就能收到来自 server 返回的消息
> go run client/client.go 2021/07/28 18:54:35 get from server,code: 8888,value: grpc同时,在 server 端也会打印来自 client 端的消息
> go run server/server.go 2021/07/28 18:51:59 :8000 net listening... 2021/07/28 18:54:35 get from client: Hello,Server 本文转载自微信公众号「Go编程时光」,可以通过以下二维码关注。转载本文请联系Go编程时光公众号。很赞哦!(568)
上一篇: 英特尔重磅发布全新数据中心处理器,为数字经济发展增添新动力
下一篇: 数据中心高温管理指南