首页IT科技rpc原理详解(《RPC实战与核心原理》学习笔记Day13)

rpc原理详解(《RPC实战与核心原理》学习笔记Day13)

时间2025-06-20 14:24:14分类IT科技浏览3888
导读:17 | 异步RPC:压榨单机吞吐量 在我们知道RPC框架基础知识后,我们需要从RPC框架整体性能去考虑问题,例如怎么提升RPC框架的性能、稳定性、安全性、吞吐量,以及如何在分布式的场景下快速定位问题等。...

17 | 异步RPC:压榨单机吞吐量

在我们知道RPC框架基础知识后            ,我们需要从RPC框架整体性能去考虑问题                  ,例如怎么提升RPC框架的性能            、稳定性                  、安全性     、吞吐量     ,以及如何在分布式的场景下快速定位问题等            。

影响RPC调用吞吐量的根本原因是什么?

处理RPC请求比较耗时      ,并且CPU大部分时间都在等待而非去计算                  ,从而导致CPU利用率不高                  。RPC请求的耗时大部分是业务耗时           ,比如业务逻辑中有访问数据库执行慢SQL的操作      ,所以我们要看怎么能提升业务逻辑处理     。

要提升吞吐量                  ,关键就两个字:异步      。

服务调用端怎么异步? 对于调用端来说           ,向服务端发送请求消息与接受服务端发送过来的响应消息,这两个处理过程是两个完全独立的过程                  ,这两个过程甚至在大多数情况下都不在一个线程中进行                 ,也就是说,对于RPC框架            ,无论是同步调用还是异步调用                 ,调用端的内部实现都是异步的                  。

调用端发送的每条信息都有一个唯一的消息标识     ,实际上调用端想服务端发送请求消息之前会创建一个Future            ,并会存储这个消息标识与这个Future的映射                  ,动态代理所获得的返回值最终就是从这个Future中获取的     ,当收到服务端响应的消息时      ,调用端会根据响应消息的唯一标识                  ,通过之前存储的映射找到对应的Future           ,将结果注入给那个Future      ,再进行一系列的处理逻辑                  ,最后动态代理从Future中得到正确的返回值           。

所谓同步调用           ,是指RPC框架在调用端的处理逻辑中主动执行了Future.get()方法,让动态代理等待返回值                  ,而异步调用则是RPC框架没有主动执行这个方法                 ,用户可以从请求上下文中得到这个Future,自己决定什么时候执行Future.get()方法      。

Future模式的示意图如下                  。

服务提供方如何支持业务逻辑异步? 我们可以让RPC框架支持CompletableFuture            ,实现RPC调用在调用方和提供方之间完全异步           。

CompletableFuture是Java 8原生支持的。如果RPC框架能够支持CompletableFuture                 ,那发布一个RPC服务     ,服务接口定义的返回值是CompletableFuture对象            ,整个调用过程会分为以下几步:

服务调用方发起RPC请求                  ,直接拿到返回值CompletableFuture对象     ,之后就不需要任何额外的与RPC框架相关的操作了      ,直接就可以进行异步处理                  。 在服务提供方业务逻辑中创建一个返回值CompletableFuture对象                  ,之后服务端真正的业务逻辑完全可以在一个线程池中异步处理           ,业务逻辑完成之后再调用这个CompletableFuture对象的complete方法      ,完成异步通知                 。 服务调用方在收到服务提供方发送过来的响应之后                  ,RPC框架再自动地调用服务调用方拿到的那个 返回值CompletableFuture对象的complete方法           ,这样一次异步调用就完成了。

RPC远程方法调用,有以下几种方式:

sync                  ,默认方式                 ,这是在“方法            ”内部同步,但RPC框架还是异步处理的            。 future            ,RPC消费者得到future                 ,自行决定何时获取返回结果                 。 callback     ,RPC调用端不需要同步处理响应结果            ,可以直接返回                  ,最后返回结果将会在回调线程中异步处理     。 oneway     ,调用端发起请求后不需要接收响应            。

18 | 安全体系:如何建立可靠的安全体系?

RPC一般用于解决内部应用之间的通信      ,这里的“内部                  ”是指应用都部署在同一个大局域网中                  ,这样在RPC中           ,我们很少考虑像数据包篡改      、请求伪造等恶意行为                  。

我们主要关注两种类型的安全场景:

调用方之间的安全保证     。 服务发现中的安全保证      。

我们可以引入一个授权平台      ,来对调用方的身份进行验证                  ,调用方可以在授权平台上申请自己应用里面需要调用的接口           ,而服务方可以在授权平台上进行审批,只有服务提供方审批后                  ,调用方才能够调用                  。

上面的设计方案                 ,授权平台承担了公司内所有RPC请求的次数总和,当RPC请求量达到一定水平            ,授权平台会成为一个瓶颈点           。

为了解决这个问题                 ,我们可以将授权平台所做的事情转移到服务提供方      。我们使用一种不可逆加密算法     ,例如HMAC算法                  。服务提供方应用里面放一个用于HMAC签名的私钥            ,在授权平台上用这个私钥为申请调用的调用方应用进行签名                  ,这个签名生成的串就变成了调用方唯一的身份           。服务提供方在收到调用方的授权请求之后     ,我们只需要验证这个签名更调用方应用信息是否对应的上就可以了。

服务提供方可以提供的安全校验方式:

md5摘要校验 非对称加密算法 OAuth2授权

为了避免同一个接口有多个应用做发布提供者      ,我们需要把接口跟应用绑定上                  ,一个接口只允许有一个应用发布提供者           ,避免其他应用也能发布这个接口                  。

当注册中心收到服务提供方注册申请时      ,可以验证下请求过来的应用是否跟接口绑定的应用一样                  ,只有相同才允许注册           ,否则就返回错误信息给启动的应用,从而避免假冒的服务提供者对外提供错误服务                 。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
提高网站(如何提升网站知名度)