服务计算——gRPC

服务计算——gRPC

1. gRPC 简介

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得用户能够更容易地创建分布式应用和服务。

与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

在这里插入图片描述

gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本,并且可以用任何 gRPC 支持的语言来编写。所以,可以很容易地用 Java 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版本的接口,使用户很容易地将 Google 的功能集成到用户的应用里。

2. 使用 protocol buffers

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。

3. 搭建 gPRC 简单客户端

3.1 在 Go 语言编译环境下安装 gPRC
3.1.1 Install
$ go get -u google.golang.org/grpc/examples/helloworld/greeter_client
$ go get -u google.golang.org/grpc/examples/helloworld/greeter_server

注:

这里我在安装时候由于访问限制,我并没有直接获取到对应的例子,下面会有介绍如何一步步创建客户端并完成操作。

这里有尝试翻墙获取资源,但依旧是无响应在这里插入图片描述

3.1.2 Run
  • Run the server
$ greeter_server
  • Run the client
$ greeter_client
3.2 定义服务

RPC 服务主要具有以下特点:

  • 通过参数和返回类型来指定可以远程调用的方法;

  • gRPC 通过 protocol buffers来实现定义一个服务的操作;

  • gPRC 使用 protocol buffers 接口定义语言来定义服务方法,用protocol buffer来定义参数和返回类型

  • 客户端和服务端均使用服务定义生成的接口代码

我们上面使用 go get得到的代码中的 Greeter 服务有一个方法 SayHello ,可以让服务端从远程客户端接收一个包含用户名的 HelloRequest 消息后,在一个 HelloReply 里发送回一个 Greeter。

syntax = "proto3";
 
option java_package = "io.grpc.examples";
 
package helloworld;
 
// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
 
// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}
 
// The response message containing the greetings
message HelloReply {
  string message = 1;
}
3.3 生成 gPRC 代码

一旦定义好服务,就可以使用 protocol buffer 编译器 protoc 来生成创建应用所需的特定客户端和服务端的代码。

运行 protocol buffer 编译器,生成客户端和服务端接口:

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

这生成了 helloworld.pb.go ,包含了我们生成的客户端和服务端类,此外还有用于填充、序列化、提取 HelloRequestHelloResponse 消息类型的类。

3.4 写一个服务器

greeter_server/main.go 实现了 Greeter 服务所需要的行为。正如你所见,服务器有一个 server 结构。它通过实现 sayHello 方法,实现了从 proto 服务定义生成的 GreeterServer 接口:

// server is used to implement helloworld.GreeterServer.
type server struct{}
// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
  return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

为了返回给客户端应答并且完成调用:

  1. 构建并填充一个在我们接口定义的 HelloReply 应答对象。
  2. HelloReply 返回给客户端。
3.5 写一个客户端

创建一个 gRPC 频道,指定我们要连接的主机名和服务器端口。然后我们用这个频道创建存根实例。

const (
  address     = "localhost:50051"
  defaultName = "world"
)
func main() {
  // Set up a connection to the server.
  conn, err := grpc.Dial(address)
  if err != nil {
      log.Fatalf("did not connect: %v", err)
  }
  defer conn.Close()
  c := pb.NewGreeterClient(conn)
...
}

gRPC Go 你是使用一个特殊的 Dial() 方法来创建频道。

3.6 调用 RPC

联系服务并获得一个 greeting :

  1. 创建并填充一个 HelloRequest 发送给服务。
  2. 用请求调用存根的 SayHello(),如果 RPC 成功,会得到一个填充的 HelloReply ,从其中可以获得 greeting。
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
      log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
3.7 运行
  • 服务端
$ greeter_server &
  • 客户端
$ greeter_client 

运行结果:

./greeter_server &
 
./greeter_client
2019/01/15 17:10:19 Greeting: Hello world
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值