美文网首页
gRPC学习笔记2 - 示例

gRPC学习笔记2 - 示例

作者: 张云飞Vir | 来源:发表于2020-04-03 13:51 被阅读0次

0. 背景

编写一个 gRPC 的示例。

1. gRPC 简介

gRPC 是谷歌开源的轻量级 RPC 通信框架,其中的通信协议基于二进制数据流,使得 gRPC 具有优异的性能。

gRPC 使用 protobuf 作为通信协议

两个微服务之间通过基于 HTTP 2.0 二进制数据帧通信,使用 gRPC 内置的 protobuf 协议,其 DSL 语法 可清晰定义服务间通信的数据结构

过程分解
实现一个 gRPC 调用,需要这么几步:

  • (1)定义数据结构和服务方法:在一个 .proto 文件内定义服务。
  • (2)生成接口源代码:用 protocol buffer 编译器生成服务器和客户端代码。
  • (3) 服务端实现接口客户端调用:使用 Go API 实现一个简单的客户端和服务器。

1. 实现

  • (1) 写一个 .proto 文件,定义数据结构和服务方法。
  • (2) 用 protocol buffer 编译器生成服务器和客户端代码。
  • (3) 实现服务端。
  • (3) 实现一个简单的客户端。

下面分解实现

1.1 定义数据结构和服务方法

写一个 .proto 文件,定义数据结果和服务方法,示例:

syntax = "proto3";

// 声明一个方法调用
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 请求消息
message HelloRequest {
  string name = 1;
}

// 响应消息
message HelloReply {
  string message = 1;

}

1.2 服务端实现

执行 protoc 生成源代码。

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

完成后,要确保生成的源代码放入你的项目中。

1.3 服务端实现

步骤如下:

  • (1)实现 上面声明的方法
  • (2)使用 net.Listen 建立 tcp 监听
  • (2)创建一个 grpc.NewServer 服务器对象。
  • (3)执行服务器对象 的 Serve 函数
package main

import (
    context "context"
    "fmt"
    "google.golang.org/grpc"
    "google.golang.org/grpc/examples/helloworld/helloworld"
    pb "grpcdemo/helloworld"
    "log"
    "net"
)

type myServer struct {
    helloworld.UnimplementedGreeterServer
}

// 端口号
const (
    port = ":50051"
)

/**
实现接口
*/
func (*myServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
    log.Printf("Received: %v", req.GetName())

    reply := pb.HelloReply{Message: "Hello " + req.GetName()}
    return &reply, nil
}

func main() {
    // 准备一个 tcp 的监听器
    listener1, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("出现异常: %v", err)
    }
    // 构建一个 grpc 服务
    server1 := grpc.NewServer()
    pb.RegisterGreeterServer(server1, &myServer{})

    // 启动服务
    fmt.Printf("服务启动 %v\n", port)
    err = server1.Serve(listener1)
    if err != nil {
        log.Fatalf("启动server失败: %v", err)
    }
}

1.4 客户端实现

步骤如下:

  • (1)使用 grpc.Dial 和服务端建立连接
  • (2)使用 pb.NewGreeterClient(conn) 创建一个客户端的stub代理对象。
  • (3)执行要调用的方法
package main

import (
    "context"
    "fmt"
    "google.golang.org/grpc"
    pb "grpcdemo/helloworld"
    "log"
    "time"
)

// 服务地址
const (
    address     = "localhost:50051"
    defaultName = "world"
)

func main() {
    conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
        log.Fatalf("连接失败: %v", err)
    }
    defer conn.Close()
    // 获得一个调用方法 的stub
    client := pb.NewGreeterClient(conn)
    // 准备一个超时处理
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    //  执行 调用
    fmt.Println("发起调用")
    reply, err := client.SayHello(ctx, &pb.HelloRequest{Name: "zhang3"})
    if err != nil {
        log.Fatalf("调用失败: %v", err)
    }
    log.Printf("结果: %s", reply.GetMessage())
}

演示结果:


image.png

2. 参考

https://www.jianshu.com/p/dd27a7513331

http://doc.oschina.net/grpc?t=60133

相关文章

  • gRPC学习笔记2 - 示例

    0. 背景 编写一个 gRPC 的示例。 1. gRPC 简介 gRPC 是谷歌开源的轻量级 RPC 通信框架,...

  • go gRPC基础

    sasuke.cn gRPC文档学习笔记 gRPC Basics - Go 学习目标: 定义服务 编译生成serv...

  • gRPC 学习笔记

     gRPC 学习笔记,记录gprc一些基本概念.  gRPC正如其他 RPC 系统,gRPC 基于如下思想:定义一...

  • grpc和consul结合实现分布式rpc调用

    # GRPC > 主要介绍了grpc在使用示例和原理,以及如何与consul结合 ## gRPC 是什么? > g...

  • grpc示例

    准备工作 目录结构 协议 服务器端 服务器端Makefile 客户端 客户端Makefile Makefile 编译运行

  • go语言快速使用gRPC

    sasuke.cngRPC官网文档学习笔记 快速开始 先决条件 gRPC需要1.6+版本的go。 安装gRPC 安...

  • 运行grpc示例

    下载源码 执行git clone -b v1.18.0 https://github.com/grpc/grpc-...

  • gRPC 学习笔记

    gRPC 主要使用同步请求-响应模型来交互,但是在初次连接建立后,可以实现全异步或者流模式; SOAP:Simpl...

  • gRPC Node.js快速开始

    本文翻译自gRPC官网的Node.js示例,链接地址为:https://www.grpc.io/docs/lang...

  • gRPC开发基础示例

    1. 引入依赖 1.1 引入包 1.2. 引入插件 2. 定义proto文件 2.1 安装插件 2.2 创建pro...

网友评论

      本文标题:gRPC学习笔记2 - 示例

      本文链接:https://www.haomeiwen.com/subject/sjzcphtx.html