微服务治理平台的RPC方案实现

导读:本文主要探讨了rpc框架在微服务化中所处的位置,须要解决的问题。同时介绍了用友云微服务治理平台的rpc解决方案,为何选择该方案、该方案提供的好处是什么。同时也会介绍用友RPC框架的基本结构以及在实现时所用到的一些关键技术。但愿经过本文读者可以一窥用友rpc框架的原理,并藉此开发出更优秀的微服务应用。
1、rpc在微服务中的重要性
  随着愈来愈多的公司向着互联网方向转型,服务化这个概念已经深刻人心。而rpc框架无疑是微服务中的重要一环。rpc框架的基本功能是将远程调用模拟成本地调用。调用本地函数很简单,传入参数执行逻辑得到返回值就能够了。可是实现一个远程调用就要考虑的多一些:
clipboard.png
  如图所示,调用和服务双方就不得不考虑在调用过程当中产生的一些序列化、服务寻址、超时、异步、上下文管理等非业务问题,这些问题并非开发者的核心问题,可是繁杂远程调用实现却为开发者带来了巨大的工做量,这就为业务开发团队带来了一个不小的困扰。所以使用一个统一的rpc框架在应用微服务化进程中是至关重要的。
  此外rpc框架还可以实现公司不一样团队开发的异构应用提供互相调用的需求,经过统一的rpc调用框架java、go、python等语言开发的应用能够互相使用已存在的服务接口,解放了团队技术栈的限制、实现了各类服务实现上的解耦。
clipboard.png
  rpc调用框架是微服务化的必要条件,rpc框架的性能、功能、特性直接决定了微服务项目最终的表现。总而言之,搞微服务先要搞定RPC框架才行。
2、rpc过程当中须要解决的4个问题
clipboard.png
  一个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的调用性能形成较大的影响咱们通常将如下几点做为参考进行选择:前端

  • 通用性,主要指序列化框架对各类不一样对象序列化的能力,例如序列化方案是否能支持较复杂的类型、数组、泛型等。序列化框架的通用性越好对用户编写业务结构的限制就越小。
  • 性能,性能是选择序列化方案的重要指标,一个工程可能不少功能模块都要调用微服务,有些微服务调用可能很频繁,每次微服务调用都会进行序列化和反序列化,若是选择的序列化方案效率低下会极大地影响整个系统的效率
  • 扩展能力,序列化方案还要考虑可扩展性,在开发过程当中一套序列化方案可能并不可以支持全部的需求,这就要求序列化方案具有必定的扩展能力。经过扩展接口可以处理特殊需求的

  3.网络通讯问题
  消息序列化以后就是网络通讯了,nio、netty等、http通信框架均可以进行网络通信,这方面能够根据具体需求来进行选择。
  4.服务发现java

微服务上线后,提供服务的地址多是动态变化的。当服务地址产生变化时有可能不是一个实例而是多个实例进行变化。这时调用端的调用地址必然是须要做出改变的。为了知足这一需求rpc框架必须可以自动的发现提供服务的地址变化并实时更改,这样就须要一个服务注册和服务发现的框架。市面上流行的rpc框架例如dubbo使用的zookeeper,springcloud使用的是eureka.这些框架都各有各的优点和缺点。

3、常见的3种开源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等能够根据本身项目需求进行自由选择
4、用友云rpc方案
  1.开源方案的不足:
  gRPC和Dubbo的性能和效率不错,可是这两个RPC框架缺少对于大型项目的配套解决方案,不少功能可能须要自行开发或者使用第三方的插件支持。
  Spring Cloud虽然解决方案较为完善,可是并不能很好地支撑公司项目在注册、发现,动态和可视化配置,限流熔断,链路追踪、分析,异步调用,数据一致性处理,API网关等方面的需求。
  这些开源框架的缺点致使其不能完美的覆盖用友云面向企业级应用时所产生的独特需求,所以咱们决定自研一款rpc解决方案来解决这些问题,最终产品就是用友云rpc调用框架iris
  2.用友云rpc调用框架iris方案的几个特色:
  1)可插拔的序列化机制:用友RPC远程调用框架iris在序列化方面采用了可插拔的实现方式,而且预置了两种序列化方案:json序列化、hessian序列化。
clipboard.png
  iris框架经过序列化器可插拔的方式加载不一样的序列化实现,在rpc调用过程当中按照不一样的需求使用不一样的序列化实现将原始对象序列化为可传输数据。在iris框架中普通的rpc调用时经过hessian序列化的,而当面临一些特殊的需求时,例如远程调用传递的参数或返回值在服务方并无对应的实现类,这时就能够经过json序列化完成调用,而没必要由于hessian序列化的特性致使没法发送rpc调用请求。
  2)丰富的对象类型:在通用性方面iris框架可以支持简单对象、复杂对象、数组、集合、泛型等多种参数和返回值类型,充分知足业务方对调用接口的各类需求。同时由于支持类型普遍,对老旧项目升级也更流畅,原始的接口不用花费太大代价就能改形成微服务。
  3)独特的服务注册和服务发现机制,这套机制主要由服务注册中心、服务元数据、iris服务发现机制组成。
服务注册中心脱胎于eureka,并经过增长权限校验机制有机的和用友云的用户系统结合在一块儿。注册中心经过http协议完成微服务注册和微服务信息下发,所以可以穿透多层网络、nginx代理等,可以较好的适应复杂网络环境。此外注册中心还负责维护微服提供者的实时状态,及时剔除死亡实例
元数据则是存储于用友云平台中的RPC远程调用接口的描述信息,经过元数据用友云平台可以方便的收集微服务api信息,而且为后面的可视化管理以及数据分析打好基础。
iris服务发现机制可以从微服务注册中心得到被调用微服务的访问地址,而且在存在多个服务实例时优先选择较近网络环境的实例。
  4)精准的异常处理机制:远程异常处理机制是iris框架在远程实现发生异常时,调用端可以快速追踪问题的保证。
clipboard.png
  这套机制把异常分为三种类型:声明异常、未声明异常、框架异常。而且将远程异常按照必定的规则序列化后传输到调用端,最终将异常在调用端抛出。使得rpc框架的异常可以像本地异常同样进行处理。此外对异常进行分类处理使得调用者可以清晰的分别异常是本身调用的代码错误、框架错误、仍是远程实现发生了错误。藉此可以快速的分析定位问题,节省开发人员的时间和精力。
  5)能力扩展机制,能力扩展机制是iris框架为框架自己的功能开发预留的扩展接口,同时这套接口也可以提供给第三发开发者实现本身的逻辑。
clipboard.png
  上图是iris框架中一套基本的rpc调用链条,在这条链条中的几个关键节点参数封装、序列化、数据接收、寻找实现类、执行实现等咱们都预留了扩展点,经过这些扩展点咱们能够根据需求将功能逻辑做为插件插入到执行流程
  6)扩展用户机制与安全校验
  iris框架是用友云平台针对企业级微服务化开发的基础的RPC框架,只有一套RPC框架是不可以称之为微服务的。经过能力扩展机制iris框架引入了丰富的微服务核心功能。目前这套机制支撑了服务限流、异步编程、配置中心、链路追踪、一致性框架等平台功能,经过扩展机制用户能够简单的加载特定的依赖模块,无侵入的选用用友云平台的微服务扩展功能。
clipboard.png
  iris安全校验融合了用友云平台的权限校验机制,使得用户可以经过用友云平台的权限机制来管理微服务api.只有经过安全校验的微服务才可以注册到相应的开发者名下,同时开发者能够经过前端可视化界面决定微服务api的私有、公有、调用权限、管理权限。
clipboard.png
  3.方案总结:
  iris框架是用友云平台针对企业级微服务开发推出的RPC调用框架,做为整个用友微服务解决方案的组成部分,该框架为平台提供了稳定高效的远程调用解决方案,并在这套方案的基础上提供了搭建其余微服务核心功能的骨架。同时iris框架也充分考虑到了用户易用性等需求使用iceberg依赖封装、isolate内部类隔离等机制打造了一套低侵入的代码引入方案,方便工程的改造和升级。
  截至目前为止iris框架已经历经了屡次迭代和升级,而且支撑了用友云平台大量应用的开发,在严峻的功能和性能的需求中获得了产品质量的验证。python

相关文章
相关标签/搜索