匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

【开源实现】Golang如何使用GRPC实现高效的远程调用?

【开源实现】Golang如何使用GRPC实现高效的远程调用?

在分布式系统中,服务间的远程调用是很常见的。GRPC是Google开源的一个高性能、开放源代码的RPC框架,可用于构建跨语言的客户端和服务器系统。

本文将详细介绍Golang如何使用GRPC实现高效的远程调用。

一、安装GRPC及相关依赖

安装GRPC需要同时安装protobuf、protoc-gen-go、grpc-go等依赖。

1. 安装protobuf

    $ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protobuf-all-3.17.3.tar.gz
    $ tar -zxvf protobuf-all-3.17.3.tar.gz
    $ cd protobuf-all-3.17.3
    $ ./configure
    $ make
    $ make check
    $ sudo make install
    $ sudo ldconfig

2. 安装protoc-gen-go

    $ go get -u github.com/golang/protobuf/protoc-gen-go
    
3. 安装grpc-go

    $ go get -u google.golang.org/grpc

二、定义protobuf文件

在GRPC中,需要定义protobuf文件来定义服务和消息。下面是一个简单的示例:

syntax = "proto3";

package demo;

// 定义HelloService服务
service HelloService {
    rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

// 定义HelloRequest消息
message HelloRequest {
    string name = 1;
}

// 定义HelloResponse消息
message HelloResponse {
    string message = 1;
}

三、生成代码

在定义protobuf文件后,需要使用protoc命令生成Golang代码。

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

生成的文件包括了服务端和客户端的代码。

四、实现服务端

在服务端实现中,需要实现HelloService服务。

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"

    pb "github.com/demo/demo"
)

type server struct{}

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

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

五、实现客户端

在客户端实现中,需要使用GRPC连接服务端,并调用HelloService服务。

package main

import (
    "context"
    "log"

    "google.golang.org/grpc"

    pb "github.com/demo/demo"
)

func main() {
    conn, err := grpc.Dial(":8888", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("failed to connect: %v", err)
    }
    defer conn.Close()

    c := pb.NewHelloServiceClient(conn)

    resp, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: "world"})
    if err != nil {
        log.Fatalf("failed to call: %v", err)
    }
    log.Printf("message: %s", resp.Message)
}

六、运行程序

运行服务端程序:

    $ go run server.go

运行客户端程序:

    $ go run client.go

输出结果为:

    2021/07/27 10:30:49 message: Hello world

七、总结

本文介绍了Golang如何使用GRPC实现高效的远程调用。我们需要安装GRPC及相关依赖,并定义protobuf文件来定义服务和消息。然后使用protoc命令生成Golang代码,并实现服务端和客户端程序来进行远程调用。相比于HTTP的RESTful API,GRPC在效率、安全性和可扩展性方面都有很大的优势。