深入浅出gRPC
李林锋
《Netty 权威指南》、《分布式服务框架原理与实践》作者。
立即订阅
11236 人已学习
课程目录
已更新 6 讲 / 共 6 讲
01 | gRPC 入门及服务端创建和调用原理
02 | 客户端创建和调用原理
03 | gRPC 线程模型分析
04 | gRPC 服务调用原理
05 | gRPC 安全性设计
06 | gRPC 序列化机制
深入浅出gRPC
登录|注册

01 | gRPC 入门及服务端创建和调用原理

李林锋 2018-03-12

1. RPC 入门

1.1 RPC 框架原理

RPC 框架的目标就是让远程服务调用更加简单、透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。
RPC 框架的调用原理图如下所示:

1.2 业界主流的 RPC 框架

业界主流的 RPC 框架整体上分为三类:
支持多语言的 RPC 框架,比较成熟的有 Google 的 gRPC、Apache(Facebook)的 Thrift;
只支持特定语言的 RPC 框架,例如新浪微博的 Motan;
支持服务治理等服务化特性的分布式服务框架,其底层内核仍然是 RPC 框架, 例如阿里的 Dubbo。
随着微服务的发展,基于语言中立性原则构建微服务,逐渐成为一种主流模式,例如对于后端并发处理要求高的微服务,比较适合采用 Go 语言构建,而对于前端的 Web 界面,则更适合 Java 和 JavaScript。
因此,基于多语言的 RPC 框架来构建微服务,是一种比较好的技术选择。例如 Netflix,API 服务编排层和后端的微服务之间就采用 gRPC 进行通信。

1.3 gRPC 简介

gRPC 是一个高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计。

1.3.1 gRPC 概览

gRPC 是由 Google 开发并开源的一种语言中立的 RPC 框架,当前支持 C、Java 和 Go 语言,其中 C 版本支持 C、C++、Node.js、C# 等。当前 Java 版本最新 Release 版为 1.5.0,Git 地址如下:
gRPC 的调用示例如下所示:

1.3.2 gRPC 特点

语言中立,支持多种语言;
基于 IDL 文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub;
通信协议基于标准的 HTTP/2 设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量;
序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。

2. gRPC 服务端创建

以官方的 helloworld 为例,介绍 gRPC 服务端创建以及 service 调用流程(采用简单 RPC 模式)。

2.1 服务端创建业务代码

服务定义如下(helloworld.proto):
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
服务端创建代码如下(HelloWorldServer 类):
private void start() throws IOException {
/* The port on which the server should run */
int port = 50051;
server = ServerBuilder.forPort(port)
.addService(new GreeterImpl())
.build()
.start();
...
其中,服务端接口实现类(GreeterImpl)如下所示:
static class GreeterImpl extends GreeterGrpc.GreeterImplBase {
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}

2.2 服务端创建流程

取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出gRPC》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(77)

  • uptoknow
    什么时候写两篇基于golang 的啊

    作者回复: go语言的话如果需求比较多就可以考虑写

    2018-03-21
    3
    53
  • 何方
    期待golang的

    作者回复: 看来 go 还是很火的哈

    2018-03-29
    20
  • Ky
    期待go语言

    作者回复: 共同期待

    2018-04-19
    1
    15
  • qingtama
    一直有个困惑,grpc是基于http协议的,那可不可以认为就算grpc再快,也不会比基于TCP协议的其他rpc(如thrift等)的速度快呢?

    作者回复: 这个问题很好,它采用的是HTTP/2,支持多路复用,性能比传统HTTP高很多。但是毕竟有消息头等,所以TCP私有协议性能还是会低一些,特别是使用Json之后

    2018-03-21
    11
  • dreamu
    买了课,学习中,也想看go语言的😄

    作者回复: 呵呵,go最近很火

    2018-06-09
    6
  • 小新
    有没有纸质的书呃,还有实例代码哪里能下载呢。

    作者回复: 电子版,应该还没纸质书。书中的例子官网有,就是自带的例子。不过异步化和安全那块儿的例子是官方没有,如果你有需要,可以加我微信,后续可能会放到git上

    2018-03-14
    6
  • 陈威
    以为是Golang的

    作者回复: go和java用的都挺广的

    2018-07-22
    5
  • 煎鱼
    期待Golang

    作者回复: 这个我mark下

    2018-03-28
    4
  • 小烟
    看过李老师的《分布式服务框架原理》,受益匪浅。话说老师这个收费他便宜了,建议还是加价

    作者回复: 😊,尽管不到一顿饭钱,有些人还是喜欢看免费的,呵呵。感谢理解

    2018-03-26
    4
  • 花晨少年
    请问有没有c++版本的讲解啊,发现java的服务器端是基于netty,好像c++是直接实现的,两个语言的实现会有很多不同吗

    作者回复: 对于java而言,基于netty构建哼主流一些,c++本身就有异步I/O的能力

    2018-05-10
    3
  • 东郭
    为啥没写支持python呢?

    作者回复: 在最初写作的时候,想结合go和java等为主讲,后来发现讲解原理结合代码时,如果不以一种语言写很难聚焦,如果各种语言都写,篇幅也很难控制。考虑到java的应用范围,就选择了java。不过实际上,go语言 python等几种热门语言的分开来写,结合源码讲原理,应该更有针对性。

    2018-03-15
    1
    3
  • bzy
    老师快出go语言的吧
    2019-07-16
    2
  • Geek_55eeb6
    快出golang版本吧,谢谢。
    2019-07-07
    2
  • ZeroIce
    期待GO
    2019-05-26
    2
  • shibang
    白买了,用的是Go 语言
    2019-05-18
    2
  • 蔺波
    希望介绍下python版的grpc. 还有如果能够简单介绍几个grpc应用的典型场景就更好了

    作者回复: 感谢你的宝贵建议,后续业

    2018-07-21
    2
  • 渔夫
    老师好,dubbo在国内用的人挺多,抛开服务治理,就RPC而言,gRPC 和 dubbo 各自的亮点在哪里呢?

    作者回复: gRPC有几个特点:1.支持HTTP2 2.支持多语言 3.支持安卓移动端

    2018-05-31
    2
  • Kim
    华为内部项目有用gRPC的吗?

    作者回复: 不确定,开源的选型各业务团队都有自主权

    2018-05-07
    2
  • 嘉彦
    有错误:调用完成后,应该是将响应消息序列化成PB吧?

    作者回复: 是的

    2018-04-04
    2
  • ~Angelov Lee
    grpc g 你竟然用java做示例…
    2019-07-26
    1
    1
收起评论
77
返回
顶部