grpc学习golang版( 八、双向流示例 )

news/2024/7/8 10:33:29 标签: 学习, golang, 开发语言, grpc

系列文章目录
第一章 grpc基本概念与安装
第二章 grpc入门示例
第三章 proto文件数据类型
第四章 多服务示例
第五章 多proto文件示例
第六章 服务器流式传输
第七章 客户端流式传输
第八章 双向流示例


文章目录

  • 一、前言
  • 二、定义proto文件
  • 三、编写server服务端
  • 四、编写client客户端
  • 五、测试
  • 六、示例代码


一、前言

了解了rpc服务器流式传输,客户端流式传输,也知道了对应的使用场景。本文开始介绍双向流,双向流其实就是客户端源源不断的发数据、内容给服务端,服务端源源不断的发数据、内容给客户端。其应用场景,最常见的就是即时通讯

二、定义proto文件

新建stream.proto文件

// 指定proto版本
syntax = "proto3";
// 指定默认包名
package each_proto;
// 指定golang包名
option go_package = "/each_proto";

//定义个流服务,叫什么名字无所谓
service EachStream {
  //关键字stream
  rpc Chat(stream Request)returns(stream Response){}
}
//请求参数
message Request{
  string content = 1;
}

//回调参数
message Response{
  string message =1;
}

go_grpc_study/example_6/grpc_proto目录下新建Terminal,执行生成文件,命令如下

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

目录结构变更后为

具体步骤如下:

  • 1)定义请求message结构体Request,回调message结构体Response,使用string数据类型
  • 2)定义EachStream服务
  • 3)在服务里面,定义rpc方法Chat,使用关键词stream用于Request结构体、Response结构体

三、编写server服务端

新建server目录,新建main.go文件
目录结构如下

编写server/main.go文件

package main

import (
	"fmt"
	"go_grpc_study/example_6/grpc_proto/each_proto"
	"google.golang.org/grpc"
	"log"
	"net"
)

// 新版本 gRPC 要求必须嵌入 UnimplementedGreeterServer 结构体
type EachStream struct {
	each_proto.UnimplementedEachStreamServer
}

func (EachStream) Chat(stream each_proto.EachStream_ChatServer) error {
	for i := 0; i < 5; i++ {
		request, _ := stream.Recv()
		fmt.Println(request)
		stream.Send(&each_proto.Response{
			Message: fmt.Sprintf("第 %d 次回应你好", i+1),
		})
	}
	return nil
}

func main() {
	// 监听端口
	listen, err := net.Listen("tcp", ":8080")
	if err != nil {
		log.Fatal(err)
	}
	// 创建一个gRPC服务器实例。
	server := grpc.NewServer()
	// 将server结构体注册为gRPC服务。
	each_proto.RegisterEachStreamServer(server, &EachStream{})
	fmt.Println("grpc server running :8080")
	// 开始处理客户端请求。
	server.Serve(listen)
}

具体步骤如下:

  • 1)定义1个结构体,结构体名称无所谓,必须包含each_proto.UnimplementedEachStreamServer 对象
  • 2)实现 .proto文件中定义的API即Chat 聊天方法
  • 3)通过stream对象的Recv()方法得到客户端发送的数据,循环5次读取,并依次回应给客户端
  • 4)将服务描述及其具体实现注册到 gRPC

四、编写client客户端

新建client目录,新建main.go文件
目录结构如下

编写clinet/main.go文件

package main

import (
	"context"
	"fmt"
	"go_grpc_study/example_6/grpc_proto/each_proto"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"log"
)

func main() {
	addr := ":8080"
	// 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。
	// 此处使用不安全的证书来实现 SSL/TLS 连接
	conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))
	}
	defer conn.Close()
	// 初始化客户端
	client := each_proto.NewEachStreamClient(conn)
	stream, err := client.Chat(context.Background())

	for i := 0; i < 5; i++ {
		stream.Send(&each_proto.Request{
			Content: fmt.Sprintf("第% d 次 打招呼", i),
		})
		response, err := stream.Recv()
		fmt.Println(response, err)
	}
}

具体步骤如下:

  • 1)首先使用 grpc.Dial()gRPC 服务器建立连接
  • 2)使用 each_proto.NewEachStreamClient(conn)初始化客户端
  • 3)通过客户端调用ServiceAPI方法client.Chat,并得到stream对象
  • 4)循环5次向服务器打招呼,并输出服务器的响应

五、测试

server目录下,启动服务端

go run main.go

clinet目录下,启动客户端

go run main.go

服务端运行结果

客户端运行结果

六、示例代码

go_grpc_study:grpc学习golang


完成ヾ(◍°∇°◍)ノ゙


http://www.niftyadmin.cn/n/5537142.html

相关文章

安装Anaconda + tensorflow

安装Anaconda tensorflow 下载Anaconda&#xff08;64位&#xff09; https://www.anaconda.com/download/ Anaconda3-xxxxxx-Windows-x86_64&#xff08;不要装最新的版本&#xff0c;确保Python是3.7&#xff09; 各种Anaconda老版本&#xff1a; https://mirrors.tuna.ts…

【网络安全】第2讲 计算机网络安全概述 (笔记)

一、影响信息安全的隐患&#xff08;脆弱性&#xff09; 1、先天不足 &#xff08;1&#xff09;开放性的网络环境 &#xff08;2&#xff09;网络协议有缺陷 网络应用层的安全隐患IP 层通信的欺骗性&#xff08;假冒身份&#xff09;局域网中以太网协议的数据传输机制是广播…

c#学习日志用CLI(命令行窗口)创建c#工程

创建Helloworld.Proj和Program.cs两个文件然后运行即可&#xff0c;一种方法是用记事本创建&#xff0c;写入代码&#xff0c;这种比较费劲&#xff0c;主要代码如下 Program.cs中代码如下 System.Console.WriteLine("Hello World!!"); Helloworld.Proj中的代码如…

Windows 11 安装 Python 3.11 完整教程

Windows 11 安装 Python 3.11 完整教程 一、安装包安装 1. 下载 Python 3.11 安装包 打开浏览器,访问 Python 官方下载页面。点击“Download Python 3.11”,下载适用于 Windows 的安装包(Windows installer)。 2. 安装 Python 3.11 运行下载的安装包 python-3.11.x-amd6…

定位线上同步锁仍然重复扣费的Bug定位及Redis分布式锁解决方案

在实际生产环境中&#xff0c;处理订单的并发请求时&#xff0c;我们经常会遇到重复扣费的问题。本文将通过一个具体的代码示例&#xff0c;分析在使用同步锁时仍然导致重复扣费的原因&#xff0c;并提供一个基于Redis分布式锁的解决方案。 背景&#xff1a;这个案例出现在商家…

科技助力农业——土壤化肥测试仪

在农业生产中&#xff0c;土壤养分是作物健康生长的关键因素。然而&#xff0c;如何科学、精准地评估土壤养分含量&#xff0c;指导农民合理施肥&#xff0c;一直是农业科研和技术人员努力的方向。近年来&#xff0c;随着科技的进步&#xff0c;土壤化肥测试仪作为一种新型农业…

「Java开发指南」如何用MyEclipse完成Spring Web Flow 2.0搭建?

本教程将引导您完成Spring Web Flow的软件组件生成&#xff0c;这是Spring的一个项目&#xff0c;用于简化Web应用程序的开发。虽然Spring Web Flow与Spring MVC兼容&#xff0c;但Spring Web Flow使用流而不是控制器来实现应用程序的Web层。在本教程中&#xff0c;您将学习如何…

Django + Vue 实现图片上传功能的全流程配置与详细操作指南

文章目录 前言图片上传步骤1. urls 配置2. settings 配置3. models 配置4. 安装Pillow 前言 在现代Web应用中&#xff0c;图片上传是一个常见且重要的功能。Django作为强大的Python Web框架&#xff0c;结合Vue.js这样的现代前端框架&#xff0c;能够高效地实现这一功能。本文将…