从0开始学微服务
胡忠想
微博技术专家
立即订阅
16289 人已学习
课程目录
已完结 42 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 微服务,从放弃到入门
免费
模块一 入门微服务 (10讲)
01 | 到底什么是微服务?
02 | 从单体应用走向服务化
03 | 初探微服务架构
04 | 如何发布和引用服务?
05 | 如何注册和发现服务?
06 | 如何实现RPC远程服务调用?
07 | 如何监控微服务调用?
08 | 如何追踪微服务调用?
09 | 微服务治理的手段有哪些?
10 | Dubbo框架里的微服务组件
模块二 落地微服务 (14讲)
11 | 服务发布和引用的实践
12 | 如何将注册中心落地?
13 | 开源服务注册中心如何选型?
14 | 开源RPC框架如何选型?
15 | 如何搭建一个可靠的监控系统?
16 | 如何搭建一套适合你的服务追踪系统?
17 | 如何识别服务节点是否存活?
18 | 如何使用负载均衡算法?
19 | 如何使用服务路由?
20 | 服务端出现故障时该如何应对?
21 | 服务调用失败时有哪些处理手段?
22 | 如何管理服务配置?
23 | 如何搭建微服务治理平台?
24 | 微服务架构该如何落地?
模块三 进阶微服务 (8讲)
25 | 微服务为什么要容器化?
26 | 微服务容器化运维:镜像仓库和资源调度
27 | 微服务容器化运维:容器调度和服务编排
28 | 微服务容器化运维:微博容器运维平台DCP
29 | 微服务如何实现DevOps?
30 | 如何做好微服务容量规划?
31 | 微服务多机房部署实践
32 | 微服务混合云部署实践
模块四 展望微服务 (4讲)
33 | 下一代微服务架构Service Mesh
34 | Istio:Service Mesh的代表产品
35 | 微博Service Mesh实践之路(上)
36 | 微博Service Mesh实践之路(下)
阿忠伯的特别放送 (4讲)
阿忠伯的特别放送 | 答疑解惑01
阿忠伯的特别放送 | 答疑解惑02
微博技术解密(上) | 微博信息流是如何实现的?
微博技术解密(下)| 微博存储的那些事儿
结束语 (1讲)
结束语 | 微服务,从入门到精通
从0开始学微服务
登录|注册

06 | 如何实现RPC远程服务调用?

胡忠想 2018-09-04
专栏上一期我讲过,要完成一次服务调用,首先要解决的问题是服务消费者如何得到服务提供者的地址,其中注册中心扮演了关键角色,服务提供者把自己的地址登记到注册中心,服务消费者就可以查询注册中心得到服务提供者的地址,可以说注册中心犹如海上的一座灯塔,为服务消费者指引了前行的方向。
有了服务提供者的地址后,服务消费者就可以向这个地址发起请求了,但这时候也产生了一个新的问题。你知道,在单体应用时,一次服务调用发生在同一台机器上的同一个进程内部,也就是说调用发生在本机内部,因此也被叫作本地方法调用。在进行服务化拆分之后,服务提供者和服务消费者运行在两台不同物理机上的不同进程内,它们之间的调用相比于本地方法调用,可称之为远程方法调用,简称 RPC(Remote Procedure Call),那么RPC 调用是如何实现的呢?
在介绍 RPC 调用的原理之前,先来想象一下一次电话通话的过程。首先,呼叫者 A 通过查询号码簿找到被呼叫者 B 的电话号码,然后拨打 B 的电话。B 接到来电提示时,如果方便接听的话就会接听;如果不方便接听的话,A 就得一直等待。当等待超过一段时间后,电话会因超时被挂断,这个时候 A 需要再次拨打电话,一直等到 B 空闲的时候,才能接听。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《从0开始学微服务》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(29)

  • lfn
    我觉得压缩只是序列化的一个原因,但却不是最本质的原因。序列化是为了解决内存中数据结构到字节序列的映射过程中,如何保留各个结构和字段间的关系而生的技术。

    作者回复: 确实,理论上用字符串就也可以,序列化能映射的同时也能压缩数据

    2018-09-04
    42
  • 逍遥子
    搞不懂为什么区分长http与socket两种通信,个人理解这两者不是一种概念呀,一个是协议一个是通信基石,http协议访问不也是基于套接字么
    2018-09-29
    3
    13
  • 萨洪志
    沙发,珍惜在车上的时间,😂
    2018-09-04
    1
    13
  • godtrue
    这节原理讲的好,所有的RPC框架应该都是一样的,那为啥还会存在那么多的RPC框架呢?重复造轮子显然会花费人力物力,益处是啥呢?相信老师后面会讲的

    正如许多同学都发现了一样,本节讲的也存在一点点瑕疵。

    我觉得RPC最核心,少了就是不行那部分内容如下:
    1:网络链接,没有这个谈不上R
    2:序列化和反序列化,没有这个服务之间无法交流
    3:本地业务处理,没有这个谈不上PC,当然这个是涉及业务的部分,是独特的,不是框架开发者关心的部分是业务开发关心的部分

    其他:
    1:网络通信协议用什么,是场景而定,不过现在HTTP/TCP已是业界的标准
    2:序列化和反序列化的框架用什么,也是视情况而定,当然功能强、性能好、易使用、易扩展的谁都爱的
    3:压缩和解压缩,这个我认为也是视情况而定的,对性能要求不高完全不用考虑,不过一般都是非常在乎性能的,估计也是有选择的至于选哪一种也是一个视情况而定的权衡问题
    4:就连注册中心,也是个附加的功能,是为了解决提供者和消费者较多且变化频繁,如何发现和路由的问题
    2019-05-21
    7
  • 波波安

    一、gRPC数据传输采用的http2通信协议。连接管理的方式有
    1.GOAWAY帧
    服务端发出这种帧给客户端表示服务端在相关的连接上不再接受任何新流
    2.PING帧
    客户端和服务端均可以发送一个ping帧,对方必须精确回显它们所接收的消息。这可以用来确认连接任然是活动的。
    3.连接失败
      客户端检测到连接失败,所有的调用都会以不可用状态关闭。服务端侧所有已经打开的调用都会被以取消状态关闭。
    二、在多数语言里,gRPC编程接口同时支持同步和异步。
    三、默认使用Protocol buffers协议对数据进行序列化和反序列化
    2018-10-11
    5
  • 靖远小和尚
    老师你好aio是异步阻塞是不是写错了!他应该是异步非阻塞吧!

    作者回复: 写错了,已修改👍

    2018-09-04
    4
  • Hungry
    老师,我觉得序列化最大的目的是解决异构系统的数据传输,比如大小端、远端的持久存储;至于不同语言的代码结构上的变量映射,TLV压缩,这些应该是其次的

    作者回复: 嗯,在服务框架里序列号最主要的作用是数据编码

    2018-09-09
    3
  • 九斤鱼
    感觉这几篇还是在入门,实战什么时候开始呢?,老师,我更关心的实际操作层面,比如技术栈选型方面,是spring cloud呢还是dubbo还是其他什么,
    系统划分后的工程如何管理,如何部署,如何测试,多容器环境下需要注意什么等等问题,望老师可以在接下来的课程里可以用实际项目解答一下🙏

    作者回复: 可以看下专栏目录,在原理讲完之后开始讲实践

    2018-09-06
    3
  • WolvesLeader
    服务A调用B,B调用C,假如B响应较慢,会造成整个调用链挂掉吗?有啥好办法防止这种问题吗?
    2018-09-06
    3
  • Wayne.kun
    压缩跟序列化是两回事啊
    2019-04-21
    2
  • kid
    我认为序列化主要解决三点:
    1.大小端虚,异构系统网络通信时候的大小端序问题,这点由通信底层库实现
    2.一种协议,在异构语言中进行数据翻译
    3.压缩优化,提高网络通信能力
    2018-10-11
    2
  • Douglas
    老师, nio 多路复用io 解决并发连接数问题, 但是,io密集型的应用,业务还是应该 放到单独的线程里面处理的吧,可以创建一个线程池, nio 事件监听连接建立之后, 直接从 业务线程池中获取一个线程来处理业务?
    2018-10-09
    2
  • 云学
    这篇文章感觉有些地方不太严谨,序列化是和异构系统有关

    作者回复: 序列化跟异构系统没有直接关联,比如java序列化,主要是为了解决数据编解码的问题

    2018-09-05
    2
  • asdf100
    (1)同步阻塞IO(Blocking IO):即传统的IO模型。
    (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。
    (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构。
    (4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。

    上面提到的“同步非阻塞“方式怎么不一样?

    作者回复: IO多路复用属于同步非阻塞的

    2018-09-04
    2
  • 先来
    NIO,AIO描述有问题。
    NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。



    AIO (Asynchronous I/O):异步非阻塞I/O模型。

    作者回复: 抱歉,手误了,已修改👍

    2018-09-04
    2
  • 王鸿运
    现在服务端最主流的处理方式应该是nio方式,因为Linux上并没有提供aio接口,epoll也是nio方式
    2019-01-09
    1
  • 衣申人
    原来不只是我觉得序列化不是为了压缩的,嘻嘻。我认为序列化和反序列化是解决内存数据到字节流的相互转换的。而压缩不压缩,其实不是必要的。当然序列化后的大小是评估一种序列化方式的优劣因素之一。

    作者回复: 是啊,这里着重强调下压缩比来体现差异

    2018-09-23
    1
  • 哦山丘
    TCP可以看下这个https://blog.csdn.net/striveb/article/details/84063712
    2019-09-28
  • 王鸿运
    序列化的根本原因应该是以一种双方都可以解析方式对数据进行格式化,比如二进制方式和字符串方式。其中c语言的结构体(当然因为不同机器对齐方式不同,需要设置成按1字节填充)和protobuf都是二进制格式,而json和xml都是字符串方式进行序列化。
    因为序列化的主要目的不是压缩,虽然为了节省带宽,提高传输速率的原因,大部分序列化方式都会涉及自己的编码方式对数据进行压缩,如protobuf。
    但这种压缩编码和压缩算法本质上是不同的,protobuf对字符串字段就没办法压缩,还会因为扩展兼容性需要增加字段标签。而压缩主要是通过分析字符串出线频率,通过变长的编码方式对数据重新编码达到压缩目的
    2019-01-09
  • 西兹兹
    忠老师总结的4点很到到位,赞
    2019-01-06
收起评论
29
返回
顶部