• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang 微服务之gRPC与Protobuf的使用

    RPC是什么?

    所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。

    gRPC是什么?

    与许多RPC系统一样,gRPC基于定义服务的思想,指定可以使用其参数和返回类型远程调用的方法。默认情况下,gRPC使用协议缓冲区作为接口定义语言(IDL)来描述服务接口和有效负载消息的结构。

    gRPC有什么好处以及在什么场景下需要用gRPC

    既然是server/client模型,那么我们直接用restful api不是也可以满足吗,为什么还需要RPC呢?下面我们就来看看RPC到底有哪些优势

    gRPC vs. Restful API

    gRPC和restful API都提供了一套通信机制,用于server/client模型通信,而且它们都使用http作为底层的传输协议(严格地说, gRPC使用的http2.0,而restful api则不一定)。不过gRPC还是有些特有的优势,如下:

    使用场景

    但是,通常我们不会去单独使用gRPC,而是将gRPC作为一个部件进行使用,这是因为在生产环境,我们面对大并发的情况下,需要使用分布式系统来去处理,而gRPC并没有提供分布式系统相关的一些必要组件。而且,真正的线上服务还需要提供包括负载均衡,限流熔断,监控报警,服务注册和发现等等必要的组件。不过,这就不属于本篇文章讨论的主题了,我们还是先继续看下如何使用gRPC。

    gRPC的使用通常包括如下几个步骤

    protobuf的安装

    mac:brew install protobuf

    windows:protoc 下载:官方地址,然后将 bin 路径添加到 path 环境变量下去

    linux:

    安装需要的依赖包:

    [root@localhost ~]# yum -y install autoconf automake libtool curl make g++ unzip 
    [root@localhost ~]# unzip protobuf-master.zip 
    [root@localhost ~]# cd protobuf-master 

    生成configure文件的脚本文件,如果不执行这步,以下操作将通不过

    [root@localhost protobuf-master]# ./autogen.sh 
    [root@localhost protobuf-master]# ./configure 
    

    可以修改安装目录通过 ./configure --prefix=命令,统一安装在/usr/local/protobuf下

    [root@localhost protobuf-master]# ./configure --prefix=/usr/local/protobuf 
    [root@localhost protobuf-master]# make
    [root@localhost protobuf-master]# make check
    [root@localhost protobuf-master]# make install 
    [root@localhost protobuf-master]# ldconfig # refresh shared library cache. 
    

    安装成功

    [root@localhost protobuf-master]# protoc -I=./ --cpp_out=./ test.proto
    

    安装grpc包

    go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
    go get -u google.golang.org/grpc
    protoc --go_out=plugins=grpc:. *.proto
    

    定义接口和数据类型

    syntax = "proto3";
    
    package rpc_package;
    
    // define a service
    service HelloWorldService {
     // define the interface and data type
     rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    
    // define the data type of request
    message HelloRequest {
     string name = 1;
    }
    
    // define the data type of response
    message HelloReply {
     string message = 1;
    }
    
    

    使用protobuf生成工具生成对应语言的库函数

    protoc --go_out=plugins=grpc:. helloworld.proto
    

    server.go

    // server.go
     
    import (
     "log"
     "net"
     
     "golang.org/x/net/context"
     "google.golang.org/grpc"
     pb "helloworld/helloworld"
    )
     
    const (
     port = ":50051"
    )
     
    type server struct {}
     
    func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
     return pb.HelloReply{Message: "Hello " + in.Name}, nil
    }
     
    func main() {
     lis, err := net.Listen("tcp", port)
     if err != nil {
      log.Fatal("failed to listen: %v", err)
     }
     s := grpc.NewServer()
     pb.RegisterGreeterServer(s, server{})
     s.Serve(lis)
    }

    client.go

    package main
     
    //client.go
     
    import (
     "log"
     "os"
     
     "golang.org/x/net/context"
     "google.golang.org/grpc"
     pb "helloworld/helloworld"
    )
     
    const (
     address  = "localhost:50051"
     defaultName = "world"
    )
     
    func main() {
     conn, err := grpc.Dial(address, grpc.WithInsecure())
     if err != nil {
      log.Fatal("did not connect: %v", err)
     }
     defer conn.Close()
     c := pb.NewGreeterClient(conn)
     
     name := defaultName
     if len(os.Args) >1 {
      name = os.Args[1]
     }
     r, err := c.SayHello(context.Background(), pb.HelloRequest{Name: name})
     if err != nil {
      log.Fatal("could not greet: %v", err)
     }
     log.Printf("Greeting: %s", r.Message)
    }

    以上就是golang 微服务之gRPC与Protobuf的使用的详细内容,更多关于golang gRPC与Protobuf的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 在go语言中安装与使用protobuf的方法详解
    • golang grpc 负载均衡的方法
    • 详解golang consul-grpc 服务注册与发现
    • go grpc安装使用教程
    上一篇:GO语言中的方法值和方法表达式的使用方法详解
    下一篇:基于golang的简单分布式延时队列服务的实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang 微服务之gRPC与Protobuf的使用 golang,微,服务,之,gRPC,与,