您现在的位置是:亿华云 > 系统运维

从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)