TARS 中提供了一套高性能 RPC 通信框架,实现了服务间的高效通信。RPC 作为微服务的核心技术,支撑着移动互联网时代下不断增长的用户和海量的请求。为了满足更多的需求,TARS 支持了同步、异步等多种调用方式。本文将会详细阐述 TARS 中的几种远程调用方式。
RPC 简介
TARS 服务寻址方式
TARS 远程调用方式
-
- 同步调用
- 异步调用
- 单向调用
-
- 同步调用:发起调用后,等待调用返回结果,再继续执行后续逻辑;
- 异步调用:发起调用后,立刻执行后续逻辑,通过回调函数处理返回结果;
- 单向调用:只发起调用,不关心返回结果或被调服务是否接收;
- Hash 调用:同一用户的多次调用都请求同一服务器的服务。
接口直接将传入的字符串返回,实现如下:
关于服务的具体开发和部署流程,请参阅官方文档,这里不再赘述。
同步调用
同步调用是最常见的调用,也是最简单的调用。顾名思义,就是发起调用后,等待返回结果,能够满足大多数情况下的需求。 下面是一个客户端同步调用服务接口 testHello 的例子。调用过程和函数调用类似,通过服务通信代理对象 prx 调用服务的接口 testHello ,获取返回值。编译执行这个例子,结果如下:
异步调用
同步调用很简单很常见,但并不能适应所有场景。但遇到调用的接口耗时比较长,或是接口返回结果对后续逻辑没有影响等情况时,使用同步调用会阻塞后续过程,影响应用性能,我们可以选择异步调用。 发起异步调用后,程序会立刻执行后续逻辑,而不关心调用的返回结果。异步调用后,一般会在调用结果返回后,通过注册回调函数对它处理。TarsCpp中,回调对象包含两个回调函数,分别处理调用成功和调用失败的逻辑。接口 testHello 回调对象的定义如下:单向调用
顾名思义,单向调用就是单方面发起调用,只管发送数据,完全不关心调用返回结果。单向调用可以认为是不处理返回结果的异步调用的一种。 因此,单向调用的方式和异步调用的方式一样使用 async_testHello 即可,但不需要定义回调对象,传入 NULL 即可,如下:Hash调用
前面我们介绍过 TARS 的名字服务,是通过主控获取对应服务的多个地址列表。因此一个服务可以部署多台,请求也是随机分发到这些服务器上。但是在某些场合下,希望某些请求总是在某一台服务器上,对于这种情况 TARS 提供了简单的方式实现,即 Hash 调用。 假设我们传入的参数 Hello 为用户 ID,通过 Hash 调用,每次传入的 ID 值为 Hello 时,每次Hello用户请求时,调用到的都是同一台服务器。 本文hash 调用的例子直接在同步调用的基础上进行修改。只需要在调用前链式调用tars_hash
即可,修改的部分如下:
注意:这种方式是有一定风险的。如果后台某台服务器挂了,这些请求就会迁移到其他服务器。等到服务器恢复后,会再迁移回来。
tars_hash 参数必须是 int。对于 string 类型来说,可以像上述例子一样,使用 TARS 基础库(util目录下)中的 hash_new 方法,具体请参见 util/tc_hash_fun.h.
TARS基金会是Linux基金会下的非营利性、微服务基金会,致力于建设一个强大而灵活的微服务生态系统。无论你在哪个行业,无论你使用什么技术栈,这里能助你快速实现你的创意。
点“在看”让TARS小姐姐变好看
![ef15132daca305b63f093c971f016bbf.png](https://i-blog.csdnimg.cn/blog_migrate/b0d4fcf59e7f2a7c90b9ac5dad1ae643.png)