GoLang:gRPC协议的介绍以及详细教程,从Protocol开始

目录

​编辑

引言

一、安装相关Go语言库和相关工具

1. 安装Go

2. 安装Protocol Buffers Compiler

2.1 Windows

2.1.1 下载

2.1.2 解压

2.1.3 环境变量

2. macOS

3. Linux

4. 验证安装

3. 安装gRPC-Go

4. 安装Protocol Buffers的Go插件

二、定义服务

三、生成Go语言代码

四、实现服务端

1. 实现Proto定义的服务接口。

2. 启动gRPC服务器监听端口,注册服务。

五、实现客户端

1. 连接到gRPC服务器。

2. 调用服务方法。

六、测试


引言

gRPC(Google Remote Procedure Call)是一个由Google开发的高性能、开源RPC(远程过程调用)框架。它基于HTTP/2进行数据传输,使用ProtoBuf(Protocol Buffers)作为接口描述语言,支持多种编程语言,如Java、Go、C#等,适用于不同语言环境。gRPC的显著特点包括其高效的通信性能,支持双向流、多路复用和二进制传输,以及集成的安全机制,如SSL/TLS。这些特性使gRPC特别适合用于构建高性能的分布式系统和微服务架构中的服务间通信,尤其在需要处理大量数据和高吞吐量的场景中表现出色。

一、安装相关Go语言库和相关工具

1. 安装Go

确保安装了最新版本的Go。All releases - The Go Programming Language

2. 安装Protocol Buffers Compiler

2.1 Windows

2.1.1 下载

https://github.com/protocolbuffers/protobuf/releases/download/v25.1/protobuf-25.1.zip

下载适用于Windows的protoc-<version>.zip文件。

如果上面链接失效请访问官网地址:https://github.com/protocolbuffers/protobuf/releases

2.1.2 解压

解压下载的文件到一个你选择的目录。

2.1.3 环境变量

将解压后的bin目录添加到你的环境变量PATH中。这样可以从任意位置运行protoc

  • 右击“我的电脑”或“此电脑”,选择“属性”。
  • 点击“高级系统设置”,然后点击“环境变量”。
  • 在“系统变量”下,找到并选择PATH,点击“编辑”。
  • 添加解压后的bin目录的路径,点击“确定”。

2. macOS

在 macOS 上,你可以使用 Homebrew 来安装 protoc:

brew install protobuf

3. Linux

ProtoBuf编译器用于编译.proto文件。

对于大多数基于Debian的Linux发行版(如Ubuntu),你可以使用以下命令安装:

sudo apt-get install protobuf-compiler

 对于基于RPM的发行版(如Fedora、CentOS),你可以使用:

sudo dnf install protobuf-compiler

4. 验证安装

安装完成后,你可以在命令行中运行以下命令来验证安装:

protoc --version

3. 安装gRPC-Go

通过go get安装gRPC的Go实现的包。

go get -u google.golang.org/grpc

4. 安装Protocol Buffers的Go插件

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

二、定义服务

创建Proto文件:定义服务接口和消息格式。例如,创建helloworld.proto

syntax = "proto3";

package helloworld;

service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
    string name = 1;
}

message HelloReply {
    string message = 1;
}

三、生成Go语言代码

使用ProtoBuf编译器生成Go代码。

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

四、实现服务端

1. 实现Proto定义的服务接口

2. 启动gRPC服务器监听端口,注册服务。

package main

import (
    "context"
    "log"
    "net"
    "google.golang.org/grpc"
    pb "path/to/your/service"
)

type server struct {
    pb.UnimplementedGreeterServer
}

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

func main() {
    lis, err := net.Listen("tcp", ":50051")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

五、实现客户端

1. 连接到gRPC服务器

2. 调用服务方法

package main

import (
    "context"
    "log"
    "time"
    "google.golang.org/grpc"
    pb "path/to/your/service"
)

func main() {
    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)

    name := "world"
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.GetMessage())
}

六、测试

运行服务器和客户端,确保它们能够相互通信。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文笔记 Understanding Electricity-Theft Behavior via Multi-Source Data

WWW 2020 oral 1 INTRO 1.1 背景 1.1.1 窃电 窃电&#xff08;electricity theft&#xff09;指用户为了逃避电费而进行非法操作的一种行为 常用的反窃电方法可分为两类&#xff1a; 基于硬件驱动的反窃电方法 ​​​​​​​电表开盖检测、集中器检测。。。。 硬件驱动的…

腾讯云3年轻量应用服务器2核2G4M和2核4G5M性能测评

腾讯云优惠之轻量应用服务器3年优惠价格表&#xff0c;目前可以买三年的轻量配置为2核2G4M和2核4G5M&#xff0c;2核2G4M价格三年价格540元&#xff0c;2核4G5M带宽三年756元&#xff0c;当然也可以选择购买一年&#xff0c;第二年续费会比较贵&#xff0c;腾讯云轻量2核2G4M服…

多功能号卡推广分销管理系统 流量卡推广分销网站源码-目前市面上最优雅的号卡系统

一套完善,多功能,的号卡分销系统,多接口,包括运营商接口,无限三级代理,最简单易用的PHP~ 目前市面上最优雅的号卡系统!没有之一 软件架构说明 环境要求php7.3以上(建议低于8.0),MySQL5.6以上,Nginx1.16(无要求) 产品特性 自动安装向导 易于安装使用部署 多个第…

不是小米SU7买不起,而是17.58万的银河E8更有性价比

作者 |Amy 编辑 |德新 疯狂的2023年车市已过。这一年&#xff0c;新势力与传统车企自主品牌在新能源战略上多次交锋。 新能源汽车市场不再由新势力独领风骚&#xff0c;传统车企的新能源品牌进步迅猛&#xff0c;增长势头强劲。 以吉利汽车集团为例&#xff0c;2023年其新能…

1-01初识C语言

一、概述 C语言是贝尔实验室的Ken Thompson&#xff08;肯汤普逊&#xff09;、Dennis Ritchie&#xff08;丹尼斯里奇&#xff09;等人开发的UNIX 操作系统的“副产品”&#xff0c;诞生于1970年代初。 Thompson和Ritchie共同创作完成了Unix操作系统&#xff0c;他们都被称为…

解析数据链路层——组帧

组帧是数据链路层的重要功能之一&#xff0c;它将较长的数据分割成较小的帧以便在网络中传输。在本文中&#xff0c;我们将深入探讨组帧的概念、目的以及常见的组帧技术。 组帧是将数据封装成具有一定格式的帧的过程。帧是数据链路层传输的基本单位&#xff0c;它包含了有效数…

模糊综合评价

第一步&#xff1a;确定评价指标集 确定评语集&#xff1a;如好&#xff0c;很好 第二步&#xff1a;求出模糊评价矩阵P 其中Pij表示方案X在第i个指标处于第j级评语等等隶属度 并且在此阶段需要确认各指标的权系数向量A 第三步&#xff1a;利用矩阵的模糊乘法得到综合评价…

InternLM第2节课作业

基础作业 使用 InternLM-Chat-7B 模型生成 300 字的小故事 熟悉 hugging face 下载功能&#xff0c;使用 huggingface_hub python 包&#xff0c;下载 InternLM-20B 的 config.json 文件到本地

【算法专题】FloodFill 算法

FloodFill 算法 1. 图像渲染 题目链接 -> Leetcode -773.图像渲染 Leetcode -773.图像渲染 题目&#xff1a;有一幅以 m x n 的二维整数数组表示的图画 image &#xff0c;其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr, sc 和 newColor 。你应该从…

腾讯云轻量应用服务器可以一次性买三年,2核2G4M和2核4G5M

腾讯云优惠之轻量应用服务器3年优惠价格表&#xff0c;目前可以买三年的轻量配置为2核2G4M和2核4G5M&#xff0c;2核2G4M价格三年价格540元&#xff0c;2核4G5M带宽三年756元&#xff0c;当然也可以选择购买一年&#xff0c;第二年续费会比较贵&#xff0c;腾讯云轻量2核2G4M服…

Unity中Shader面片一直面向摄像机(实现思路)

文章目录 前言一、实现思路1、 我们要实现模型面片一直跟着摄像机旋转&#xff0c;那么就需要用到旋转矩阵2、确定 原坐标系 和 目标坐标系3、确定旋转后坐标系基向量 二、确定旋转后 坐标系基向量 在 原坐标系 下的值1、Z轴基向量2、假设Y轴基向量 和 世界空间下 的Y轴方向一致…

SpringCloud-高级篇(十二)

在主从集群中slave节点发生了宕机&#xff0c;不用担心&#xff0c;只要它重启就能从master节点上完成数据的同步&#xff0c;恢复数据&#xff0c;如果宕机的不是slave而是master&#xff0c;是不是master重启就可以呢&#xff1f;如果你做了master节点的数据持久化&#xff0…

如何在GitHub正确提PR(Pull Requests),给喜欢的开源项目贡献代码

最好的中文TTS项目Bert-vits2更新了中文特化分支&#xff0c;但可能由于时间仓促&#xff0c;代码中存在不少的bug&#xff0c;作为普通用户&#xff0c;有的时候也想为自己喜欢的开源项目做一点点贡献&#xff0c;帮助作者修改一些简单的bug&#xff0c;那么该如何开始&#x…

阿里云服务器Centos安装宝塔面板

阿里云服务器Centos安装宝塔面板 1 背景1.1 aliyun1.2 Linux 2 安装步骤2.0 环境配置2.1 安装前准备2.2 宝塔安装2.3 建站 3 centos常用命令3.1 防火墙相关 1 背景 1.1 aliyun 阿里云服务器是阿里云提供的一项云计算服务&#xff0c;它能够帮助用户快速搭建网站、应用和服务&…

大模型机器人原理解析:如何从RT/RT2、Berkeley Gello到发展到斯坦福Mobile ALOHA、Google家务机器人

前言 23年7月&#xff0c;我在朋友圈评估Google的RT2说道&#xff1a; “大模型正在革新一切领域啊&#xff0c;超帅&#xff0c;通过大模型不仅能理解“人话”&#xff0c;还能对“人话”进行推理&#xff0c;并转变为机器人能理解的指令&#xff0c;从而分阶段完成任务。回…

Spring Boot 整合 MinIO自建对象存储服务

GitHub 地址&#xff1a;GitHub - minio/minio: The Object Store for AI Data Infrastructure 另外&#xff0c;MinIO 可以用来作为云原生应用的主要存储服务&#xff0c;因为云原生应用往往需要更高的吞吐量和更低的延迟&#xff0c;而这些都是 MinIO 的优势。安装过程跳过。…

3C电子制造:智慧物流引领产业升级

在当今科技飞速发展的时代&#xff0c;3C电子制造行业正面临着一系列挑战和机遇。市场需求的多变和技术革新的加速&#xff0c;使得企业必须不断创新和升级。在这个过程中&#xff0c;智慧物流成为了一个关键的环节&#xff0c;它能够有效地提高生产效率、降低成本并增强企业的…

Maven之多环境配置与应用

多环境配置与应用 1. 多环境配置作用 maven提供配置多种环境的设定&#xff0c;帮助开发者使用过程中快速切换环境 2. 多环境配置步骤 2.1 定义多环境 <!--定义多环境--> <profiles><!--定义具体的环境&#xff1a;生产环境--><profile><!--定义…

使用Docker-Compose部署MySQL一主二从同步高可用MHA集群

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容准备mysql一主二从同步集群一主二从同步集群规划需要安装docker和docker-compose命令形式安装安装docker安装docker-compose 宝塔面板形式安装 部署Master节点的docker-compose.yaml文件部署MySQL从节点1的docker-compose.…

学习JavaEE的日子 day10 一维数组的深入,二维数组

day10 1.eclipse的使用 Eclipse是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于开发Java应用程序。 1.项目&#xff08;Project&#xff09;&#xff1a;项目是为满足特定需求而创建的代码文件集合。一个工作区可以包含多个项目&#xff0c;而您…