基于go-zero的rpc服务示例

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

服务端

1、定义 .proto 文件

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

proto 复制代码
syntax = "proto3";

package adder;

service Adder {
  rpc Add(AddRequest) returns (AddResponse) {}
}

message AddRequest {
  int32 a = 1;
  int32 b = 2;
}

message AddResponse {
  int32 result = 1;
}

2、生成代码

使用 protoc 工具生成 Go 代码:

sh 复制代码
protoc --go_out=plugins=grpc:. adder.proto

3、实现服务

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

go 复制代码
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
}

4、启动服务

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

go 复制代码
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()
}

5、配置文件

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

yaml 复制代码
Name: adder
ListenOn: 127.0.0.1:8080

6、启动服务端

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

sh 复制代码
go run server.go

客户端

1、创建客户端

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

go 复制代码
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())
	}
}

2、运行客户端

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

sh 复制代码
go run client.go

输出结果:

复制代码
Result: 12

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

相关推荐
DICOM医学影像2 小时前
2. go语言从零实现以太坊客户端-查询区块链账户余额
开发语言·golang·区块链·以太坊·web3.0·hardhat
西京刀客4 小时前
golang路由与框架选型(对比原生net/http、httprouter、Gin)
http·golang·gin
Mr -老鬼4 小时前
Rust与Go:从学习到实战的全方位对比
学习·golang·rust
1***35775 小时前
spring loC&DI 详解
java·spring·rpc
DICOM医学影像6 小时前
1. go语言从零实现以太坊客户端-JSON-RPC
golang·区块链·solidity·以太坊·web3.0·json-rpc·erc20
PXM的算法星球7 小时前
用 semaphore 限制 Go 项目单机并发数的一次流量控制优化实践
开发语言·后端·golang
ZNineSun7 小时前
GORM:Go的ORM 框架
golang·orm·gorm·crud
源代码•宸7 小时前
Golang语法进阶(定时器)
开发语言·经验分享·后端·算法·golang·timer·ticker
利刃大大8 小时前
【RabbitMQ】Simple模式 && 工作队列 && 发布/订阅模式 && 路由模式 && 通配符模式 && RPC模式 && 发布确认机制
rpc·消息队列·rabbitmq·队列
a程序小傲8 小时前
得物Java面试被问:边缘计算的数据同步和计算卸载
java·开发语言·数据库·后端·面试·golang·边缘计算