• 基于go-zero的rpc服务示例


    以下是一个基于 go-zero 框架的简单 RPC 服务示例,该示例包括一个服务端和一个客户端通过 gRPC 进行通信。

    服务端

    1、定义 .proto 文件

    在 rpc/add 目录下创建 adder.proto 文件,定义 RPC 服务:

    syntax = "proto3";
    
    package adder;
    
    service Adder {
      rpc Add(AddRequest) returns (AddResponse) {}
    }
    
    message AddRequest {
      int32 a = 1;
      int32 b = 2;
    }
    
    message AddResponse {
      int32 result = 1;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2、生成代码

    使用 protoc 工具生成 Go 代码:

    protoc --go_out=plugins=grpc:. adder.proto
    
    • 1

    3、实现服务

    创建 adder_grpc.go 文件,实现 Adder 服务:

    package adder
    
    import (
    	"context"
    )
    
    type AdderServer struct{}
    
    func (s *AdderServer) Add(ctx context.Context, req *AddRequest) (*AddResponse, error) {
    	result := req.GetA() + req.GetB()
    	return &AddResponse{Result: result}, nil
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4、启动服务

    创建 server.go 文件,启动 gRPC 服务:

    package main
    
    import (
    	"flag"
    	"fmt"
    	"net"
    
    	"github.com/zeromicro/go-zero/core/conf"
    	"github.com/zeromicro/go-zero/core/logx"
    	"github.com/zeromicro/go-zero/zrpc"
    	"github.com/your/path/to/rpc/add"
    )
    
    var configFile = flag.String("f", "etc/config.yaml", "the config file")
    
    func main() {
    	flag.Parse()
    
    	var c zrpc.RpcServerConf
    	conf.MustLoad(*configFile, &c)
    
    	server := zrpc.MustNewServer(c)
    	defer server.Stop()
    
    	adderServer := &add.AdderServer{}
    	add.RegisterAdderServer(server.Server, adderServer)
    
    	fmt.Printf("Starting rpc server on %s...\n", c.ListenOn)
    	server.Start()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    5、配置文件

    在 etc 目录下创建 config.yaml 文件,配置服务地址和端口:

    Name: adder
    ListenOn: 127.0.0.1:8080
    
    • 1
    • 2

    6、启动服务端

    运行 server.go 文件,启动 RPC 服务:

    go run server.go
    
    • 1

    客户端

    1、创建客户端

    创建 client.go 文件,创建 gRPC 客户端:

    package main
    
    import (
    	"context"
    	"fmt"
    	"time"
    
    	"github.com/zeromicro/go-zero/zrpc"
    	"github.com/your/path/to/rpc/add"
    )
    
    func main() {
    	client := zrpc.MustNewClient("127.0.0.1:8080")
    	defer client.Conn.Close()
    
    	adderClient := add.NewAdderClient(client.Conn)
    	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    	defer cancel()
    
    	req := &add.AddRequest{
    		A: 5,
    		B: 7,
    	}
    	resp, err := adderClient.Add(ctx, req)
    	if err != nil {
    		fmt.Println("Error:", err)
    	} else {
    		fmt.Println("Result:", resp.GetResult())
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2、运行客户端

    运行 client.go 文件,调用 RPC 服务:

    go run client.go
    
    • 1

    输出结果:

    Result: 12
    
    • 1

    至此,一个基于 go-zero 框架的简单 RPC 服务示例完成。

  • 相关阅读:
    JVM之Class文件
    Lua的Resty-Request库写的一个简单爬虫
    阿里架构师整理一份企业级SSM架构实战文档,让你熟悉底层原理
    【C++多线程那些事儿】多线程的执行顺序如你预期吗?
    MySQL数据库——日志管理、备份与恢复
    【数据结构】时间复杂度---OJ练习题
    低学历并不是阻碍职业发展的绊脚石
    Linux 实用的操作命令
    [附源码]java毕业设计大学生家教服务推荐系统
    夜莺n9ev5,categraf自定义采集数据
  • 原文地址:https://blog.csdn.net/Aquester/article/details/134552833