专栏首页写代码和思考gRPC学习笔记2 - 示例

gRPC学习笔记2 - 示例

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go 操作 MySQL 数据库

    在实际开发中,要用到数据库存储数据。MySQL是一个关系型数据库管理系统 使用非常广泛。在Go语言开发中,会选择一个操作数据的类库来帮助我们完成工作。

    zhangyunfeiVir
  • Android训练课程(Android Training) - NFC基础

    本文档介绍了在Android上的基本的NFC任务。它说明了如何发送和接收的NDEF消息(NDEF messages)的形式的表单里包含的NFC数据(NFC da...

    zhangyunfeiVir
  • Android开发 - NFC基础

    本文档介绍了在Android上的基本的NFC任务。它说明了如何发送和接收的NDEF消息(NDEF messages)的形式的表单里包含的NFC数据(NFC da...

    zhangyunfeiVir
  • 信息论中的各种熵

    本文简单介绍了信息论中的各种熵,包括自信息、熵;联合熵、条件熵、互信息;KL散度、交叉熵。并在最后用信息论中的交叉熵推导了逻辑回归,得到了和最大似然法相同的结果...

    用户1147754
  • MySQL redo与undo日志解析

    前面文章讲述了 MySQL 系统中常见的几种日志,其实还有事务相关日志 redo log 和 undo log 没有介绍。相对于其他几种日志而言, redo l...

    MySQL技术
  • Python GUI 03----But

    创建三个Button,各自对应回调函数;将第二个Button设置焦点,程序运行是按“Enter”,判断程序的打印结果

    py3study
  • 简单的交叉熵损失函数,你真的懂了吗?

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    红色石头
  • 记录日志

    华创信息技术
  • 学会如何学习 - 成为更好的终身学习者

    酥鱼我从小学到大学毕业,当了十六年的学生,工作又选择了程序员这个发展日新月异、需要持续学习的行业。

    scarsu
  • MySQL探秘(八):InnoDB的事务

     事务是数据库最为重要的机制之一,凡是使用过数据库的人,都了解数据库的事务机制,也对ACID四个基本特性如数家珍。但是聊起事务或者ACID的底层实现原理,往往言...

    程序员历小冰

扫码关注云+社区

领取腾讯云代金券