Go gRPC教程实现Simple RPC

 更新时间:2022年06月15日 17:26:25   作者:烟花易冷人憔悴  
这篇文章主要为大家介绍了Go gRPC教程实现Simple RPC示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

gRPC主要有4种请求和响应模式,分别是简单模式(Simple RPC)、服务端流式(Server-side streaming RPC)、客户端流式(Client-side streaming RPC)、和双向流式(Bidirectional streaming RPC)。

  • 简单模式(Simple RPC):客户端发起请求并等待服务端响应。
  • 服务端流式(Server-side streaming RPC):客户端发送请求到服务器,拿到一个流去读取返回的消息序列。 客户端读取返回的流,直到里面没有任何消息。
  • 客户端流式(Client-side streaming RPC):与服务端数据流模式相反,这次是客户端源源不断的向服务端发送数据流,而在发送结束后,由服务端返回一个响应。
  • 双向流式(Bidirectional streaming RPC):双方使用读写流去发送一个消息序列,两个流独立操作,双方可以同时发送和同时接收。

本篇文章先介绍简单模式。

新建proto文件

主要是定义我们服务的方法以及数据格式,我们使用上一篇的simple.proto文件。

1.定义发送消息的信息

message SimpleRequest{
    // 定义发送的参数,采用驼峰命名方式,小写加下划线,如:student_name
    string data = 1;//发送数据
}

2.定义响应信息

message SimpleResponse{
    // 定义接收的参数
    // 参数类型 参数名 标识号(不可重复)
    int32 code = 1;  //状态码
    string value = 2;//接收值
}

3.定义服务方法Route

// 定义我们的服务(可定义多个服务,每个服务可定义多个接口)
service Simple{
    rpc Route (SimpleRequest) returns (SimpleResponse){};
}

4.编译proto文件

我这里使用上一篇介绍的VSCode-proto3插件,保存后自动编译。

指令编译方法,进入simple.proto文件所在目录,运行:

protoc --go_out=plugins=grpc:./ ./simple.proto

创建Server端

1.定义我们的服务,并实现Route方法

import (
	"context"
	"log"
	"net"
	"google.golang.org/grpc"
	pb "go-grpc-example/proto"
)
// SimpleService 定义我们的服务
type SimpleService struct{}
// Route 实现Route方法
func (s *SimpleService) Route(ctx context.Context, req *pb.SimpleRequest) (*pb.SimpleResponse, error) {
	res := pb.SimpleResponse{
		Code:  200,
		Value: "hello " + req.Data,
	}
	return &res, nil
}

该方法需要传入RPC的上下文context.Context,它的作用结束超时或取消的请求。更具体的说请参考该文章

2.启动gRPC服务器

const (
	// Address 监听地址
	Address string = ":8000"
	// Network 网络通信协议
	Network string = "tcp"
)
func main() {
	// 监听本地端口
	listener, err := net.Listen(Network, Address)
	if err != nil {
		log.Fatalf("net.Listen err: %v", err)
	}
	log.Println(Address + " net.Listing...")
	// 新建gRPC服务器实例
	grpcServer := grpc.NewServer()
	// 在gRPC服务器注册我们的服务
	pb.RegisterSimpleServer(grpcServer, &SimpleService{})
	//用服务器 Serve() 方法以及我们的端口信息区实现阻塞等待,直到进程被杀死或者 Stop() 被调用
	err = grpcServer.Serve(listener)
	if err != nil {
		log.Fatalf("grpcServer.Serve err: %v", err)
	}
}

里面每个方法的作用都有注释,这里就不解析了。
运行服务端

go run server.go
:8000 net.Listing...

创建Client端

import (
	"context"
	"log"
	"google.golang.org/grpc"
	pb "go-grpc-example/proto"
)
const (
	// Address 连接地址
	Address string = ":8000"
)
func main() {
	// 连接服务器
	conn, err := grpc.Dial(Address, grpc.WithInsecure())
	if err != nil {
		log.Fatalf("net.Connect err: %v", err)
	}
	defer conn.Close()
	// 建立gRPC连接
	grpcClient := pb.NewSimpleClient(conn)
	// 创建发送结构体
	req := pb.SimpleRequest{
		Data: "grpc",
	}
	// 调用我们的服务(Route方法)
	// 同时传入了一个 context.Context ,在有需要时可以让我们改变RPC的行为,比如超时/取消一个正在运行的RPC
	res, err := grpcClient.Route(context.Background(), &req)
	if err != nil {
		log.Fatalf("Call Route err: %v", err)
	}
	// 打印返回值
	log.Println(res)
}

运行客户端

go run client.go
code:200 value:"hello grpc"

成功调用Server端的Route方法并获取返回的数据。

总结

本篇介绍了简单RPC模式,客户端发起请求并等待服务端响应。

教程源码地址:https://github.com/Bingjian-Zhu/go-grpc-example

参考:gRPC官方文档中文版

更多关于Go gRPC教程Simple RPC的资料请关注脚本之家其它相关文章!

相关文章

  • golang中sync.Map并发创建、读取问题实战记录

    golang中sync.Map并发创建、读取问题实战记录

    这篇文章主要给大家介绍了关于golang中sync.Map并发创建、读取问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Golang中的Slice与数组及区别详解

    Golang中的Slice与数组及区别详解

    数组是一种具有固定长度的基本数据结构,在golang中与C语言一样数组一旦创建了它的长度就不允许改变,数组的空余位置用0填补,不允许数组越界。今天小编通过实例代码操作给大家详细介绍lang中的Slice与数组的相关知识,一起看看吧
    2020-02-02
  • Go语言LeetCode题解682棒球比赛

    Go语言LeetCode题解682棒球比赛

    这篇文章主要为大家介绍了Go语言LeetCode题解682棒球比赛示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • OpenTelemetry-go的SDK使用方法详解

    OpenTelemetry-go的SDK使用方法详解

    这篇文章主要介绍了OpenTelemetry-go的SDK使用方法,OpenTelemetry帮我们实现了相应语言的SDK,所以我们只需要进行调用即可,本文根据官方文档实例讲解,需要的朋友可以参考下
    2022-09-09
  • 关于golang监听rabbitmq消息队列任务断线自动重连接的问题

    关于golang监听rabbitmq消息队列任务断线自动重连接的问题

    这篇文章主要介绍了golang监听rabbitmq消息队列任务断线自动重连接,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Go项目在linux服务器的部署详细步骤

    Go项目在linux服务器的部署详细步骤

    在今天的软件开发中,使用Linux作为操作系统的比例越来越高,而Golang语言则因为其高效、简洁和并发性能等特点,也被越来越多的开发者所青睐,这篇文章主要给大家介绍了关于Go项目在linux服务器的部署详细步骤,需要的朋友可以参考下
    2023-09-09
  • Go语言中嵌入C语言的方法

    Go语言中嵌入C语言的方法

    这篇文章主要介绍了Go语言中嵌入C语言的方法,实例分析了Go语言中cgo工具的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 浅谈Golang Slice切片如何扩容的实现

    浅谈Golang Slice切片如何扩容的实现

    本文主要介绍了浅谈Golang Slice切片如何扩容的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • golang RPC包原理和使用详细介绍

    golang RPC包原理和使用详细介绍

    golang的rpc支持三个级别的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是独一无二的RPC,它和传统的RPC系统不同,它只支持Go开发的服务器与客户端之间的交互,因为在内部,它们采用了Gob来编码
    2022-09-09
  • go语言分布式id生成器及分布式锁介绍

    go语言分布式id生成器及分布式锁介绍

    这篇文章主要为大家介绍了go语言分布式id生成器及分布式锁介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论