gRPC学习入门

2023-05-16

grpc框架

参考资料:

  • 官方文档教学
  • grpc-go入门https://www.cnblogs.com/hongjijun/p/13724738.html

GRPC是Google公司基于Protobuf开发的跨语言的、高性能的、通用的开源RPC框架。GRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多个服务,对于移动设备更加友好。

在 gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC系统类似, gRPC也是基于以下理念:

  • 定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。
  • 在服务端实现这个接口,并运行一个 gRPC服务器来处理客户端调用。

本来是按照b站上视频学习,但是发现其大多在跟着实战的时候因为版本的原因,导致产生各种问题,所以自己又打开官网,跟着官网,参照视频和百度资料进行学习了。
简单介绍了一下,后面就一起开始实战吧!

1 先决条件

  • go ,任意最新版本,可参照https://golang.org/doc/install按照介绍。
  • porotobuf ,protocol buffer,参考https://developers.google.com/protocol-buffers/docs/proto3
  • Go关于grpc的插件。

可以使用以下两个命令安装

go install google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

配置环境变量

export PATH="$PATH:$(go env GOPATH)/bin"

这里配置完了,环境就OK了。此时gopath/bin目录下会有以下两个文件
在这里插入图片描述

2 实战环节

在这个grpc-practice项目中,目标是实现一个功能,客户端可以调用服务端,服务端的函数,服务端收到消息后,返回响应给客户端。
创建新的工程目录,结构如下:
grpcPrac
├── client
│ └── client.go
├── message
│ └── message.proto
└── server
└── server.go

2.1 proto文件创建

message用来编写.proto格式文件,server目录编写服务器代码,client目录编写客户端代码。
首先在message文件夹目录下创建message.proto文件,写入内容如下
syntax = "proto3";

option go_package = ".;message";

message MessageResponse {
 string responseSomething = 1;
}

message MessageRequest {
 string saySomething = 1;
}

service MessageSender {
 rpc Send(MessageRequest) returns (MessageResponse) {}
}

option go_package = ".;message"这里是制定后面编译后所在的包。

从proto文件可以看出,我们定义了一个service,称为MessageSender,这个服务中有一个rpc方法,名为Send。这个方法会发送一个MessageRequest,然后返回一个MessageResponse。

在message文件夹目录下执行如下命令:

protoc --go_out=. message.proto
protoc --go-grpc_out=. message.proto

此时会把message.proto文件转译为两个.go文件,如下:
在这里插入图片描述

在网上的一些教程中,有这样的生成方式:

protoc --go_out=plugins=grpc:. helloworld.proto

这种生成方式,使用的就是github版本的protoc-gen-go,而目前这个项目已经由Google接管了。

并且,如果使用这种生成方式的话,并不会生成上图中的xxx_grpc.pb.go与xxx.pb.go两个文件,只会生成xxx.pb.go这种文件。

此外,你也可能遇到这种错误:
protoc-gen-go-grpc: program not found or is not executable Please specify a program using absolute path or make sure the program is available in your PATH system variable --go-grpc_out: protoc-gen-go-grpc: Plugin failed with status code 1.
这是因为你没有安装protoc-gen-go-grpc这个插件,这个问题在本文中应该不会出现。

你还可能会遇到这种问题:

--go_out: protoc-gen-go: plugins are not supported; use 'protoc --go-grpc_out=...' to generate gRPC

这是因为你安装的是更新版本的protoc-gen-go,但是你却用了旧版本的生成命令。

2.2 服务端编码

在server文件夹下建立server.go文件,

package main

import (
	"context"
	"google.golang.org/grpc"
	msg "grpcPrac/message"
	"log"
	"net"
)

const (
	address = "localhost:12345"
)

type server struct {
	msg.UnimplementedMessageSenderServer
}

//实现 message接口Send方法
func (this *server)Send(ctx context.Context,in *msg.MessageRequest) (*msg.MessageResponse, error) {
	log.Printf("Received: %v", in.GetSaySomething())
	return &msg.MessageResponse{ResponseSomething: "Hello " + in.GetSaySomething()},nil
}

func main() {
	//设置监听端口
	lis, err := net.Listen("tcp", address)
	if err!= nil{
		log.Fatalf("Fail to listen:%v", err)
	}
	// 获取grpc服务端对象
	srv := grpc.NewServer()
 	
 	//注册grpc服务
	msg.RegisterMessageSenderServer(srv, &server{})
	log.Printf("server listening at %v\n",lis.Addr())
	
	//在指定端口上提供grpc服务
	if err:= srv.Serve(lis);err!=nil{
		log.Fatalf("failed to serve:%v",err)
	}

}

2.3 客户端

在Client文件夹创建client.go文件,代码如下:

package main

import (
	"context"
	"google.golang.org/grpc"
	msg "grpcPrac/message"
	"log"
	"time"
)

const (
	address = "localhost:12345"
	defaultName = "world"
)
func main() {
	//和grpc服务建立连接
	conn, err := grpc.Dial(address,grpc.WithInsecure(),grpc.WithBlock())
	if err!= nil{
		log.Fatalf("Did not connect :%v\n",err)
	}
	defer conn.Close()
	c := msg.NewMessageSenderClient(conn)

	//contact the server
	name := defaultName
	ctx ,cancel := context.WithTimeout(context.Background(),time.Second)
	defer cancel()
	r, err := c.Send(ctx,&msg.MessageRequest{SaySomething: name})
	if err!= nil{
		log.Fatalf("Could not Send :%v\n",err)
	}
	log.Printf("Response : %s\n",r.GetResponseSomething())
}

用终端进入server和client目录下各自运行代码,效果如下
在这里插入图片描述

由此看到咱们通过客户端调用服务端函数成功。

最后

其中一个坑值得记录一下,在.proto文件转译为go后,message_grpc.pb.go中多了这么一行代码,这是为了向前兼容在这里插入图片描述
所以在服务端定义结构体的时候,一定不要忘了加入这一行
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gRPC学习入门 的相关文章

  • svn diff 使用 vimdiff代替,提高阅读性

    可能是被Win下的比较软件给养出的恶习 xff0c 所以一直很难习惯 nux下文本diff的比较效果 xff0c 尤其是频繁的使用svn diff 简直会让我对程序的理解能力直线下降 终于发现 xff0c 其实svn已经提供了这种切换dif
  • 2021-01-16 SONiC系统管理9 TPID配置

    SONiC系统管理9 TPID配置 SONiC TPID配置 从SONiC VLAN YANG里面没有看到有TPID的配置能力 xff0c VLAN Range在SONiC VLAN YANG里面也没有 xff0c 二层转发功能的增强让SO
  • 2021-01-17 SONiC系统管理12 零接触部署ZTP

    2021 01 16 SONiC系统管理12 零接触部署ZTP SONiC系统管理12 零接触部署ZTP SONiC系统支持基于DHCP协议Option 67的ZTP零接触部署 SONiC系统启动以后 xff0c 系统自动在所有UP起来的端
  • 2021-02-02 SONiC系统管理 18配置文件格式

    SONiC系统管理 18 配置文件格式 前面说到了SONiC系统启动时通过读取初始配置文件的内容来配置系统 xff0c SONiC系统默认初始配置文件的位置在 etc sonic startup config 文件内容再进一步指示各种不同类
  • 2021-02-06 SONiC SAI结构 Adapter&Adapter Host

    SONiC SAI SAI 结构 SAI是SONiC系统最精华的部分 xff0c SAI spec对SAI如何定义的以及SAI如何被SONiC系统初始化和调用有一些具体的介绍 首先还是一个High Level Design的图 xff1a
  • 2021-02-07 SONiC SAI结构2 1D Bridge

    SONiC SAI结构2 1D Bridge 以太网交换流水线结构 SONiC SAI对交换机 路由器的报文处理流程建立了标准化的行为模型 即使不同的交换芯片内部实现报文处理的方式各不相同 xff0c 由于行为模型是报文处理过程的抽象描述
  • 2021-02-21 SONiC SAI结构5 VXLAN

    SONiC SAI结构5 VXLAN VXLAN报文处理模型流水线结构 SONiC SAI支持VXLAN协议 xff0c 具备支持VTEP的能力 根据报文处理功能模型的特点 xff0c 不同的功能块可以好像搭积木一样组合在一起形成新的功能
  • 2021-02-27 SONiC系统管理 21系统运行平台管理

    2021 02 27 SONiC系统管理 21 系统运行平台管理 SONiC系统通过SAI统一了交换芯片的管理 xff0c 为不同厂家的芯片提供了统一的编程接口 虽然交换芯片提供了系统的最关键的报文处理功能 xff0c 但是作为一个需要在实
  • 2021-03-03 SONiC系统管理 23 SONiC与ONIE

    SONiC系统管理 23 SONiC与ONIE 在开发解耦的白盒交换机设备中 xff0c 在硬件开源的基础上 xff0c 控制软件除SONiC以外也有其它NOS的选择 xff0c 如Cumulus Linux Open Network Li
  • 2021-03-20 SONiC 系统管理 28 静态路由配置

    2021 03 20 SONiC 系统管理 28 静态路由配置 SONiC系统支持通过多种方式配置静态路由 xff0c 包括CLI接口 xff0c 基于RESTCONF YANG方式或者gNMI接口的方式 SONiC静态路由支持IPv4和I
  • 2021-04-26 SONiC: 转发和管理平面接口SAI模型

    2021 04 26 SONiC 转发和管理平面接口SAI模型 SAI模型中转发平面和管理平面接口 转发平面和管理平面之间的接口是控制报文从转发平面传递到控制平面CPU处理的接口 对于各种类型的交换机而言 xff0c 大量不同种类的控制报文
  • 阅读qt贪吃蛇代码、学习

    学qt只有两天而已 xff0c 感觉qt真的很好入门 比mfc容易的很多 学习qt短短时间 xff0c 感觉自己可以仿照别人的代码来写些自己的桌面东西了 不过 xff0c 没有驱动 xff0c 只是兴趣的学习下 可能到此为止了 主要收获 x
  • 2021-05-18 SONiC 系统Loopback地址和管理地址配置

    SONiC 系统管理 37 系统Loopback地址和管理地址配置 SONiC系统可以通过CLI和Config DB来配置Loopback地址 CLI的配置命令和Linux系统配置网口的命令相同 admin 64 switch span c
  • 2021-05-22 SONiC 系统配置命令

    2021 05 20 SONiC 系统管理 39 SONiC系统配置命令 config help This command lists all the possible configuration commands at the top l
  • 2021-05-27 SONiC 系统配置显示命令

    2021 05 27 SONiC 系统管理 40 SONiC系统配置显示命令 show help This command displays the full list of show commands available in the s
  • 2021-06-07 SONiC 系统基于优先级的流控PFC配置命令

    2021 06 07 SONiC 系统管理 42 SONiC 系统基于优先级的流控PFC配置命令 IEEE 802 1Qbb定义的基于优先级的流控Asymmetric Priority Flow Control功能可以在端口上为每个不同的优
  • 2021-06-25 SONiC 系统BGP配置命令

    2021 06 25 SONiC 系统BGP配置命令 SONiC系统BGP配置 SONiC系统所默认包含的BGP模块在201811版的SONiC之前是开源的Quagga软件 xff0c 之后改成了更流行的FRR FRR中的Show命令是以
  • 2021年8月14日 七夕节的相遇 SONiC+P4实现

    2021年8月14日 七夕节的相遇 SONiC 43 P4实现 ONF启动了PINS项目 xff0c P4 integrated network stack
  • 2021-08-20 SONiC中的FRR和Zebra

    2021 08 20 SONiC中的FRR和Zebra SONiC中采用FRR和Zebra处理路由协议 以前写过SONiC系统所默认包含的BGP模块在201811版的SONiC之前是开源的Quagga软件 xff0c 之后改成了更流行的FR
  • 2021-08-29 SONiC中基于策略的哈希配置

    SONiC中基于策略的哈希配置 SONiC可以支持对不同类型的报文采取不同的Hash算法 对于多通道 多链路连接的情况 xff0c 如LAG和ECMP的接口上 xff0c 交换机和路由器采用Hash算法对报文中指定的字段进行Hash计算 x

随机推荐

  • 2021-09-19 当SONiC遇到P4之二

    当SONiC遇到P4之二 P4描述SAI 在当SONiC遇到P4中介绍了用P4来实现SAI Model的方式 xff0c 这种方式利用了P4数据平面编程的功能实现了SAI模型 xff0c 将P4和SONiC这两个分别位于网络数据平面和控制平
  • Cmake 模板和语法

    开始一直犹豫是不是要学cmake对于一个没有项目驱动的人来数 xff0c 感觉用不用都可以 我大可用一个简单的Makefile模板来做一些简单的工程阿 或者我还可以用autotools等 不过既然已经看了一个晚上了 xff0c 还是把它弄懂
  • 2021-09-25 SONiC系统管理32 IFA

    SONiC系统管理32 IFA Inband flow analyzer SONiC系统支持Telemetry的功能 xff0c 在INT中介绍了带内遥测In band Network Telemetry INT 对于遥测的结果 xff0c
  • 自动驾驶网络

    自动驾驶网络 网络为啥要自动驾驶 网络为啥要自动驾驶 自动驾驶网络首先要解决网络测量的问题 有测量才能完成闭环的控制
  • 怎样为SONiC社区做贡献

    64 TOC 2023继续前行 怎样为SONiC社区做贡献 SONiC在社区参与者的贡献下不断成长 xff0c 已经取得了网络操作系统事实上一统江湖的地位 同时SONiC也在不断扩大应用范围 xff0c 国内知名大厂最近在SONiC社区申请
  • cnblog上写了几个PR的内容解读

    cnblog上写了几个PR的内容解读 xff0c 欢迎参观 SONiC系统利用YANG来描述配置文件的格式 基于Radius的认证方式把登录用户的安全认证放在一个集中的Radius服务器上 xff0c 被登录设备在需要进行登录用户认证的时候
  • 无人机基础知识

    刚玩无人机或者想玩无人机的朋友 xff0c 想和圈内人交流交流get新技能 xff0c 却总有点张不开口 xff0c 怕问题一说出来就被鄙视得体无完肤 xff0c 没法继续交流了 不过 xff0c 不了解一些基本常识 xff0c 不记住几个
  • tensorflow解决keras报错 “AlreadyExistsError: Another metric with the same name already exists.“

    tensorflow解决keras报错 34 AlreadyExistsError Another metric with the same name already exists 34 最近要用到keras的一些API xff0c 用co
  • 一、Docker安装及初始化配置(Linux版)

    Docker安装及初始化配置 xff08 Linux版 xff09 1 安装前准备2 docker安装3 docker配置 1 安装前准备 1 切换root用户 xff1a sudo su 2 配置网络源 xff1a vi etc apt
  • 三、Docker常用命令和部署实例(Linux和Windows通用)

    Docker常用命令和部署实例 xff08 Linux和Windows通用 xff09 一 Docker组件和常用命令二 Docker服务命令三 Docker镜像命令四 Docker容器命令五 Docker实例练习1 MySQL容器部署2
  • 四、Dockerfile应用案例教程(将一个或多个jar包部署到docker容器中运行)

    Dockerfile应用案例教程 1 现有环境2 部署方式方式一 xff1a 直接部署jar包为容器 xff08 单个jar包 xff09 方式二 xff1a 以启动jar包打包镜像 xff0c 部署容器 xff08 单个和多个jar包均可
  • Ubuntu虚拟机设置网络桥接模式

    Ubuntu虚拟机设置网络桥接模式 1 虚拟机网络模式介绍1 1 bridged 桥接模式 1 2 host only 主机模式 1 3 NAT 网络地址转换模式 2 设置网络桥接模式2 1 Windows网络适配器设置2 2 Window
  • 完美洗牌算法

    输入 xff0c 如何在O n 的时间 xff0c 用O 1 的空间 xff0c 将这个序列顺序改为 输入 xff1a 1234567dbcdefg 则输出1a2b3c4d5e6f7g 公式 xff1a y 61 2x mod xff08
  • Windows系统安装及初始化设置

    Windows系统安装激活及初始化设置 1 系统安装1 1 iso镜像下载1 2 系统启动盘制作1 3 BIOS设置1 4 常见问题及解决方式问题1 xff1a 引导方式错误 xff08 ERROR BIOS LEGACY BOOT OF
  • E: Problem executing scripts APT和E: Sub-process returned an error code问题修复

    E Problem executing scripts APT Update Post Invoke Success和E Sub process returned an error code问题修复 问题描述原因分析和解决方案 问题描述 在
  • 解决Docker拉取镜像报Error response from daemon: error parsing HTTP 408 response body的问题

    解决Docker拉取镜像报Error response from daemon error parsing HTTP 408 response body的问题 问题描述原因分析和解决方案 xff1a xff1a 问题解决验证 问题描述 Do
  • ROS下运行ORB-SLAM2双目Stereo(官方数据集)

    写在前面 xff1a Ubuntu版本 ROS版本 opencv版本一定要对应 xff01 xff01 xff01 否则后边编译和运行过程中会有许多问题 xff0c 配环境配到怀疑人生 xff01 我的实验环境为 xff1a ubuntu1
  • Arduino学习总结(未完待续)

    文章目录 Arduino 学习硬件认识Arduino UNO 主要元器件Arduino 端口 软件认识Arduino IDEArduino 程序架构程序基础内容简述数据类型时间控制 计时函数延时函数 串口通信 x1f4de 端口间通信的类型
  • rosdep update 超时问题解决

    span class token operator lt span br span class token operator gt span reading span class token keyword in span sources
  • gRPC学习入门

    grpc框架 参考资料 xff1a 官方文档教学grpc go入门https www cnblogs com hongjijun p 13724738 html GRPC是Google公司基于Protobuf开发的跨语言的 高性能的 通用的