搜索
首页后端开发Golanggrpc golang安装

gRPC (Google Remote Procedure Call) 是一种高性能、跨语言的远程过程调用框架,它通过 Protocol Buffers(ProtoBuf)定义服务接口,并支持众多编程语言。gRPC 在分布式系统的开发中广泛应用,其高效的序列化和反序列化机制、基于 HTTP/2 的流控制和分块传输等一系列特性使其在网络传输方面有着明显的优势。

本文主要介绍在 Golang 中如何安装 gRPC,并编写一个简单的客户端和服务端示例代码。

1. 安装 gRPC

在安装 gRPC 之前,需要先安装 Protocol Buffers 3。Protocol Buffers 是 gRPC 自动生成代码所需的工具,同时也是一个序列化数据的工具。

首先,下载 Protocol Buffers 3 的安装包,以 Mac OS 为例:

$ curl -OL https://github.com/google/protobuf/releases/download/v3.9.1/protobuf-all-3.9.1.zip
$ unzip protobuf-all-3.9.1.zip
$ cd protobuf-3.9.1

执行 configure、make、make install 即可安装 Protocol Buffers:

$ ./configure
$ make
$ sudo make install

安装完 Protocol Buffers 后,使用以下命令安装 Go 的 gRPC 和相关工具:

$ go get -u google.golang.org/grpc
$ go get -u github.com/golang/protobuf/protoc-gen-go

2. 编写 ProtoBuf 文件

ProtoBuf 文件用于定义服务接口和数据结构,并通过 gRPC 工具自动生成相应的代码(包括客户端和服务端代码)。

我们在此编写一个简单的示例,定义一个计算器服务接口,支持加法运算:

syntax = "proto3";

package calculator;

service Calculator {
  rpc Add(AddRequest) returns (AddResponse) {}
}

message AddRequest {
  int32 left = 1;
  int32 right = 2;
}

message AddResponse {
  int32 sum = 1;
}

在此示例中,定义一个名为 Calculator 的服务接口,包含一个 Add 方法,该方法接收一个 AddRequest 参数并返回一个 AddResponse 参数。

AddRequest 和 AddResponse 都是消息结构,分别包含两个 int32 类型的字段,表示加法的两个操作数和结果。

3. 生成代码

在编写 ProtoBuf 文件后,使用以下命令生成客户端和服务端代码:

$ protoc --go_out=plugins=grpc:. calculator.proto

此命令生成一个名为 calculator.pb.go 的 Go 文件,其中定义了计算器服务的客户端和服务端代码。

4. 编写客户端和服务端代码

在生成客户端和服务端代码后,就可以开始编写实际的客户端和服务端了。

首先是服务端代码,我们创建一个名为 server.go 的文件,实现 Calculator 接口:

package main

import (
    "context"
    "log"
    "net"

    pb "calculator/calculator"

    "google.golang.org/grpc"
)

type server struct{}

func (s *server) Add(ctx context.Context, in *pb.AddRequest) (*pb.AddResponse, error) {
    sum := in.Left + in.Right
    return &pb.AddResponse{Sum: sum}, nil
}

const (
    port = ":50051"
)

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

在此示例中,我们定义了一个名为 server 的结构体,实现了 Calculator 接口中的 Add 方法。Add 方法接收一个 AddRequest 参数,并计算两个操作数之和,返回一个 AddResponse 参数。

最后,通过 gRPC 框架提供的 RegisterCalculatorServer 方法将服务注册到 gRPC 服务器中,并启动 gRPC 服务器。

接下来编写客户端代码,我们创建一个名为 client.go 的文件,实现一个简单的通过计算器服务进行加法运算的例子:

package main

import (
    "context"
    "log"
    "os"
    "strconv"

    pb "calculator/calculator"

    "google.golang.org/grpc"
)

const (
    address     = "localhost:50051"
    defaultName = "world"
)

func main() {
    // Set up a connection to the server.
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewCalculatorClient(conn)

    // Contact the server and print out its response.
    left, err := strconv.Atoi(os.Args[1])
    if err != nil {
        log.Fatalf("could not parse left operand: %v", err)
    }
    right, err := strconv.Atoi(os.Args[2])
    if err != nil {
        log.Fatalf("could not parse right operand: %v", err)
    }
    r, err := c.Add(context.Background(), &pb.AddRequest{Left: int32(left), Right: int32(right)})
    if err != nil {
        log.Fatalf("could not add: %v", err)
    }
    log.Printf("Sum: %d", r.Sum)
}

在此示例中,我们创建了一个名为 client 的客户端对象,并通过 grpc.Dial 方法连接到服务器。然后,我们从命令行参数中解析出加法的两个操作数,并调用 Add 方法发送请求,得到服务器返回的结果并输出。

5. 运行示例

在两个文件都编写完毕后,使用以下命令编译并运行两个程序:

$ go build server.go
$ go build client.go
$ ./server

然后在另一个终端中执行以下命令运行客户端程序:

$ ./client 1 2

运行结果会输出计算结果 3。

以上就是 gRPC 在 Golang 中的安装和使用,通过 gRPC 编写高效的分布式系统将变得十分简单。

以上是grpc golang安装的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您如何使用PPROF工具分析GO性能?您如何使用PPROF工具分析GO性能?Mar 21, 2025 pm 06:37 PM

本文解释了如何使用PPROF工具来分析GO性能,包括启用分析,收集数据并识别CPU和内存问题等常见的瓶颈。

您如何在GO中编写单元测试?您如何在GO中编写单元测试?Mar 21, 2025 pm 06:34 PM

本文讨论了GO中的编写单元测试,涵盖了最佳实践,模拟技术和有效测试管理的工具。

如何编写模拟对象和存根以进行测试?如何编写模拟对象和存根以进行测试?Mar 10, 2025 pm 05:38 PM

本文演示了创建模拟和存根进行单元测试。 它强调使用接口,提供模拟实现的示例,并讨论最佳实践,例如保持模拟集中并使用断言库。 文章

如何定义GO中仿制药的自定义类型约束?如何定义GO中仿制药的自定义类型约束?Mar 10, 2025 pm 03:20 PM

本文探讨了GO的仿制药自定义类型约束。 它详细介绍了界面如何定义通用功能的最低类型要求,从而改善了类型的安全性和代码可重复使用性。 本文还讨论了局限性和最佳实践

解释GO反射软件包的目的。您什么时候使用反射?绩效有什么影响?解释GO反射软件包的目的。您什么时候使用反射?绩效有什么影响?Mar 25, 2025 am 11:17 AM

本文讨论了GO的反思软件包,用于运行时操作代码,对序列化,通用编程等有益。它警告性能成本,例如较慢的执行和更高的内存使用,建议明智的使用和最佳

您如何在GO中使用表驱动测试?您如何在GO中使用表驱动测试?Mar 21, 2025 pm 06:35 PM

本文讨论了GO中使用表驱动的测试,该方法使用测试用例表来测试具有多个输入和结果的功能。它突出了诸如提高的可读性,降低重复,可伸缩性,一致性和A

如何使用跟踪工具了解GO应用程序的执行流?如何使用跟踪工具了解GO应用程序的执行流?Mar 10, 2025 pm 05:36 PM

本文使用跟踪工具探讨了GO应用程序执行流。 它讨论了手册和自动仪器技术,比较诸如Jaeger,Zipkin和Opentelemetry之类的工具,并突出显示有效的数据可视化

您如何在go.mod文件中指定依赖项?您如何在go.mod文件中指定依赖项?Mar 27, 2025 pm 07:14 PM

本文讨论了通过go.mod,涵盖规范,更新和冲突解决方案管理GO模块依赖关系。它强调了最佳实践,例如语义版本控制和定期更新。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
2 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器