go语言实现简单的grpc客户端服务端案例

server/2024/10/19 9:43:00/

在 Go 中实现一个简单的 gRPC 客户端和服务端,可以按照以下步骤进行。

1. 安装 gRPC 和相关工具

首先,需要安装 protobuf 编译器和 protoc-gen-go 插件:

# 安装protoc
brew install protobuf# 安装protoc-gen-go和protoc-gen-go-grpc插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

$GOPATH/bin添加到系统的环境变量中,以便 protoc 能找到插件。

2. 定义 gRPC 服务

创建一个 .proto 文件来定义服务接口。

proto/helloworld.proto:

syntax = "proto3";package helloworld;option go_package = "example.com/helloworld";service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

3. 生成 gRPC 代码

在命令行中,执行 protoc 生成 Go 代码:

protoc --go_out=. --go-grpc_out=. proto/helloworld.proto

4. 实现服务端

创建一个 gRPC 服务端来实现接口中的 SayHello 方法。

server.go:

package mainimport ("context""fmt""log""net""google.golang.org/grpc"pb "example.com/helloworld"
)type server struct {pb.UnimplementedGreeterServer
}func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {log.Printf("Received: %v", in.GetName())return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}func main() {lis, err := net.Listen("tcp", ":50051")if err != nil {log.Fatalf("Failed to listen: %v", err)}s := grpc.NewServer()pb.RegisterGreeterServer(s, &server{})log.Printf("Server listening at %v", lis.Addr())if err := s.Serve(lis); err != nil {log.Fatalf("Failed to serve: %v", err)}
}

5. 实现客户端

创建一个客户端来调用 SayHello 方法。

client.go:

package mainimport ("context""log""os""time""google.golang.org/grpc"pb "example.com/helloworld"
)func main() {conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())if err != nil {log.Fatalf("Did not connect: %v", err)}defer conn.Close()c := pb.NewGreeterClient(conn)name := "world"if len(os.Args) > 1 {name = os.Args[1]}ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})if err != nil {log.Fatalf("Could not greet: %v", err)}log.Printf("Greeting: %s", r.GetMessage())
}

6. 运行示例

编译并运行服务端:

go run server.go

在另一个终端中,运行客户端:

go run client.go

客户端将输出类似以下内容:

Greeting: Hello world
解释
.proto 文件定义了服务接口及消息格式。
protoc 命令生成了 Go 代码(服务端和客户端的接口)。
服务端实现了 Greeter 服务并启动了 gRPC 服务器。
客户端连接到服务端并调用 SayHello 方法。
你可以根据需要进一步扩展这个示例。


http://www.ppmy.cn/server/133010.html

相关文章

【AIGC】让AI像人一样思考和使用工具,reAct机制详解

​ reAct机制详解 reAct是什么reAct的关键要素reAct的思维过程reAct的代码实现查看效果引入依赖,定义模型定义相关工具集合工具创建代理启动测试完整代码 思考 reAct是什么 reAct的核心思想是将**推理(Reasoning)和行动(Acting&…

研报复现连载

东北证券-量化择时系列之一 【研报】精选32个技术指标在指数上的择时能力分析【研报】精选32个技术指标在指数上的择时能力分析-趋势类指标【研报】精选32个技术指标在指数上的择时能力分析-波动类指标【研报】精选32个技术指标在指数上的择时能力分析-动量类指标 【研报】精选…

【LLM】一文详解MHA、GQA、MQA原理

前言 本文回顾一下MHA、GQA、MQA,详细解读下MHA、GQA、MQA这三种常见注意力机制的原理。 self-attention A t t e n t i o n ( Q , K , V ) s o f t m a x ( Q K T d k ) V Attention(Q,K,V)softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)softmax(dk​ ​QK…

S7-1500 通过PN/PN Coupler 通信

概述 PN/PN耦合器,订货号:6ES7158-3AD10-0XA0,能够实现两个不同以太网子网进行数据交换。 图01.已安装电缆夹的PN/PN Coupler视图 主要属性: 1440 字节的输入数据和 1440 字节的输出数据。多达 16 个输入区域/输出区域可用于与…

Python知识梳理总结思维导图

Python 语法简洁且富有表现力。它采用简洁的缩进方式来划分代码块,增强了代码的可读性。变量无需事先声明类型,可随时赋值并根据值自动确定类型。Python 支持多种数据类型,包括整数、浮点数、字符串、列表、元组、集合和字典等。函数定义使用…

软考(网工)——网络操作系统与应用服务器

文章目录 网络操作系统与应用服务器🕐本地用户与组1️⃣Windows server 2008R2 本地用户与组2️⃣常见用户组与权限 🕑活动目录1️⃣活动目录2️⃣活动目录(Active Directory,AD)3️⃣活动目录工作组分类 🕒远程桌面与…

使用ETL进行数据接入的方式

数据接入 数据接入,作为现代信息技术架构中的一个关键环节,指的是将来自不同源头的数据整合到统一的数据平台或系统中。这一过程不仅是技术上的挑战,也涉及到组织结构、业务流程等多个层面的协调与优化。通过有效的数据接入,企业…

HDLBits中文版,标准参考答案 | 6 CS450

关注👆 望森FPGA 👆 查看更多FPGA资讯 这是望森的第 25 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Cs450/timer 2 Cs450/counter 2bc 3 Cs450/history shift 4 Cs450/gshare 本文中的代码都能够正常运行,请放心食用😋~ 练…