背景:
最近在开发中接触到微服务的一些概念,并且为其他业务组通过URL请求的方式提供了我们本地接口。
其中涉及到了,注册方法,发送和接收脚本,确定调用的URL,鉴权数据。从而引出今天要讲内容RPC框架。
场景:
当你点开某Q音乐,加载页全是并夕夕广告,你手一抖,居然点进去了,进入到了某夕的店铺。你不禁在想,难道某Q有并夕夕的代码,然后他们直接调用的吗?
什么是RPC
怎样理解RPC
Remote Procedure Calls
远程过程调用,它是一种通过网络从远程计算机中请求服务,而不需要了解底层的技术。
比如说两台服务器A、B,服务器A想要调用服务器B上的应用,由于不处于同一内存空间,相互之间无法直接调用,而通过网络来表达语义和传达数据。
说白就是调用别人的东西像用自己的东西一样。
那么问题来了:
为什么要提供远程调用的接口,而不是直接提供本地接口,让其他业务组访问我们的代码?
1、业务独立,业务单一简单,数据库分用户,保证部分的稳定性,便于维护。
2、区别于外部调用,传统C/S或者B/S模型,客户端直接调用服务端获得数据。现在随着业务的复杂扩大,出现了分布式和微服务,简单一点来说,就是以前都是一家饭馆什么菜都烧,也可以满足大家的口味,但现在不同了,人们的需求越来越多,需要不同的菜馆,诸如炒菜、火锅、烧烤等等。怎样更好地提供调用的服务。如果是网络的话为何不是直接用网络协议诸如http,而要搞一套框架体系出来。
以往我们把代码打包成动态库、静态库、SDK、各种包等,直接利用网络协议进行传输,但是网络协议始终是网络协议,它只提供数据的传输,比没有服务的管理,没有一整套系统。我们所提到RPC框架它不止http协议更是一种策略和框架,指导着我们如何更好地进行远程通信。
RPC是一种内部服务框架,可以涉及服务注册、服务治理、服务发现、熔断机制、负载均衡等。
典型的RPC组件
前面提到了,RPC不仅仅是一种协议或者技术,宏观来说是一种做事遵循的规范或参考。
一般组成为:
RPC 不关注底层协议,交由具体的网络通信协议负责。从RPC协议来讲:
序列化和反序列化
将数据和对象转化为二进制文件,便于传输。
同时反序列化将二进制文件解析成数据和对象。
协议编码
编码这块一般的是XML和JSON格式。
网络传输
TCP、UDP、还是HTTP依照各自的优缺点
常用的RPC框架
框架 | 介绍 |
---|---|
Dubbo | 阿里开源的Java框架 |
gRPC | 谷歌 |
thrift | Apache服务框架 |
Tars | 腾讯C++服务框架 |
brpc | 百度框架 |