标签:字节流 规则 通讯框架 改进 请求 并且 为什么 不用 代理
导读:本文主要探讨了rpc框架在微服务化中所处的位置,需要解决的问题。同时介绍了用友云微服务治理平台的rpc解决方案,为什么选择该方案、该方案提供的好处是什么。同时也会介绍用友RPC框架的基本结构以及在实现时所用到的一些关键技术。希望通过本文读者能够一窥用友rpc框架的原理,并藉此开发出更优秀的微服务应用。 随着越来越多的公司向着互联网方向转型,服务化这个概念已经深入人心。而rpc框架无疑是微服务中的重要一环。rpc框架的基本功能是将远程调用模拟成本地调用。调用本地函数很简单,传入参数执行逻辑获得返回值就可以了。但是实现一个远程调用就要考虑的多一些:
如图所示,调用和服务双方就不得不考虑在调用过程中产生的一些序列化、服务寻址、超时、异步、上下文管理等非业务问题,这些问题并不是开发者的核心问题,但是繁杂远程调用实现却为开发者带来了巨大的工作量,这就为业务开发团队带来了一个不小的困扰。因此使用一个统一的rpc框架在应用微服务化进程中是相当重要的。
此外rpc框架还能够实现公司不同团队开发的异构应用提供互相调用的需求,通过统一的rpc调用框架java、go、python等语言开发的应用可以互相使用已存在的服务接口,解放了团队技术栈的限制、实现了各种服务实现上的解耦。
rpc调用框架是微服务化的必要条件,rpc框架的性能、功能、特性直接决定了微服务项目最终的表现。总而言之,搞微服务先要搞定RPC框架才行。
一个rpc框架至少要有上图中的几个调用流程:
1)调用端发出调用方法(服务)的请求
2)ClientStub先进行服务发现,找到需要调用的服务,然后进行请求接口、方法、参数以及服务地址、请求Id的封装,包装成请求对象、序列化——编码,最后传输到网络上去
3)服务端经过网络接受到请求
4)ServerStub进行字节流的反序列化、解析请求查×××端的实现代码、发送参数到执行
5)服务端的实现将返回值发送给ServerStub处理
6)ServerStub将result、返回状态码、请求id等进行包装成返回信息、序列化——编码、传输
7)ClientStub得到字节流,进行反序列化、解析返回值,将结果返给调用端
8)调用端最终得到结果
通过上面的调用流程我们可以总结出以下几点在实现rpc框架时要解决的重点问题:
1.确定rpc请求携带的信息
rpc调用需要封装被调用方法的相关信息,这些信息需要进行编码。确定传输数据的数据结构。
2.序列化
确定了rpc请求消息内容要进行发送还需要为rpc框架选择一套可靠地序列化反序列化方案。目前序列化方案众多,我们要从rpc框架的需求出发选择合适的方案。序列化方案会对rpc的调用性能造成较大的影响我们一般将以下几点作为参考进行选择:
下面我们介绍几种常见的开源rpc方案:
1.gRPC
grpc是Google发布的开源RPC框架,使用HTTP/2协议并用ProtoBuf作为序列化工具。并且提供多种语言的客户端拥有非常丰富而实用的特性。
2.Dubbo/Dubbox
dubbo是阿里开源的RPC框架,和Spring框架结合使用很方便。该框架资料丰富使用广泛。dubbo曾经停止维护了一段时间,不过目前貌似又重启了孵化项目。
当当在dubbo的基础上经过自己的改进又实现了dubbox框架并且是实现了对REST的支持。
3.Spring Cloud
Spring Cloud 基于Spring Boot发展了一套rpc调用框架,但是不单单局限于rpc调用,它还具有配置管理,服务发现,断路器,智能路由,微代理,控制总线等相关功能,具有一整套的解决方案。Spring Cloud 整合了很多业界成熟的解决方案,例如Netflix、Kafka、Eureka、Zookeeper等可以根据自己项目需求进行自由选择
1.开源方案的不足:
gRPC和Dubbo的性能和效率不错,但是这两个RPC框架缺乏对于大型项目的配套解决方案,很多功能可能需要自行开发或者使用第三方的插件支持。
Spring Cloud虽然解决方案较为完善,但是并不能很好地支撑公司项目在注册、发现,动态和可视化配置,限流熔断,链路追踪、分析,异步调用,数据一致性处理,API网关等方面的需求。
这些开源框架的缺点导致其不能完美的覆盖用友云面向企业级应用时所产生的独特需求,因此我们决定自研一款rpc解决方案来解决这些问题,最终产品就是用友云rpc调用框架iris
2.用友云rpc调用框架iris方案的几个特点:
1)可插拔的序列化机制:用友RPC远程调用框架iris在序列化方面采用了可插拔的实现方式,并且预置了两种序列化方案:json序列化、hessian序列化。
iris框架通过序列化器可插拔的方式加载不同的序列化实现,在rpc调用过程中按照不同的需求使用不同的序列化实现将原始对象序列化为可传输数据。在iris框架中普通的rpc调用时通过hessian序列化的,而当面临一些特殊的需求时,例如远程调用传递的参数或返回值在服务方并没有对应的实现类,这时就可以通过json序列化完成调用,而不必因为hessian序列化的特性导致无法发送rpc调用请求。
2)丰富的对象类型:在通用性方面iris框架能够支持简单对象、复杂对象、数组、集合、泛型等多种参数和返回值类型,充分满足业务方对调用接口的各种需求。同时因为支持类型广泛,对老旧项目升级也更流畅,原始的接口不用花费太大代价就能改造成微服务。
3)独特的服务注册和服务发现机制,这套机制主要由服务注册中心、服务元数据、iris服务发现机制组成。
标签:字节流 规则 通讯框架 改进 请求 并且 为什么 不用 代理
原文地址:http://blog.51cto.com/14084875/2326311