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

author author     2023-01-30     527

关键词:

导读:本文主要探讨了rpc框架在微服务化中所处的位置,需要解决的问题。同时介绍了用友云微服务治理平台的rpc解决方案,为什么选择该方案、该方案提供的好处是什么。同时也会介绍用友RPC框架的基本结构以及在实现时所用到的一些关键技术。希望通过本文读者能够一窥用友rpc框架的原理,并藉此开发出更优秀的微服务应用。

一、rpc在微服务中的重要性

  随着越来越多的公司向着互联网方向转型,服务化这个概念已经深入人心。而rpc框架无疑是微服务中的重要一环。rpc框架的基本功能是将远程调用模拟成本地调用。调用本地函数很简单,传入参数执行逻辑获得返回值就可以了。但是实现一个远程调用就要考虑的多一些:
技术分享图片
  如图所示,调用和服务双方就不得不考虑在调用过程中产生的一些序列化、服务寻址、超时、异步、上下文管理等非业务问题,这些问题并不是开发者的核心问题,但是繁杂远程调用实现却为开发者带来了巨大的工作量,这就为业务开发团队带来了一个不小的困扰。因此使用一个统一的rpc框架在应用微服务化进程中是相当重要的。
  此外rpc框架还能够实现公司不同团队开发的异构应用提供互相调用的需求,通过统一的rpc调用框架java、go、python等语言开发的应用可以互相使用已存在的服务接口,解放了团队技术栈的限制、实现了各种服务实现上的解耦。
技术分享图片
  rpc调用框架是微服务化的必要条件,rpc框架的性能、功能、特性直接决定了微服务项目最终的表现。总而言之,搞微服务先要搞定RPC框架才行。

二、rpc过程中需要解决的4个问题

技术分享图片
  一个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.服务发现
    微服务上线后,提供服务的地址可能是动态变化的。当服务地址产生变化时有可能不是一个实例而是多个实例进行变化。这时调用端的调用地址必然是需要作出改变的。为了满足这一需求rpc框架必须能够自动的发现提供服务的地址变化并实时更改,这样就需要一个服务注册和服务发现的框架。市面上流行的rpc框架例如dubbo使用的zookeeper,springcloud使用的是eureka.这些框架都各有各的优势和缺点。

    三、常见的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等可以根据自己项目需求进行自由选择

    四、用友云rpc方案

      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服务发现机制组成。

  • 服务注册中心脱胎于eureka,并通过增加权限校验机制有机的和用友云的用户系统结合在一起。注册中心通过http协议完成微服务注册和微服务信息下发,因此能够穿透多层网络、nginx代理等,能够较好的适应复杂网络环境。此外注册中心还负责维护微服提供者的实时状态,及时剔除死亡实例
  • 元数据则是存储于用友云平台中的RPC远程调用接口的描述信息,通过元数据用友云平台能够方便的收集微服务api信息,并且为后面的可视化管理以及数据分析打好基础。
  • iris服务发现机制能够从微服务注册中心获得被调用微服务的访问地址,并且在存在多个服务实例时优先选择较近网络环境的实例。
      4)精准的异常处理机制:远程异常处理机制是iris框架在远程实现发生异常时,调用端能够快速追踪问题的保证。
    技术分享图片
      这套机制把异常分为三种类型:声明异常、未声明异常、框架异常。并且将远程异常按照一定的规则序列化后传输到调用端,最终将异常在调用端抛出。使得rpc框架的异常能够像本地异常一样进行处理。此外对异常进行分类处理使得调用者能够清晰的分别异常是自己调用的代码错误、框架错误、还是远程实现发生了错误。藉此能够快速的分析定位问题,节省开发人员的时间和精力。
      5)能力扩展机制,能力扩展机制是iris框架为框架本身的功能开发预留的扩展接口,同时这套接口也能够提供给第三发开发者实现自己的逻辑。
    技术分享图片
      上图是iris框架中一套基本的rpc调用链条,在这条链条中的几个关键节点参数封装、序列化、数据接收、寻找实现类、执行实现等我们都预留了扩展点,通过这些扩展点我们可以根据需求将功能逻辑作为插件插入到执行流程中
      6)扩展用户机制与安全校验
      iris框架是用友云平台针对企业级微服务化开发的基础的RPC框架,只有一套RPC框架是不能够称之为微服务的。通过能力扩展机制iris框架引入了丰富的微服务核心功能。目前这套机制支撑了服务限流、异步编程、配置中心、链路追踪、一致性框架等平台功能,通过扩展机制用户可以简单的加载特定的依赖模块,无侵入的选用用友云平台的微服务扩展功能。
    技术分享图片
      iris安全校验融合了用友云平台的权限校验机制,使得用户能够通过用友云平台的权限机制来管理微服务api.只有通过安全校验的微服务才能够注册到相应的开发者名下,同时开发者可以通过前端可视化界面决定微服务api的私有、公有、调用权限、管理权限。
    技术分享图片
      3.方案总结:
      iris框架是用友云平台针对企业级微服务开发推出的RPC调用框架,作为整个用友微服务解决方案的组成部分,该框架为平台提供了稳定高效的远程调用解决方案,并在这套方案的基础上提供了搭建其他微服务核心功能的骨架。同时iris框架也充分考虑到了用户易用性等需求使用iceberg依赖封装、isolate内部类隔离等机制打造了一套低侵入的代码引入方案,方便工程的改造和升级。
      截至目前为止iris框架已经历经了多次迭代和升级,并且支撑了用友云平台大量应用的开发,在严峻的功能和性能的需求中得到了产品质量的验证。

用友云服务治理平台助力企业微服务架构落地

本文主要阐述使用微服务架构时,治理框架或者平台需要解决的主要问题,微服务落地实施过程中所遇到的关键问题和对应解决方案。同时,文章也介绍用友云旗下的微服务治理平台的核心功能和技术架构,以及微服务治理平台... 查看详情

常见的微服务架构方案

 背景:工业领域,服务可能涉及多种语言,C++,Java,C#,python最先考虑thrift,但thrift毕竟只是RPC框架,不包含服务治理的内容,且这个开源项目的维护状况并不算好,因此写个原型之后,仍然passZerocIce表现优异,基于RPC框架Ic... 查看详情

dubbomesh:从服务框架到统一服务控制平台

ApacheDubbo是一款RPC服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了Java、Golang等多语言SDK实现。使用Dubbo开发的微服务原生具备相互之间的远程地址发现与通信能力,利用Dubbo提供的丰富服务... 查看详情

腾讯正式对外开源高性能rpc开发框架与微服务平台tars

Tars是将腾讯内部使用的微服务架构TAF(TotalApplicationFramework)多年的实践成果总结而成的开源项目,目前已于4月10日正式对外开源。 作为支持多语言的高性能RPC开发框架和配套一体化的服务治理平台,Tars可以帮助企业或者用户... 查看详情

71nacos实现微服务的注册与发现

参考技术A1微服务架构服务治理的概念2,基于nacos实现服务注册与发现3,使用Rest模板实现RPC调用4,手写Rpc客户端负载均衡算法。SpringCloud与SpringCloudlibaba的区别SpringCloudrpc远程调用整合1,nacos分布式注册中心,分布式配置中心Spri... 查看详情

基于servicemesh服务网格的去中心化微服务管控治理平台

...先说明下我最近在思考的一个产品规划,即基于ServiceMesh服务网格思路,参考开源的Istio等实现架构来搭建一个完整的微服务治理管控平台。在前面文章里面我就提到了,在实施微服务架构后,由于微服务将传统的单体应用进行... 查看详情

微服务相关原理与治理(代码片段)

微服务架构没有公认的技术标准和规范或者草案,但业界已经有一些很有影响力的开源微服务架构框架提供了微服务的关键思路,例如Dubbo和SpringCloud。目前微服务实现方式主要有两种Dubbo和SpringCloud:一、Dubbo:(https://www.cnblogs.co... 查看详情

微服务架构下的服务治理:如何在springcloud框架中实现服务的注册与发现

服务治理RPC远程过程调用协议的核心设计思想:在于注册中心,因为注册中心:管理每个服务与服务之间的一个依赖关系服务治理:在传统的RPC远程过程调用协议中,管理每个服务与服务之间的依赖关系非常复杂.可以使用服务治理技术... 查看详情

布道微服务_19微服务治理平台的设计与落地

文章目录Pre微服务治理平台的基本功能定义&组成服务管理服务治理服务监控问题定位日志查询服务运维如何搭建微服务治理平台WebPortalAPI存储小结Pre体应用改造为微服务架构后,服务调用从本地调用变成了远程方法调用后,... 查看详情

布道微服务_19微服务治理平台的设计与落地

文章目录Pre微服务治理平台的基本功能定义&组成服务管理服务治理服务监控问题定位日志查询服务运维如何搭建微服务治理平台WebPortalAPI存储小结Pre体应用改造为微服务架构后,服务调用从本地调用变成了远程方法调用后,... 查看详情

常见的3种微服务治理方式

1、应用程序中包含微服务治理逻辑在微服务架构中,服务间不再是在朴素的进程内通信,取而代之的是通过轻量级的网络协议进行通信。那么,如何找到服务提供方?如何超时重试?当存在多个服务提供方时如何实现负载均衡... 查看详情

服务治理平台-注册中心

...多,持续部署困难,启动时间变慢等问题慢慢凸显时,微服务架构应运而生。微服务架构可以解决单体架构各种局限性问题。微服务架构:开发高可用企业应用,后端需要支持多种客户端形式,比如桌面端,移动端及其他微服务... 查看详情

公共平台服务治理与鉴权(代码片段)

问题解决问题鉴权注册管理总结聊一聊最近了解的公司服务治理平台,主要是思想,理念,而不是一种技术或框架。整个平台设计,融入了OAUTH2认证,融入了微服务思想,帮助公司各系统在复杂的IT架构下,实现一种便捷统一的... 查看详情

.netcore微服务之:基于consul实现服务治理

参考技术A本篇文章为.NETCore实现企业级微服务架构技术点介绍Consul是一个分布式,高可用、支持多数据中心的服务注册、发现、健康检查和配置共享的服务软件。由HashiCorp公司用Go语言开发推出的开源产品用于实现分布式系统的... 查看详情

dubbo-admin正式支持3.0服务治理(代码片段)

简介:Dubbo相信大家并不陌生,是一款微服务开发框架,它提供了RPC通信与微服务治理两大关键能力。大家在日常开发中更多使用的是Dubbo提供的RPC通信这一部分能力,而对其提供的服务治理的能力使用相对少一些... 查看详情

rpc协议及实现方式(分布式微服务治理的核心)

参考技术A分布式微服务治理的核心在于:微服务和分布式RemoteProcedureCall,翻译过来应该是“远程程序调用”,目前业内通用的翻译是“远程过程调用”,但是“过程”这个词很容易造成误解,翻译成“程序”更好理解RPC的意义。... 查看详情

微服务治理之dubbo基础认识(代码片段)

...上的。和传统的单体架构相比,分布式多了一个远程服务之间的通信,不管是soa还是微服务,他们本质上都是对于业务服务的提炼和复用。那么远程服务之间的调用才是实现分布式的关键因素。而在远程通信这个领域... 查看详情

微服务架构引入的问题及解决方案

微服务间如何通讯?从通讯模式角度考虑一对一还是一对多?一对一同步:请求响应模式,最常见异步:通知/请求异步响应一对多异步:发布订阅/发布异步响应从通讯协议角度考虑RESTAPIRPCMQ如何选择RPC框架I/O、线程调度模型序... 查看详情