gRPC的介绍、安装与使用

2023-11-03

1.gRPC是什么?

    在 gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC系统类似, gRPC也是基于以下理念:
    定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC服务器来处理客户端调用。

2.gRPC环境安装

(1)进入GOPATH/src/目录下,打开终端输入:

         $ git clone https://github.com/junaozun/golang.org

         $ git clone https://github.com/junaozun/google.golang.org

(2)解压上面下载的两个压缩包,然后都放入GOPATH/src目录下

(3)测试环境是否安装完好:

            启动服务端:

                    $ cd $GOPATH/src/google.golang.org/grpc/examples/helloworld/greeter_server
                    $ go run main.go

            启动客户端:

                    $ cd $GOPATH/src/google.golang.org/grpc/examples/helloworld/greeter_client
                    $ go run main.go

            客户端显示hello world表示测试成功,如下图所示:

              

 3.go语言实现gRPC远程调用

     (1)protobuf协议定义

             a.在src目录下创建grpcProto目录,进入该目录下,创建一个grpcProto.proto文件,内容如下:

             

             b.调用protoc编译器,生成.pb.go文件,这里需要增加grpc插件,如下图所示: 
                    $ protoc --go_out=plugins=grpc:./ *.proto      //添加grpc插件

              

             c.我们打开grpcProto.pb.go文件,查看内容:

             

    (2)gRPC服务端

          在src目录下创建grpcGo目录,进入该目录下,创建一个grpcServer.go文件,内容如下:

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	pd "grpcProto"
	"net"

)

type server struct {}

//打招呼的服务
//func(对象)函数名(context,客户端发送过来的参数)(返回给客户端的参数,错误)
func (this *server) Sayhello(ctx context.Context, in *pd.HelloReq) (out *pd.HelloRsp, err error){
	return &pd.HelloRsp{Msg:in.Msg+";你也好,我是服务端"},err
}
//说名字的服务
func (this *server) Sayname(ctx context.Context, in *pd.NameReq) (out *pd.NameRsp,err error){
	return &pd.NameRsp{Msg:in.Name+";我的名字叫服务端10010"},err
}

func main()  {

	//创建网络
	listener ,err := net.Listen("tcp","127.0.0.1:8080")
	if err != nil{
		fmt.Println("网络错误",err)
	}

	//创建grpc的服务
	ser := grpc.NewServer()

	//注册服务
	pd.RegisterHelloServerServer(ser,&server{})

	//等待网络连接
	fmt.Println("等待连接中.....")
	err = ser.Serve(listener)
	if err != nil{
		fmt.Println("网络错误",err)
	}




}

    运行服务端:

  

    (3)gRPC客户端 

   在src/grpcGo目录下,创建一个grpcClient.go文件,内容如下:           

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	pd "grpcProto"
)

func main()  {

	//客户端连接服务器
	conn ,err := grpc.Dial("127.0.0.1:8080",grpc.WithInsecure())
	if err != nil{
		fmt.Println("网络异常",err)
	}
	defer conn.Close()

	//获取grpc句柄
	c := pd.NewHelloServerClient(conn)

	//通过句柄调用函数
	req1 ,err := c.Sayhello(context.Background(),&pd.HelloReq{Msg:"你好,我是客户端"})
	if err != nil{
		fmt.Println("Sayhello服务调用失败",err)
	}
	fmt.Println("调用sayhello函数:",req1.Msg)

	req2 ,err := c.Sayname(context.Background(),&pd.NameReq{Name:"我名字叫客户端10086"})
	if err != nil{
		fmt.Println("Sayname服务调用失败",err)
	}
	fmt.Println("调用sayname函数:",req2.Msg)
}

运行客户端:

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

gRPC的介绍、安装与使用 的相关文章

  • 为什么 golang 堆配置文件中的“Total MB”小于顶部的“RES”?

    我有一个用 go 编写的服务 在运行时需要 6 7G 内存 RES 在顶部 所以我使用 pprof 工具试图找出问题所在 go tool pprof pdf http
  • 如何分发仅二进制的 go 包

    我想以二进制形式分发包而不包含源代码 我的演示项目目录结构是这样的 demo greet greet go hi hi go hello hello go main go main go package main import fmt de
  • 地图中的最大元素数

    GO 中的 Map 最多可以存储多少个元素 如果我需要经常从 Map 访问数据 那么在长时间运行的程序中不断向 Map 添加项目并从中检索项目是一个好主意吗 除了map length类型的最大值之外 map中的元素数量没有理论上的限制 in
  • 如何检查我的 golang 应用程序是否使用 Boringcrypto 而不是本机 golang crypto?

    上下文 我正在阅读多篇有关使我的 golang 应用程序符合 FIPS 要求的文章 换句话说 使我的应用程序使用 Boringcrypto 而不是本机 golang crypto https kupczynski info posts fi
  • formatFloat :将浮点数转换为字符串[重复]

    这个问题在这里已经有答案了 http golang org pkg strconv http golang org pkg strconv http play golang org p 4VNRgW8WoB http play golang
  • 带 cookie 身份验证的 Gorilla websocket

    这是我的设置 我正在构建一个带有用户登录的服务 使用 Negroni 和 Gorilla 登录后 用户会获得一个会话 cookie 服务器使用该会话 cookie 来授权受保护的端点 受保护的端点之一允许用户 客户端与服务器打开 Webso
  • golang:使用 gin 路由器服务 net.Conn

    我有一个处理传入 TCP 连接的函数 func Handle conn net Conn error 另外 我有一个初始化的 gin 路由器 带有已实现的句柄 router gin New router GET router POST Th
  • 在 Go 中修改导入的库

    我的问题 弹性节拍 https www elastic co products beats是一个用 Go 编写的日志传送程序的开源项目 它具有多种日志输出功能 包括控制台 Elasticsearch 和 Redis 我想将我自己的输出添加到
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • 在 Alpine 中找不到运行时/cgo

    In an alpine edge我安装的容器通过 RUN apk add no cache musl dev go 我试着跑go get github com golang protobuf protoc gen go then 这会导致
  • 通过 AWS ALB 的 HTTP2 PING 帧(gRPC keepalive ping)

    我正在使用 AWS Application Load Balancer ALB 公开 ASP NET Core gRPC 服务 这些服务在 Fargate 容器中运行并公开不安全的 HTTP 端口 ALB 终止外部 TLS 连接 并根据路由
  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • 我可以在谷歌云功能上托管nodejs GRPC服务器吗?

    我有一个在 AWS 实例上运行的 Nodejs GRPC 服务器 并且想迁移到谷歌云功能 这可能吗 我的无服务器选项有哪些 对的 这是可能的 to use 云功能 https cloud google com functions 为您gRP
  • Golang标志:忽略丢失的标志并解析多个重复的标志

    我是 Golang 新手 一直无法使用 flag 找到这个问题的解决方案 如何使用 flag 以便我的程序可以处理此类调用 其中 term 标志可能出现可变次数 包括 0 次 myprogram f flag1 myprogram f fl
  • 在 Go 中使用互斥锁

    我想了解互斥体是如何工作的 据我目前的理解 它是为了进行原子操作并同步对某些数据的访问 我在这里构建了一个队列数据结构的示例 https github com arnauddri algorithms blob master data st
  • 我想在后端验证来自 golang 前端的时区

    前端在注册期间发送时区以及其他用户详细信息 我需要在时区上放置一个验证器来进行 api 测试 时区数据的格式为 GMT 10 00 Hawaii GMT 08 00 Pacific Time US amp Canada 我所做的是定义数组中
  • exec git 命令拒绝重定向到 Go 中的文件

    我试图从 go 调用 git log 并将输出重定向到给定文件 cmdArgs string log numstat reverse fmt Sprintf s HEAD 89c98f5ec48c8ac383ea9e27d792c3dc77
  • 仅使用 GRPC 连接到对话流 StreamingDetectIntent,卡在等待 responseStream.MoveNext

    我正在尝试将 DialogFlow API v2 与 Unity 结合使用 由于 Unity 还没有官方 SDK 所以我使用了 Grpc beta unity SDK 以及使用 Grpc 工具中的 Protobuf 和 protoc 创建的
  • Go io.Pipe 的缓冲版本

    有缓冲版本吗io Pipe https golang org pkg io Pipe 在标准库或第三方库中 在我推出自己的库之前 上下文 我正在尝试使用这个解决方案 https stackoverflow com a 36229262 15
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt

随机推荐

  • 设计模式(三)工厂方法模式

    前一篇文章介绍了简单工厂模式 留下了一个疑问 如果需要扩展员工等级 有没有不修改既有接口的方式 答案就是工厂方法模式 既然员工的职级可以扩展 那创建对应职级员工的工厂是不是也可以扩展 工厂基类提供一个接口获取具体的产品 一旦有新的产品 就创
  • C++ day7

    简单vector include
  • CGAL 二维点集的凸包提取

    目录 一 凸包 二 代码实现 三 结果展示 一 凸包 用不严谨的话来讲 给定二维平面上的点集 凸包就是将最外层的点连接起来构成的凸多边形 它能包含点集中所有的点 百度百科 凸包 二 代码实现 include
  • 基于matlab和FFT算法实现信号频谱分析

    系列文章目录 数字信号处理 DSP Digital Signal Process 是电子通信领域非常重要的研究方向 博主汇总了数字信号处理 DSP 中常用的经典案例分析 主要基于算法分析 MATLAB程序实现 信号图像显示 对数字信号处理的
  • 算法竞赛入门经典(第二版)-刘汝佳-第十章 数学概念与方法 例题(16/29)

    文章目录 说明 例题 例10 1 例10 2 例10 3 例10 4 例10 5 未尝试 例10 6 例10 7 例10 8 例10 9 例10 10 例10 11 例10 12 例10 13 例10 14 例10 15 例10 16 未尝
  • platform设备驱动实验

    一 Linux 驱动的分离与分层 1 驱动的分隔与分离 传统驱动编写思路如下图 下图这个就是 Linux 中的总线 bus 驱动 driver 和设备 device 模型 也就是常说的驱动分离 2 驱动的分层 分层的目的也是为了在不同的层处
  • Golang 中 sync/atomic 包的原子操作

    背景 Go中多协程的情况下 要保证操作的原子性 一般要使用RWMutex或者Mutex 但是锁使用起来比较复杂 还要考虑lock 和unlock 顺序和成对出现 不注意就容易出错 于是在sync atomic包中 把我们常用的一些操作封装成
  • JDBC技术获取数据库时间字段

    MySQL数据库中datetime类型格式为0000 00 00 00 00 0 0 如2014 05 01 12 30 00 0 查询到了数据库中的结果集 ResultSet的对象后 要获取完全的时间需要用ResultSet对象的getT
  • Django实战之文件上传下载

    项目介绍 最近学习django 通过文件上传下载这个小项目 总结下常用的知识点 做这个案例我有以下需求 1 要支持一次上传多个文件 2 支持上传后记录上传的数据以及列表展示 3 支持下载和删除文件记录 效果展示 数据库记录 开发步骤 创建项
  • 数据挖掘入门

    目录 前言 简介 挖掘对象 挖掘步骤 分析方法 常用算法 神经网络法 决策树法 遗传算法 粗糙集法 模糊集法 关联规则法 面对的挑战 前言 不知不觉就步入了研究生的大门 蓦然回首 大学四年时光如流水 正如歌词唱的那样 转眼就各奔东西 工作的
  • R语言grep函数用法

    通常被用来进行数值计算比较多 字符串处理相对较少 而且关于字符串的函数也不多 用得多的就是substr strsplit paste regexpr这几个了 实际上R关于字符串处理的功能是非常强大的 因为它甚至可以直接使用Perl的正则表达
  • PYTHON自动化框架总结:SELENIUM+PYTEST+ALLURE

    文章目录 一 PYTEST 1 使用pytest执行测试需要遵循的规则 2 数据驱动 3 pytest fixture 4 结合ALLURE报告 5 pytest assume 二 接口自动化内容 1 接口自动化重要性 2 接口自动化平台的
  • CTFshow web入门——文件上传

    目录 Web 151 考点 后端无验证 前端校验 Web 152 考点 绕过前端校验 Web 153 考点 文件后缀名 黑名单 Web 154 155 考点 文件内容过滤 过滤关键字是php Web 156 158 Web159 Web 1
  • 解决:Hbuilder工具点击发行打包,一直报尚未完成社区身份验证,请点击链接xxxxx,项目xxx发布H5失败的错误。[Error]尚未完成社区身份验证

    全世界任何漂亮有魅力的女生 都不会因为你送她汉堡或奶茶而对你说我爱你 明白吗 你应该带她做一些特别的事情 让她感动 日常笔记 解决 Hbuilder工具点击发行打包 一直报尚未完成社区身份验证 请点击链接xxxxx 项目xxx发布H5失败的
  • QT之运行exe文件时缺少xxx.dll文件

    使用QT最大的好处和方便的可能就是他的输出为exe文件 将这个文件直接复制到其他人的电脑上便可以直接运行 十分的便捷 但是我们有时候我们发现我们自己写的QT生成的exe文件没有办法直接在自己的电脑上打开 或者有时候copy别人的项目时 发现
  • java中的几种加密方式

    第一种 DES加解密 import java security Key import java security SecureRandom import javax crypto Cipher import javax crypto Key
  • React-resize窗口监听

    import React useState useEffect useCallback from react 创建自定义函数来写入方法 function UseWillSize const size setSize useState wid
  • [CVPR-21] Scale-aware Automatic Augmentation for Object Detection

    Scale aware Automatic Augmentation for Object Detection code GitHub dvlab research SA AutoAug Scale aware Automatic Augm
  • Qt概述和项目文件介绍

    注意 学习本专栏的内容需要了解C 相关知识 会涉及到C 基础语法和相关特性 可以参考我的另一个专栏 c 从零开始 小梁今天敲代码了吗的博客 CSDN博客 目录 一 什么是Qt 二 Qt的案例 三 项目文件介绍 一 什么是Qt 是一个跨平台的
  • gRPC的介绍、安装与使用

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