grpc入门系列之1-Unary模式

键盘上的舞者
• 阅读 200

gRPC支持四种类型的方法,分别是:

  • Unary模式
  • 客户端流模式
  • 服务端流模式
  • 双向流模式

其中最常见的是Unary模式(即一元模式),我们在本章节仅介绍Unary模式。

Unary模式,也可以称为“一问一答模式”,客户端发送一个请求给服务端,服务端返回一个响应,和一次普通的函数调用类似。
示意图如下:

grpc入门系列之1-Unary模式

下面我们来实现一个简单的Unary接口。

要通过grpc提供接口,可以分为以下三个步骤:

  • 接口定义(.proto文件)。
  • 生成相关代码。
  • 服务端开发。
  • 客户端开发。

接口定义

我们这里实现一个简单的greet功能,项目目录结构如下:

proto 存放proto文件。
pb 存放生成的go文件。
server 服务端代码。
client 客户端代码。
bin 可执行文件。

proto文件定义如下(greet.proto):

syntax = "proto3";

package proto;

option go_package = "git.gqnotes.com/guoqiang/grpcexercises/greet/pb";

service GreetService {
  rpc Greet(GreetRequest) returns(GreetResponse) {}
}

message GreetRequest {
  string greeting = 1;
}


message GreetResponse {
  string result = 1;
}

定义Makefile,方便执行相关操作:

tidy:
    go mod tidy

greet-gen:
     protoc -Igreet/proto/ --go_out=./greet --go_opt=module=git.gqnotes.com/guoqiang/grpcexercises/greet --go-grpc_out=./greet --go-grpc_opt=module=git.gqnotes.com/guoqiang/grpcexercises/greet greet/proto/*.proto

greet-build:
     go build -o ./greet/bin/server-osx ./greet/server
     go build -o ./greet/bin/client-osx ./greet/client

.PHONY: tidy greet-gen greet-build

生成相关代码

在项目目录(greet上级目录)下执行如命令:

make greet-gen

执行成功,在pb目录下生成相关文件。

服务端开发

在server目录下添加两个文件:

  • main.go,服务入口文件。
  • Greet.go,Greet方法实现。

代码如下:
<details>
<summary>main.go</summary>

package main

import (
    "git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
    "google.golang.org/grpc"
    "google.golang.org/grpc/reflection"
    "log"
    "net"
)

func main() {
    // 实现服务端逻辑,监听5632端口
    lis, err := net.Listen("tcp", ":5632")

    if err != nil {
        log.Fatalf("failed to listen: %v", err)
        return
    }

    s := grpc.NewServer()

    // 注册服务
    pb.RegisterGreetServiceServer(s, &Server{})

    reflection.Register(s)

    log.Println("grpc server start")

    if err = s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
        return
    }
}

type Server struct {
    pb.UnimplementedGreetServiceServer
}

</details>

<details>
<summary>Greet.go</summary>

package main

import (
    "context"
    "git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
    "log"
    "time"
)

// Greet greet
func (s *Server) Greet(ctx context.Context, req *pb.GreetRequest) (*pb.GreetResponse, error) {
    log.Printf("Greet function was invoked with %v\n", req)

    result := "Hello " + req.GetGreeting() + ", now time is:" + time.Now().String()

    res := &pb.GreetResponse{
        Result: result,
    }

    return res, nil
}

</details>

客户端开发

在client目录下添加客户端代码,有两个文件:

  • main.go,程序入口文件。
  • Greet.go,具体方法文件。

文件内容如下:
<details>
<summary>main.go</summary>

package main

import (
    "git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials/insecure"
    "log"
)

func main() {
    conn, err := grpc.Dial(":5632", grpc.WithTransportCredentials(insecure.NewCredentials()))

    if err != nil {
        log.Fatalf("failed to dial: %v", err)
        return
    }

    defer conn.Close()

    // 实例化客户端
    client := pb.NewGreetServiceClient(conn)

    // 调用方法
    Greet(client)
}

</details>

<details>
<summary>Greet.go</summary>

package main

import (
    "context"
    "git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
    "log"
)

func Greet(client pb.GreetServiceClient) {
    response, err := client.Greet(context.Background(), &pb.GreetRequest{
        Greeting: "xiaoming",
    })

    if err != nil {
        log.Fatalf("failed to call Greet: %v", err)
        return
    }

    log.Printf("response:%+v\n", response)
}

</details>

执行

在项目目录下执行make tidy,拉取相关库,然后执行 make greet-build,生成可执行文件。
然后在命令行下执行如下命令,启动服务端程序:

./greet/bin/server-osx

执行如下命令,测试客户端文件:

./greet/bin/client-osx

执行结果如下:

2023/12/02 15:02:26 response:result:"Hello xiaoming now time is:2023-12-02 15:02:26.443767 +0800 CST m=+1268.825308543"

代码地址

本文由mdnice多平台发布

点赞
收藏
评论区
推荐文章
happlyfox happlyfox
4年前
笑说设计模式-小白逃课被点名
关于我简介工厂模式(FactoryPattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。分类工厂模式可以分为三种,其中简单工厂一般不被认为是一种设计模式,可以将其看成是工厂方法的一种特殊
Wesley13 Wesley13
4年前
VirtualBox网络接入模式
VirtualBox的提供了四种网络接入模式,它们分别是:1、NAT  网络地址转换模式(NAT,NetworkAddressTranslation)2、BridgedAdapter  桥接模式3、Internal  内部网络模式4、HostonlyAdapter 主机模式下面我们分别对这四种网络模
Wesley13 Wesley13
4年前
VirtualBox网络NAT模式的端口映射设置
VirtualBox的提供了四种网络接入模式,它们分别是:1、NAT网络地址转换模式(NAT,NetworkAddressTranslation)2、BridgedAdapter桥接模式3、Internal内部网络模式4、HostonlyAdapter主机模式其中NAT模式是最简单的实现虚拟机上网的方式,可以认为
Easter79 Easter79
4年前
TCP客户端【TcpClient】
一、阻塞模式1、命名空间System.Net.Sockets2、对象声明TcpClientdpu1TcpClientnull;//dpu1tcp客户端,TcpClient模式NetworkStreamstreamToServernull;//用于接收和发送数据的数据流对象3、为tcp对象分配空间dpu1TcpCl
Stella981 Stella981
4年前
RabbitMQ学习:RabbitMQ的六种工作模式终结篇(四)
前言,在前面我讲到了RabbitMQ的六种工作模式中简单模式和工作模式https://my.oschina.net/u/4115134/blog/3228182(https://my.oschina.net/u/4115134/blog/3228182),这里呢,我就一次性将剩下的四种发布订阅模式/路由模式/主题模式及Rpc异步调用模式,给
Wesley13 Wesley13
4年前
Java 设计模式
前言23种经典的模式,根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。创建型模式创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是new一个对象,然后set相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类,但是需要提供给其他开发者用的时
Stella981 Stella981
4年前
Redis pipeline(12)
常规的连接客户端一般有3种请求方式:1.Client2.Pipeline3.事务三中模式的区别Client模式:就是客户端发送一个命令,阻塞等待服务端执行,然后读取返回结果。Pipeline模式:是一次性发送多个命令,最后一次取回所有的返回结果,这种模式通过减少网络的往返时间和io读写次数,大幅度提高通信性能。事
Wesley13 Wesley13
4年前
Java设计模式之责任链模式
引入责任链模式责任链模式顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会
Wesley13 Wesley13
4年前
Java中jdk代理和cglib代理
代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中代理模式从实现方式上可以分为两个类别:静态代理和动态代理静态代理:也就是我们学习设计模式之代理模式时常见的事例,具体不在赘述,参见:
Wesley13 Wesley13
4年前
Java 设计模式系列(十二)策略模式(Strategy)
Java设计模式系列(十二)策略模式(Strategy)策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。一、策略模式的结构策略模式是对算
待兔 待兔
1年前
Java设计模式之 - 代理模式
代理模式的介绍:代理模式也称为委托模式,在开发中经常用到,是编程的好帮手,在日常生活中也比较常见。比如公司中午让同事帮忙带一份饭,比如我们请一个律师打官司,比如我们用代理服务器上网等等。代理模式真是无处不在。代理模式的定义:为其它对象提供一种代理以控制对这