Golang使用grpc详解(golang grpc)
ccwgpt 2025-07-14 12:54 1 浏览 0 评论
gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用Protocol Buffers作为序列化工具,支持多种编程语言,如C++, Java, Python, Go等。gRPC使用HTTP/2协议传输数据,可以提供更高效的数据传输和更低的网络延迟。
本文将详细介绍gRPC在Go语言中的使用方法,并提供一个简单的示例来演示如何使用gRPC实现基本的RPC通信。
准备工作
在开始之前,我们需要确保已经安装了Go和gRPC的相关工具。
安装Go
Go官网提供了各个平台的安装包下载,我们可以直接从官网下载并安装。
安装gRPC
安装gRPC需要使用Go的包管理工具——go get。我们可以在终端中执行以下命令安装:
go get -u google.golang.org/grpc
这将会自动下载并安装gRPC相关的依赖。
创建示例
为了演示gRPC的使用方法,我们将创建一个简单的示例,其中包括一个服务器和一个客户端,客户端将向服务器发送一个请求,并得到一个响应。
创建.proto文件
在gRPC中,我们使用.proto文件来定义服务和消息格式,这个文件将会用来生成客户端和服务器代码。
我们首先创建一个hello.proto文件,并在其中定义一个名为Hello的服务,服务包括一个SayHello方法,该方法接受一个名为HelloRequest的消息作为输入,并返回一个名为HelloResponse的消息。
syntax = "proto3";
package helloworld;
service Hello {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
生成代码
我们可以使用protoc工具将.proto文件编译成我们需要的语言的代码。在本例中,我们需要生成Go语言的代码。
首先,我们需要安装protoc工具:
# Linux/Unix
$ curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.17.1/protoc-3.17.1-linux-x86_64.zip
$ unzip protoc-3.17.1-linux-x86_64.zip -d /usr/local/protoc
$ export PATH=$PATH:/usr/local/protoc/bin
# macOS
$ brew install protobuf
# Windows
# Download from https://github.com/protocolbuffers/protobuf/releases/tag/v3.17.1
然后,我们使用以下命令生成Go代码:
protoc --go_out=plugins=grpc:. hello.proto
这将会生成一个hello.pb.go文件,其中包含了我们需要的服务和消息的代码。
实现服务端
现在,我们将实现一个服务器,该服务器将会启动并等待来自客户端的请求。当服务器收到客户端的请求后,它将会使用我们定义的SayHello方法来处理请求,并返回一个HelloResponse消息。
首先,我们需要导入我们生成的代码,并实现我们定义的Hello服务。
package main
import (
"context"
"fmt"
"log"
"net"
pb "github.com/your-username/hello-grpc/proto"
"google.golang.org/grpc"
)
type server struct{}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{
Message: fmt.Sprintf("Hello, %s!", req.GetName()),
}, nil
}
func main() {
lis, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterHelloServer(s, &server{})
log.Println("server started on port 8080")
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
在上述代码中,我们定义了一个名为server的结构体,并实现了Hello服务的SayHello方法。该方法接受一个HelloRequest消息作为输入,并返回一个HelloResponse消息。在返回消息中,我们使用了请求中的名称来构造一个欢迎消息。
我们还创建了一个grpc.Server,并使用RegisterHelloServer方法将我们的实现注册到服务器上。最后,我们使用Serve方法启动服务器并开始监听端口。
实现客户端
现在我们将实现一个客户端,该客户端将连接到我们刚刚创建的服务器,并使用SayHello方法向服务器发送一个HelloRequest消息。然后,它将会接收到服务器返回的HelloResponse消息。
package main
import (
"context"
"log"
pb "github.com/your-username/hello-grpc/proto"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("localhost:8080", grpc.WithInsecure())
if err != nil {
log.Fatalf("failed to dial: %v", err)
}
defer conn.Close()
client := pb.NewHelloClient(conn)
req := &pb.HelloRequest{
Name: "World",
}
resp, err := client.SayHello(context.Background(), req)
if err != nil {
log.Fatalf("failed to say hello: %v", err)
}
log.Printf("received message from server: %s", resp.GetMessage())
}
在上述代码中,我们首先使用grpc.Dial方法连接到服务器。我们还创建了一个Hello客户端,该客户端将用于调用服务器上的SayHello方法。
然后,我们创建一个HelloRequest消息,并将其传递给SayHello方法。在接收到响应后,我们使用GetMessage方法从HelloResponse消息中获取服务器返回的消息。
运行示例
现在,我们已经准备好运行我们的示例了。首先,我们需要编译并启动服务器:
go run server.go
然后,在另一个终端中,我们可以编译并运行客户端:
go run client.go
输出应该类似于以下内容:
2023/04/28 16:30:44 received message from server: Hello, World!
结论
gRPC是一种高性能、跨语言的远程过程调用框架,它使用Protocol Buffers进行序列化,并使用HTTP/2协议进行传输。在本文中,我们学习了如何使用golang实现一个简单的gRPC服务,并创建一个客户端来调用该服务。
我们首先定义了一个.proto文件,用于定义我们的服务和消息。我们然后使用protoc工具生成golang代码。在服务器端,我们实现了我们的Hello服务,并使用grpc.Server将其注册到服务器上。在客户端端,我们创建了一个连接到服务器的gRPC客户端,并使用它来调用服务器上的SayHello方法。
我们最终运行了我们的示例,并验证了服务器和客户端之间的通信。这是一个简单的示例,但它演示了gRPC的基本概念和使用方式。在实际项目中,我们可以定义更复杂的服务和消息,并使用gRPC实现更复杂的逻辑。
希望这篇文章对您有所帮助,让您更好地了解gRPC的使用。
相关推荐
- RACI矩阵:项目管理中的角色与责任分配利器
-
作者:赵小燕RACI矩阵RACI矩阵是项目管理中的一种重要工具,旨在明确团队在各个任务中的角色和职责。通过将每个角色划分为负责人、最终责任人、咨询人和知情人四种类型,RACI矩阵确保每个人都清楚自己...
- 在弱矩阵组织中,如何做好项目管理工作?「慕哲制图」
-
慕哲出品必属精品系列在弱矩阵组织中,如何做好项目管理工作?【慕哲制图】-------------------------------慕哲制图系列0:一图掌握项目、项目集、项目组合、P2、商业分析和NP...
- Scrum模式:每日站会(Daily Scrum)
-
定义每日站会(DailyScrum)是一个Scrum团队在进行Sprint期间的日常会议。这个会议的主要目的是为了应对Sprint计划中的不断变化,确保团队能够有效应对挑战并达成Sprint目标。为...
- 大家都在谈论的敏捷开发&Scrum,到底是什么?
-
敏捷开发作为一种开发模式,近年来深受研发团队欢迎,与瀑布式开发相比,敏捷开发更轻量,灵活性更高,在当下多变环境下,越来越多团队选择敏捷开发。什么是敏捷?敏捷是一种在不确定和变化的环境中,通过创造和响应...
- 敏捷与Scrum是什么?(scrum敏捷开发是什么)
-
敏捷是一种思维模式和哲学,它描述了敏捷宣言中的一系列原则。另一方面,Scrum是一个框架,规定了实现这种思维方式的角色,事件,工件和规则/指南。换句话说,敏捷是思维方式,Scrum是规定实施敏捷哲学的...
- 敏捷项目管理与敏捷:Scrum流程图一览
-
敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示,以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例:这个流程图涵盖了Scrum框架的主要阶段和活动,其中包...
- Mockito 的最佳实践(mock方法)
-
记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...
- EffectiveJava-5-枚举和注解(java枚举的作用与好处)
-
用enum代替int常量1.int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种...
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
-
Maven简介Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。仔...
- Java单元测试框架PowerMock学习(java单元测试是什么意思)
-
前言高德的技术大佬在谈论方法论时说到:“复杂的问题要简单化,简单的问题要深入化。”这句话让我感触颇深,这何尝不是一套编写代码的方法——把一个复杂逻辑拆分为许多简单逻辑,然后把每一个简单逻辑进行深入实现...
- Spring框架基础知识-第六节内容(Spring高级话题)
-
Spring高级话题SpringAware基本概念Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的。但是在实际的项目中,你的Bean必须要意识到Spring容器...
- Java单元测试浅析(JUnit+Mockito)
-
作者:京东物流秦彪1.什么是单元测试(1)单元测试环节:测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等。相关含义如下:1)单元测试:针对计算机程序模块进行输出正确性检验工作...
- 揭秘Java代码背后的质检双侠:JUnit与Mockito!
-
你有没有发现,现在我们用的手机App、逛的网站,甚至各种智能设备,功能越来越复杂,但用起来却越来越顺畅,很少遇到那种崩溃、卡顿的闹心事儿?这背后可不是程序员一拍脑袋写完代码就完事儿了!他们需要一套严谨...
- 单元测试框架哪家强?Junit来帮忙!
-
大家好,在前面的文章中,给大家介绍了以注解和XML的方式分别实现IOC和依赖注入。并且我们定义了一个测试类,通过测试类来获取到了容器中的Bean,具体的测试类定义如下:@Testpublicvoid...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)