基于go-zero的rpc服务示例

news/2024/11/8 18:10:27/

以下是一个基于 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;
}

2、生成代码

使用 protoc 工具生成 Go 代码:

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

3、实现服务

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

package adderimport ("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 服务:

package mainimport ("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.RpcServerConfconf.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 文件,配置服务地址和端口:

Name: adder
ListenOn: 127.0.0.1:8080

6、启动服务端

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

go run server.go

客户端

1、创建客户端

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

package mainimport ("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 服务:

go run client.go

输出结果:

Result: 12

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


http://www.ppmy.cn/news/1234454.html

相关文章

【bug 回顾】上传图片超时

测试 bug 问题分析 - 上传图片超时 最近在测试上遇到一个莫名奇妙的问题,最后也没有得到具体是哪块的原因,看各位大佬有没有思路?? 一 、背景 现在我们有三台服务器,用来布两套环境。其中另外一台服务器3配置的 tom…

【腾讯云云上实验室-向量数据库】腾讯云开创新时代,发布全新向量数据库Tencent Cloud VectorDB

前言 随着人工智能、数据挖掘等技术的飞速发展,海量数据的存储和分析越来越成为重要的研究方向。在海量数据中找到具有相似性或相关性的数据对于实现精准推荐、搜索等应用至关重要。传统关系型数据库存在一些缺陷,例如存储效率低、查询耗时长等问题&…

elasticsearch 7安装

问题提前报 max virtual memory areas error max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 如果您的环境是Linux,注意要做以下操作,否则es可能会启动失败 1 用编辑工具打开文件/etc/sysctl.conf 2 …

SpringBoot 导入其他配置文件

默认情况下,springboot 初始的项目中都有一个 application.yml 或者 application.properties 文件,如果我们希望再定义一个独立的配置文件用来配置特定业务数据,而不希望把这些配置内容都堆积在 application 配置文件中,实现这个需…

【idea】解决idea 执行maven build总下载 Downloading maven-metadata.xml文件

可以看到如下日志中打印了执行的命令行,其中包含 --update-snapshots,是强制更新的意思。 日志内容如下: D:\env\jdk1.8.0_261\bin\java.exe --update-snapshots -s D:\env\apache-maven-3.8.6\conf\settings.xml -Dmaven.repo.localD:\env\…

黑马点评笔记 redis实现缓存

文章目录 什么是缓存?为什么要使用缓存 如何使用缓存功能实现缓存模型和思路代码实现 缓存更新策略数据库缓存不一致解决方案代码实现 什么是缓存? 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码(例如: 例1:Static fi…

C练习题_14

一、单项选择题(本大题共 20小题,每小题 2分,共 40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 以下叙述不正确的是() A.一个C源程序可…

【网络奇缘】- 计算机网络|性能指标|体系结构

🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 温故而知新 计算机网络性能指标 时延 时延带宽积 往返时延RTT 访问百度​编辑 访问b站 访问谷歌 …