微服务之RPC

来源:互联网 发布:plist编辑器 for mac 编辑:程序博客网 时间:2024/05/01 18:15

RPC 简介

什么是RPC?

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

为什么要使用RPC?

RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。 为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。

服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦。
如果没有统一的服务框架,RPC框架,各个团队的服务提供方就需要各自实现一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等“业务之外”的重复技术劳动,造成整体的低效。所以,统一RPC框架把上述“业务之外”的技术劳动统一处理,是服务化首要解决的问题。

调用分类

RPC 调用分以下两种:
1. 同步调用
客户方等待调用执行完成并返回结果。
2. 异步调用
客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。 若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。

异步和同步的区分在于是否等待服务端执行完成并返回结果。

RPC框架的职责

client端包含序列化、反序列化、连接池管理、负载均衡、故障转移、队列管理,超时管理、异步管理等职责。
server端包含服务端组件、服务端收发包队列、io线程、工作线程、序列化反序列化、上下文管理器、超时管理、异步回调等职责。

RPC框架是架构微服务化的首要基础组件,它能大大降低架构微服务化的成本,提高调用方与服务提供方的研发效率,屏蔽跨进程调用函数(服务)的各类复杂细节

主流RPC框架

RPC只是描绘了 Client 与 Server 之间的点对点调用流程,包括 stub、通信、RPC 消息解析等部分,在实际应用中,还需要考虑服务的高可用、负载均衡等问题,所以产品级的 RPC 框架除了点对点的 RPC 协议的具体实现外,还应包括服务的发现与注销、提供服务的多台 Server 的负载均衡、服务的高可用等更多的功能。

目前的 RPC 框架大致有两种不同的侧重方向,一种偏重于服务治理,另一种偏重于跨语言调用。

服务治理型的 RPC 框架有 Dubbo、DubboX、Motan 等,这类的 RPC 框架的特点是功能丰富,提供高性能的远程调用以及服务发现及治理功能,适用于大型服务的微服务化拆分以及管理,对于特定语言(Java)的项目可以十分友好的透明化接入。但缺点是语言耦合度较高,跨语言支持难度较大。

跨语言调用型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等,这一类的 RPC 框架重点关注于服务的跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合于为不同语言提供通用远程服务的场景。但这类框架没有服务发现相关机制,实际使用时一般需要代理层进行请求转发和负载均衡策略控制。

Thrift

thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.org

Hessian

Hessian是一款基于HTTP协议的RPC框架,采用的是二进制RPC协议,非常轻量级 ,且速度较快。

AVRO

Avro出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下Avro的推出,其目标不仅是提供一套类似Thrift的通讯中间件更是要建立一个新的,标准性的云计算的数据交换和 存储的Protocol。支持HTTP,TCP两种协议。

Armeria

Armeria 是一个异步 RPC/API 客户端/服务器 库,基于 Java 8,Netty 4.1,HTTP/2 和 Thrift 构建。
它的主要目标是帮助工程师构建好性能的异步的微服务,基于Thrift,使用HTTP/2作为会话层协议。

Dubbo

它支持多种协议,如Dubbo, Hessian、HTTP、RMI、Memcached、Redis、Thrift等。

dubbo 协议
使用基于mina1.1.7+hessian3.2.1的tbremoting交互。

连接个数:单连接连接方式:长连接传输协议:TCP传输方式:NIO异步传输序列化:Hessian二进制序列化适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。适用场景:常规远程服务方法调用

dubbo1 (hessian2序列化+mina)
dubbo2 (hessian2序列化+netty)
dubbo2 (dubbo序列化+netty)

Transporter    mina, netty, grizzySerialization    dubbo, hessian2, java, jsonDispatcher    all, direct, message, execution, connectionThreadPool    fixed, cached

hessian 协议
Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。
Hessian是Caucho开源的一个RPC框架:http://hessian.caucho.com,其通讯效率高于WebService和Java自带的序列化。

可以和原生Hessian服务互操作,即:

提供者用Dubbo的Hessian协议暴露服务,消费者直接用标准Hessian接口调用,或者提供方用标准Hessian暴露服务,消费方用Dubbo的Hessian协议调用。

原生的Hessian协议已经支持多语言客户端调用

基于Hessian的远程调用协议。

连接个数:多连接连接方式:短连接传输协议:HTTP传输方式:同步传输序列化:Hessian二进制序列化适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。适用场景:页面传输,文件传输,或与原生hessian服务互操作

基于Dubbo的Hessian协议实现远程调用

rmi 协议
RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。

连接个数:多连接连接方式:短连接传输协议:TCP传输方式:同步传输序列化:Java标准二进制序列化适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。适用场景:常规远程服务方法调用,与原生RMI服务互操作

http 协议
采用Spring的HttpInvoker实现

thrift 协议
当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如service name,magic number等。使用dubbo thrift协议同样需要使用thrift的idl compiler编译生成相应的java代码。

Dubbo各协议性能测试
协议参考手册

Dubbo 还是 Spring Cloud

为什么不要把ZooKeeper用于服务发现

微服务架构的基础框架选择:Spring Cloud还是Dubbo?

链接

  • 为什么说要搞定微服务架构,先搞定RPC框架?
  • Dubbo实现RPC调用使用入门
  • dubbo/dubbox 增加原生thrift及avro支持
  • rpc框架之 thrift 学习 1 - 安装 及 hello world
  • http://diwakergupta.github.io/thrift-missing-guide/#_versioning_compatibility
  • HTTP/2 资料汇总
  • Thrift入门及Java实例演示
0 0
原创粉丝点击