gRPC 基础(二)-- Go 语言版 gRPC-go

news2024/11/16 19:46:31

gRPC-Go
Github

gRPC的Go实现:一个高性能、开源、通用的RPC框架,将移动和HTTP/2放在首位。有关更多信息,请参阅Go gRPC文档,或直接进入快速入门。

一、快速入门

本指南通过一个简单的工作示例让您开始在Go中使用gRPC。

1.1 先决条件

  • Go:三个最新主要版本中的任意一个。
  • Protocol buffer:compiler, protoc, version 3.
  • 有关安装说明,请参阅协议缓冲区编译器安装。
  • 协议缓冲区编译器的Go插件:

1、使用以下命令安装Go的协议编译器插件:

$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

2、更新您的PATH,以便协议编译器可以找到插件:

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

1.1.1 Get the example code

示例代码是grpc-go repo的一部分。
1、 将repo下载为zip文件并解压缩,或克隆repo:

$ git clone -b v1.52.0 --depth 1 https://github.com/grpc/grpc-go.git

2、 Change to the quick start example directory:

$ cd grpc-go/examples/helloworld

1.1.2 Run the example

examples/helloworld目录中:
1、编译并执行服务器代码:

$ go run greeter_server/main.go

2、从不同的终端,编译并执行客户端代码,以查看客户端输出:

$ go run greeter_client/main.go
Greeting: Hello world

在这里插入图片描述
恭喜你!您刚刚使用gRPC运行了一个客户机-服务器应用程序。

1.2 更新gRPC服务

在本节中,您将使用一个额外的服务器方法更新应用程序。gRPC服务是使用协议缓冲区(protocol buffers)定义的。要了解如何在.proto文件中定义服务的更多信息,请参阅基础教程。现在,所有你需要知道的是,服务器和客户端存根都有一个SayHello() RPC方法,它从客户端接受一个HelloRequest参数,并从服务器返回一个HelloReply,该方法是这样定义的:

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

打开helloworld/helloworld.proto。并添加一个新的SayHelloAgain()方法,具有相同的请求和响应类型:

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

记得保存文件!

1.3 重新生成gRPC代码

在使用新的服务方法之前,需要重新编译更新后的.proto文件。

仍然在examples/helloworld目录下时,运行以下命令:

$ protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    helloworld/helloworld.proto

错误提示:protoc-gen-go-grpc: program not found or is not executable

需要安装以下gRPC gen插件:


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

他将重新生成helloworld/helloworld.pb.gohelloworld/helloworld_grpc.pb.go文件,包含:

  • 用于填充、序列化和检索 HelloRequestHelloReply消息类型的代码。
  • 生成客户端和服务器代码。

1.4 更新并运行应用程序

您已经重新生成了服务器和客户机代码,但是仍然需要在示例应用程序的人工编写部分实现和调用新方法。

更新服务器

打开 greeter_server/main.go并添加以下函数:

func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
        return &pb.HelloReply{Message: "Hello again " + in.GetName()}, nil
}

更新客户端

打开 greeter_client/main.go,将以下代码添加到main()函数体的末尾:

r, err = c.SayHelloAgain(ctx, &pb.HelloRequest{Name: *name})
if err != nil {
        log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())

运行

像以前那样运行客户机和服务器。在examples/helloworld目录中执行以下命令:

  1. Run the server:
$ go run greeter_server/main.go
  1. 从另一个终端运行客户端。这一次,添加一个名称作为命令行参数:
$ go run greeter_client/main.go --name=Alice

您将看到以下输出:

Greeting: Hello Alice
Greeting: Hello again Alice

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

word排版技巧:这几种特殊版式轻松搞定

我们在许多报刊、杂志中会见到一些带有特殊效果的文档,如首字下沉、分栏排版、竖排文档等形式的排版效果。这些效果其实不是只有专业排版软才能实现,利用Word我们可以轻松完成这些排版效果。1、首字下沉首字下沉是一种突出显示段落中的第一个汉字的排版方…

3小时快速上手sharding-jdbc

今日目标 1、理解分库分表基础概念【垂直分库分表、水平分库分表】 2、能够说出sharding-jdbc为我们解决什么问题 3、理解sharding-jdbc中的关键名词 4、理解sharding-jdbc的整体架构及原理 5、掌握sharding-jdbc的集成方式1.分库分表介绍 1.1 分库分表概述 分库分表就是为了…

普元EOS_工作流引擎相关数据表记录---工作流工作笔记002

由于现在在用普元的工作流引擎,但是,说明文档中没有对数据表的说明 所以整理一下记录下来: 业务流程(com.eos.workflow.data.WFProcessDefine) 属性 名称 类型 processDefID 业务流程ID long processDefName 业务流程名称 String processChName 业务流程显示名称 String desc…

计算机图形学 第5章 二维变换与裁剪完结

目录中点分割直线段裁剪算法中点计算公式代码Liang-Barsky直线段裁剪算法⭐⭐⭐代码:多边形裁剪算法/Sutherland-Hodgman裁剪算法代码相关学习资料:中点分割直线段裁剪算法 中点分割直线段裁剪算法对Cohen-Sutherland直线裁剪算法的第3种情况做了改进&a…

Centos 安装部署 Sentinel

在微服务架构中,业务高峰时段,请求过多可能导致直接查询数据库,造成雪崩等事故。 一、雪崩问题 微服务调用链路中某个服务故障,引起整个链路中所有服务不可用。 解决方案 1)超时处理 设置超时时间,请求超…

最近超火的ChatGPT到底怎么样?体验完后我有哪些感受和思考?

✔️本文主题:ChatGPT 人工智能 ✔️官方网站:chat.openai.com 文章目录前言二、初识三、深入四、编程相关编写纠错五、感想六、展望七、结语前言 大家好,这次我们来聊一聊最近超级火的人工智能语音——ChatGPT! ChatGPT是什么&…

从 synchronized 到 CAS 和 AQS的超详细解析

文章目录一、Synchronized 关键字二、悲观锁和乐观锁三、公平锁和非公平锁四、可重入锁和不可重入锁五、CAS5.1、操作模型5.2、重试机制(循环 CAS)5.3、底层实现5.4、ABA 问题六、可重入锁 ReentrantLock七、AQS7.1、请求锁7.2、创建 Node 节点并加入链表…

Vue3组合式API

Vue3组合式APIcomposition API 和 options API体验 composition APIsetup 函数reactive 函数ref 函数script setup语法composition API 和 options API vue2 采用的就是 optionsAPI (1) 优点:易于学习和使用, 每个代码有着明确的位置 (例如: 数据放 data 中, 方法放 methods中)…

Mac 打开JD-GUI报错:ERROR launching ‘JD-GUI‘

目录一、JD-GUI下载二、JD-GUI报错信息三、解决方案1、查找JD-GUI包内容2、修改universalJavaApplicationStub.sh文件一、JD-GUI下载 JD-GUI下载地址:https://github.com/java-decompiler/jd-gui/releases 二、JD-GUI报错信息 Mac系统版本:11.3 JD-GUI…

智能车|自主导航 ROS Navigation Stack 功能包 简介与编译

智能车|自主导航 ROS Navigation Stack 功能包 简介与编译前言功能包下载与编译前言 ros功能包:Navigation ros wiki:http://wiki.ros.org/navigation github 地址:https://github.com/ros-planning/navigation 功能包简介: ROS…

第一次创业,注册什么类型的公司?

前言 几乎每一个打工者都有一颗当老板的心,大喊一声:"大丈夫生居天地间,岂能郁郁久居人下",于是一拍桌子就辞职创业,现实往往都是潦草收场,看下面一段统计数据: 中国小微企业平均存活周期4.13年&…

通过Bypass UAC进行权限提升

什么是UAC用户账户控制(User Account control,UAC)是windows系统采用的一种控制机制,可以阻止自动安装未经授权的应用 并防止意外更改系统设置,有助于防止恶意软件损坏计算机。用户账户控制程序使应用程序和任务始终在…

2.5.3 PCIe——物理电气子层——动态均衡

因为PCIE 3.0信号的速率可以达到8Gb/s,而且链路通道走线也可能会很长,这可能会导致高速信号衰减过大,为了补偿channel的衰减需要增加传输信号的高频成分,让高频和低频能量差不多,这就是equalization。因此在PCIE 3.0的…

DNS Sec

域名系统(Domain Name System,DNS)响应消息中给出域名服务器的IP地址、完全合格的域名与IP地址之间的绑定关系等,因此,DNS响应消息的真实性和完整性直接关系用户访问网络过程的安全性。为了保证DNS响应消息的真实性和完…

Python中的条件分支和循环语句

1.条件分支语句 (1) 第 1 种是判断一个条件,如果这个条件成立,就执行其包含的某条语句或某个代码块。 if 条件:某条语句或某个代码块(2)第 2 种同样是判断一个条件,跟第 1 种的区别是如果条件…

易控智驾:用最“接地气”的自动驾驶,写一本“矿区修炼手册”

CES2023刚刚在拉斯维加斯闭幕,作为行业风向标,本届展会上元宇宙、汽车技术等重要科技依然是大亮点。宝马、英特尔等厂商,依然带来了有趣的消费级产品,但也有更多的工业与制造业产品、方案,带着更多的科技智能属性脱颖而…

网络原理(TCP/IP五层协议)(一)

目录TCP/IP五层协议栈应用层传输层TCP/IP五层协议栈 应用层 在应用层最重要的事情,就是“设计并实现一个应用层协议”。 举个例子,公司在开发一个项目,点外卖的软件。 当前要开发一个功能,叫做获取用户的订单历史。(在数据库里&…

软件设计(三)

软件设计(二)https://blog.csdn.net/ke1ying/article/details/128794008?spm1001.2014.3001.5502 21、一颗二叉树的高度为h,则该二叉树 最多有2的h次方-1个节点。 22、图的遍历是指对图中所有顶点进行访问且只访问一次的过程,可…

《第一行代码》 第一章:第一行Android代码

1,Android系统架构 2,开发的四大组件 3,丰富的系统控件 Android 系统为开发者提供了丰富的系统控件,使得我们可以很轻松地编写出漂亮的界面。当然如果你品位比较高,不满足于系统自带的控件效果,也完全可以…

java 基于ssm的在线音乐分享平台 idea mysql

根据一般在线音乐平台的功能需求分析,本系统的功能模块如下: (1)在个人中心,管理员可以修改自己的用户名和登录密码。 (2)在用户管理模块中,可以查看用户的信息,和进行修…