前言

上一节讲了proto的安装和php如何使用gRPC,使用gRPC需先安装protoc工具,没看过的小伙伴先移步看上一节的内容。
本文主要讲Go如何启动gRPC服务和如何使用客户端请求gRPC。

正文

gRPC代码生成

万事say hello,本节也是从最简单的hello说起吧

新建 hello.proto

syntax = "proto3";// 参数分号隔开,第一个是定义要创建的文件夹名称;第二个是定义包名
option go_package = "./hello;hello";// 定义服务
service Hello {// 定义服务方法rpc SayHello (SayHelloRequest) returns (SayHelloReply) {}
}
// 声明参数:请求参数有name,可定义多个
message SayHelloRequest {string name = 1;
}
// 声明参数:响应参数有message,可定义多个
message SayHelloReply {string message = 1;
}

使用protoc生成 gRPC 代码

protoc --go_out=./server --go-grpc_out=./server   protos/hello.proto

执行上面命令后,将会生成 hello.pb.go和hello_grpc.pb.go 两个文件,整体目录如下

服务端代码实现

在server/hello新建文件server.go,实现hello服务

package helloimport ("context""log"
)// 定义Server用于实现hello
type Server struct {// 引用hello_grpc.pb.go的UnimplementedHelloServer,相当于继承UnimplementedHelloServer
}// 实现我们在protoc定义的SayHello
func (s *Server) SayHello(ctx context.Context, in *SayHelloRequest) (*SayHelloReply, error) {// 获取protoc定义的请求参数中的namelog.Printf("Received: %v", in.GetName())// 生成protoc定义的响应参数,messagereturn &SayHelloReply{Message: "Hello " + in.GetName()}, nil
}

在hello_grpc.pb.go能看到有定义SayHello方法,我们相当于重写这个方法。

还有像请求参数SayHelloRequest,响应参数SayHelloReply都是在hello_grpc.pb.go定义好的,我们只要引用就可以。


其实gRPC就是用proto语法定义一个服务,主要是方法,请求参数,响应参数
然后选择语言生成代码,你再根据你选择的语言去实现就可以了。

启动服务

根目录下新建start_hello.go

package mainimport ("linyc/server/hello""log""net""google.golang.org/grpc"
)func main() {// 监听50054端口lis, err := net.Listen("tcp", "127.0.0.1:50054")if err != nil {log.Fatalf("failed to listen: %v", err)}// new一个服务s := grpc.NewServer()// 服务注册hello.RegisterHelloServer(s,&hello.Server{})// 启动服务if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}

执行启动服务:

客户端代码实现

根目录下新建test.go

package mainimport ("context""linyc/server/hello""log""os""time""google.golang.org/grpc"
)func main() {address := "localhost:50054" // 连接的host和端口defaultName := "world"// 设置连接服务conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()// 定义客户端c := hello.NewHelloClient(conn)// Contact the server and print out its response.name := defaultNameif len(os.Args) > 1 {name = os.Args[1]}ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()// 调用SayHello服务r, err := c.SayHello(ctx, &hello.SayHelloRequest{Name: name})if err != nil {log.Fatalf("could not greet: %v", err)}// 服务响应参数log.Printf("Greeting: %s", r.GetMessage())
}

执行试下

gRPC(3)- Go使用gRPC相关推荐

  1. undefined: grpc.SupportPackageIsVersion6 和 undefined: grpc.ClientConnInterface 解决办法

    问题表现 编译protobuf的 .pb.go文件时报错,如 undefined: grpc.SupportPackageIsVersion6 或 undefined: grpc.ClientConn ...

  2. PICE(6):集群环境里多异类端点gRPC Streaming - Heterogeneous multi-endpoints gRPC streaming

    gRPC Streaming的操作对象由服务端和客户端组成.在一个包含了多个不同服务的集群环境中可能需要从一个服务里调用另一个服务端提供的服务.这时调用服务端又成为了提供服务端的客户端了(服务消费端) ...

  3. PICE(6):集群环境里多异类端点gRPC Streaming - Heterogeneous multi-endpoints gRPC streaming...

    gRPC Streaming的操作对象由服务端和客户端组成.在一个包含了多个不同服务的集群环境中可能需要从一个服务里调用另一个服务端提供的服务.这时调用服务端又成为了提供服务端的客户端了(服务消费端) ...

  4. gRPC(1)- gRPC 简介

    概述 在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使您可以更轻松地创建分布式应用程序和服务.与许多 RPC 系统一样,gRPC 基于定义服务的 ...

  5. grpc使用记录(一) gRPC编译(mscv/gcc)

    目录 1.编译前的准备工作 2.Windows下使用VS2019编译 2.1.使用cmake生成VS2019解决方案 2.2.使用msbuild工具进行编译 3.linux下编译 3.1 CentO ...

  6. php yat grpc,Laravel 5 使用 Grpc 构建的微服务

    最近有用微服务相关的项目,所以记录一下. 服务端采用的是 NodeJS 代码就不贴了(主要是计算DY签名的),这里贴一下 .proto 文件的代码 proto 文件 syntax = "pr ...

  7. python grpc 并发_python中grpc的使用示例

    本文介绍了在Python中使用gRPC的方法示例, 具体如下: 使用 Protocol Buffers的跨平台RPC系统. 安装 使用 pip pip installgrpcio pipinstall ...

  8. .net core 下的 grpc网关——http到grpc的网关源码剖析

    我曾经有段时间,特别想写一款从Http的json请求到grpc协议的网关,以便顺应asp.net core3.1的grpc微服务支持,grpc虽然从性能上稍微逊色于其他基于tcp的rpc,但由于是微软 ...

  9. grpc调用_使用gRPC和协议缓冲区实现远程过程调用

    grpc调用 RPC简介 ( Introduction To RPC ) Remote procedure call (RPC) architecture is popular in building ...

  10. SpringBoot整合Grpc实现跨语言RPC通讯

    什么是gRPC gRPC是谷歌开源的基于go语言的一个现代的开源高性能RPC框架,可以在任何环境中运行.它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查 ...

最新文章

  1. Hinton等人新研究:如何更好地测量神经网络表示相似性
  2. 「译」JUnit 5 系列:基础入门
  3. Android地图 总于实现了!
  4. linux java services_在 Linux 上创建第一个 Service Fabric Java 应用程序
  5. OTA整包的制作流程(未完)
  6. Java核心(三)并发中的线程同步与锁
  7. SSO模型及单点登录SSO技术选型
  8. java中Protobuf的使用实例
  9. clocks_per_sec 时间不正确_你该拥有的不只是护肤品,还有正确护肤时间表
  10. 淘宝面试-Strcpy与memcpy两函数的经典实现
  11. pytorch梯度累积
  12. Magick.NET图片处理:解决png转jpg背景色为黑色的问题(设置背景色)
  13. 含论文基于JAVA户籍信息管理系统【数据库设计、论文、源码、开题报告】
  14. 乌镇里的AI || 新芒X
  15. 大数据在高校的应用场景_大数据在高校教育信息化的应用
  16. Multisim 13-电子线路实验
  17. java设计模式总结1
  18. 常用语言注释使用格式
  19. Win10安装nodejs 错误代码2502,2503
  20. B. Applejack and Storages(数学+STL的使用) Codeforces Round #662 (Div. 2)

热门文章

  1. 浅析Hotspot JIT编译
  2. jquery-1.11.0.min.js
  3. WarShall算法求矩阵传递闭包关系
  4. SAS SATA SSD IDE硬盘介绍区别
  5. 自学 ABAP 和自学 SAP 的差别
  6. python数字炸弹小游戏
  7. 用户短信迟到一个月 摩托罗拉运营商各执一词
  8. FIT5215 Deep learning学习经验贴
  9. matlab 限速标志数字识别之去除标志外环噪声
  10. Oracle入门(数据类型和使用rownum分页)