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

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

时间2025-09-18 09:47:47分类IT科技浏览4859
导读: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
我们的征途综艺免费播放(我们的征途是星辰大海#) 后端开发需要学什么基础(【Node.js+koa–后端管理系统】设计动态发布、修改、查询、删除接口)