grpc入门Unary模式使用方法示例教程

 更新时间:2023年12月18日 10:29:15   作者:guoqiang  
这篇文章主要为大家介绍了grpc入门Unary模式使用方法示例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

gRPC支持类型方法

gRPC支持四种类型的方法,分别是:

  • Unary模式
  • 客户端流模式
  • 服务端流模式
  • 双向流模式

其中最常见的是Unary模式(即一元模式),我们在本章节仅介绍Unary模式。

Unary模式,也可以称为“一问一答模式”,客户端发送一个请求给服务端,服务端返回一个响应,和一次普通的函数调用类似。
示意图如下:

下面我们来实现一个简单的Unary接口。

要通过grpc提供接口,可以分为以下三个步骤:

  • 接口定义(.proto文件)。
  • 生成相关代码。
  • 服务端开发。
  • 客户端开发。

接口定义

我们这里实现一个简单的greet功能,项目目录结构如下:

proto 存放proto文件。
pb 存放生成的go文件。
server 服务端代码。
client 客户端代码。
bin 可执行文件。

proto文件定义如下(greet.proto):

syntax = "proto3";
package proto;
option go_package = "git.gqnotes.com/guoqiang/grpcexercises/greet/pb";
service GreetService {
  rpc Greet(GreetRequest) returns(GreetResponse) {}
}
message GreetRequest {
  string greeting = 1;
}
message GreetResponse {
  string result = 1;
}

定义Makefile,方便执行相关操作:

tidy:
    go mod tidy
greet-gen:
     protoc -Igreet/proto/ --go_out=./greet --go_opt=module=git.gqnotes.com/guoqiang/grpcexercises/greet --go-grpc_out=./greet --go-grpc_opt=module=git.gqnotes.com/guoqiang/grpcexercises/greet greet/proto/*.proto
greet-build:
     go build -o ./greet/bin/server-osx ./greet/server
     go build -o ./greet/bin/client-osx ./greet/client
.PHONY: tidy greet-gen greet-build

生成相关代码

在项目目录(greet上级目录)下执行如命令:

make greet-gen

执行成功,在pb目录下生成相关文件。

服务端开发

在server目录下添加两个文件:

  • main.go,服务入口文件。
  • Greet.go,Greet方法实现。

代码如下:

<details>
<summary>main.go</summary>

package main
import (
    "git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
    "google.golang.org/grpc"
    "google.golang.org/grpc/reflection"
    "log"
    "net"
)
func main() {
    // 实现服务端逻辑,监听5632端口
    lis, err := net.Listen("tcp", ":5632")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
        return
    }
    s := grpc.NewServer()
    // 注册服务
    pb.RegisterGreetServiceServer(s, &Server{})
    reflection.Register(s)
    log.Println("grpc server start")
    if err = s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
        return
    }
}
type Server struct {
    pb.UnimplementedGreetServiceServer
}

</details>

<details>

<summary>Greet.go</summary>

package main
import (
    "context"
    "git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
    "log"
    "time"
)
// Greet greet
func (s *Server) Greet(ctx context.Context, req *pb.GreetRequest) (*pb.GreetResponse, error) {
    log.Printf("Greet function was invoked with %v\n", req)
    result := "Hello " + req.GetGreeting() + ", now time is:" + time.Now().String()
    res := &pb.GreetResponse{
        Result: result,
    }
    return res, nil
}

</details>

客户端开发

在client目录下添加客户端代码,有两个文件:

  • main.go,程序入口文件。
  • Greet.go,具体方法文件。

文件内容如下:

<details>

<summary>main.go</summary>

package main
import (
    "git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials/insecure"
    "log"
)
func main() {
    conn, err := grpc.Dial(":5632", grpc.WithTransportCredentials(insecure.NewCredentials()))
    if err != nil {
        log.Fatalf("failed to dial: %v", err)
        return
    }
    defer conn.Close()
    // 实例化客户端
    client := pb.NewGreetServiceClient(conn)
    // 调用方法
    Greet(client)
}

</details>

<details>

<summary>Greet.go</summary>

package main
import (
    "context"
    "git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
    "log"
)
func Greet(client pb.GreetServiceClient) {
    response, err := client.Greet(context.Background(), &pb.GreetRequest{
        Greeting: "xiaoming",
    })
    if err != nil {
        log.Fatalf("failed to call Greet: %v", err)
        return
    }
    log.Printf("response:%+v\n", response)
}

</details>

执行

在项目目录下执行make tidy,拉取相关库,然后执行 make greet-build,生成可执行文件。

然后在命令行下执行如下命令,启动服务端程序:

./greet/bin/server-osx

执行如下命令,测试客户端文件:

./greet/bin/client-osx

执行结果如下:

2023/12/02 15:02:26 response:result:"Hello xiaoming now time is:2023-12-02 15:02:26.443767 +0800 CST m=+1268.825308543"

代码地址 https://git.gqnotes.com/guoqiang/grpcexercises

以上就是grpc入门Unary模式使用方法示例教程的详细内容,更多关于grpc Unary模式的资料请关注脚本之家其它相关文章!

相关文章

  • Golang哈希算法实现配置文件的监控功能详解

    Golang哈希算法实现配置文件的监控功能详解

    这篇文章主要介绍了Golang哈希算法实现配置文件的监控功能,哈希和加密类似,唯一区别是哈希是单项的,即哈希后的数据无法解密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • Golang定时任务框架GoCron的源码分析

    Golang定时任务框架GoCron的源码分析

    本文主要介绍了Golang定时任务框架GoCron的源码分析,原生的gocron存在一些问题,如任务列表维护不当、并发操作不可预测等,经过改进的gocron解决了这些问题,感兴趣的可以了解一下
    2025-03-03
  • Gin实现大文件分片上传与断点续传过程

    Gin实现大文件分片上传与断点续传过程

    本文介绍了基于Go语言Gin框架实现大文件分片上传与断点续传的完整流程,首先概述了分片上传和断点续传的核心原理,接着详细描述了服务端的实现,包括全局配置、核心接口和路由注册等,客户端部分则提供了简易示例代码
    2026-04-04
  • golang int64转int的方法

    golang int64转int的方法

    这篇文章主要介绍了golang int64转int,本文给大家提供两种方法 ,将 golang int64 转换为golang int,结合实例代码给大家分享转换方法,需要的朋友可以参考下
    2023-01-01
  • Go中的gRPC入门教程详解

    Go中的gRPC入门教程详解

    本文详细讲解了Go中的gRPC入门教程,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • Go+Redis实现延迟队列实操

    Go+Redis实现延迟队列实操

    这篇文章主要介绍了Go+Redis实现延迟队列实操,延迟队列是一种非常使用的数据结构,我们经常有需要延迟推送处理消息的场景,比如延迟60秒发送短信,延迟30分钟关闭订单,消息消费失败延迟重试等
    2022-09-09
  • Go语言LeetCode500键盘行题解示例详解

    Go语言LeetCode500键盘行题解示例详解

    这篇文章主要为大家介绍了Go语言LeetCode500键盘行题解示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • golang标准库strconv常用方法

    golang标准库strconv常用方法

    在Go语言中,strconv 包提供了许多用于字符串和基本数据类型之间转换的函数,今天通过本文给大家介绍golang标准库strconv常用方法,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • golang遍历map的方法小结

    golang遍历map的方法小结

    在Go语言中,使用range关键字可以遍历map,返回键和值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • Go常问的一些面试题汇总(附答案)

    Go常问的一些面试题汇总(附答案)

    通常我们去面试肯定会有些不错的Golang的面试题目的,所以总结下,让其他Golang开发者也可以查看到,同时也用来检测自己的能力和提醒自己的不足之处,这篇文章主要给大家介绍了关于Go常问的一些面试题以及答案的相关资料,需要的朋友可以参考下
    2023-10-10

最新评论