Jump to Navigation

Go调用gRPC服务两例

Go调用gRPC服务两例

先上两段Go语言客户端调用gRPC服务的示例代码:

示例1

func client_call1() {
    address := "host:port"
    conn, _ := grpc.Dial(address, grpc.WithInsecure())
    cli := flyrun.NewFlyRunClient(conn)

    code := "echo '123'; echo time(); var_dump('abcde');"
    req := &flyrun.FlyRunReq{Num: flyrun.LangNum_PHP, Code: code, Res: ""}

    resp, err := cli.Run(context.Background(), req)
    fmt.Printf("%#v\n", resp)
    if err != nil {
       panic(err)
    }
}

示例2

func client_call2() {
    code := "echo '123'; echo time(); var_dump('abcde');"
    req := &flyrun.FlyRunReq{Num: flyrun.LangNum_PHP, Code: code, Res: ""}

    resp, err := flyrun.FlyRun.Run(req)
    if err != nil {
         panic(err)
    }
}

调用便捷性分析

示例1是官方给出来的示例,比较直接。包含所有需要的调用元素,包括服务器地址,连接对象的创建,以及实际调用。

示例2是经过一次封装的代码,从调用方式看,直接就到了调用一步,并没有的显式的设置服务器连接。

简单的比较,示例2的使用更简洁,使用方能够真正像调用本地函数一样调用gRPC服务,提供了更简单的gRPC服务的透明性。

当然示例中只有一次gRPC调用,如果多次调用,是否要像示例1中一样设置服务器地址,创建连接,再调用呢?

不过我还是喜欢示例2方式的代码,真正融入到了调用端中。

从实现的角度分析

示例1的通用性还是比较好的,并且不需要额外的库,除了gRPC-go之外。

当然gRPC-go核心代码库的实现还是比较成熟稳定的,这种使用方式基本不用考虑太多了。

除了一点需要考虑一下,多服务器地址的情况下,如何选择服务器,每次调用都要显式地选择服务器吗?

如果再多考虑一点,发现这其实不过是一段通用代码,选择服务器的函数而已。

也许选择服务器的函数实现不复杂,那么实现之后是否每次都要显式调用呢?

我认为的结果还是不需要,反正都是要调用的,省略不掉,否则怎么知道调用哪个服务器上的gRPC服务呢?

从以上的考虑,得到了示例2中的代码,其他的gRPC服务器选择函数,服务器连接与管理,做成了公用的代码,放在某个共享代码仓库中了。

当然这个封装有一些代码,也许可以帮助节省一点时间。需要的情况下,也可以阅读代码,查看实现,初步实现时间与可靠的双保险。

如果对封装原理机制有兴趣,可以直接阅读代码,也可以参考本系列另外几篇文档(可能有3,4篇吧,只是还没整理完),以便加深理解,使用时更得心应手。

目前该封装方式的实现正在测试阶段,还有诸多不完善,还请多关注,多提PR。

代码仓库

https://git.xiaojukeji.com/liuguangzhao/atapi/tree/master

可能的gRPC系列文档

Go语言gRPC服务编写示例

PHP语言gRPC服务编写与客户端调用示例

protoc-gen-go代码生成插件初步认识与初步改造

多服务器情况下gRPC服务器地址选择机制

添加新评论

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut