Push 功能说明
Tars 的 push 功能
目录
[1.环境和背景]
[2.push 模式的流程图]
[3.服务端功能的实现]
[4.客户端功能的实现]
[5.测试结果]
环境和背景
但是在实际的应用场景中,需要在 TARS 服务框架中支持其他服务端到客户端的 push 模式
具体程序示例,参见 examples/PushDemo/.
push 模式的流程图
下面是 push 模式的示意图

黑色线代表了数据流向:数据(客户端)-〉请求包的编码器(客户端)-〉协议解析器(服务端)-〉doRequest 协议处理器(服务端)-〉生成返回数据(服务端)-〉响应包的解码器(客户端)-〉响应数据(客户端)
黄色线代表客户端访问服务端
蓝色线代表服务端向客户端 push 消息
其中请求包的编码器(客户端)负责对客户端发送的数据进行打包编码,协议解析器(服务端)负责对收到的数据进行解包并交给*
协议处理器(服务端)去处理并生成返回数据,而响应包的解码器(客户端)负责对返回的数据进行解码。
Tars 中实现服务端到客户端的 push 模式:
对于服务端,首先服务端需要按照开发第三方协议的模式(即非 tars 协议),实现协议包的解析器,并将其加载到服务中,同时需要建立一个非 TARS 框架的服务对象,该类继续继承 TARS 框架的 Servant 类,通过重载 Servant 类中的 doRequest 方法建立客户端和服务端之间的协议处理器,同时在该方法中保存连接到服务端的客户信息,以便服务端向客户端 push 消息,另外需要重载 Servant 类中的 doClose 方法,在服务器得知客户关闭连接后,释放 doRequest 方法中保存的客户信息,这样就可以不需要对该客户进行 push 消息。另外,服务端需要建立一个专门用于向客户端 push 消息的线程。
对应客户端,首先要按照第三方协议的模式,实现协议包的编解码函数,并将其设置到相应的 ServantProxy 代理的协议解析器中,通过 ServantProxy 类 tars_set_protocol 方法实现;然后需要自定义一个回调类,该类继承 ServantProxyCallback 类,(因为服务端 push 消息给客户端时,客户端收到消息是异步的,所以客户端对消息的处理以异步方法进行),同时需要重载其中的 onDispatch 方法,在该方法中,对客户端和服务端之间定义的协议进行解析处理;最后需要 new 一个上面自定义的回调类,然后将其作为参数传入到 ServantProxy 的 tars_set_push_callback 方法中。另外,客户端需要定期的发送消息给服务端(相当于心跳包),以便告诉服务端,客户端是存活的(因为服务端在一定时间内没收到来自客户端的消息,会自动关闭其之间的连接)。 另外,在服务端与客户端 push 模式交互之前,客户端要访问服务,需要通过调用 ServantProxy 类的 rpc 相关函数。
服务端功能的实现
服务端实现概述
首先我们按照第三方协议代码部署一个 TestPushServant 服务 如下图所示在管理平台部署一个服务端

参考 tars 支持第三方协议
其中 TestPushServer 类的 initialize( ) 加载服务对象 TestPushServantImp,并设置第三方协议解析器 parse,这里解析器不做任何处理,把接收到的数据包原封不动的传给服务对象去处理(但通常情况下,要对数据进行解析后才交给服务对象去处理),
而 TestPushServantImp 重载继承自 Servant 类的 doRequest 方法,该方法为第三方服务的协议处理器,该处理器负责处理协议解析器传送给其的数据,并负责生成返回给客户端的 response(本服务为 echo 服务,因此直接让 response 等于收到的数据包),同时保存客户的信息状态,以便让 pushThread 线程对客户进行 push 消息;
另外 TestPushServantImp 重载继承自 Servant 类的 doClose 方法,用于客户关闭连接或者连接超时后清除保存相关的客户信息。
服务端代码实现
TestPushServantImp.h
TestPushServantImp.cpp
TestPushThread.h
TestPushThread.cpp
TestPushServer.h
TestPushServer.cpp
客户端实现
客户端实现概述
本节介绍客户端通过 proxy 的方式来访问服务端,具体步骤如下:
客户端首先建立通信器(Communicator _comm),并通过该通信器获取 proxy,代码格式如下:
编写 proxy 的请求包的编码器和响应包的解码器并设置,代码格式如下:
同步方法或者异步方法访问服务端
同步方法通过调用 proxy 的 rpc_call 方法访问服务
其中参数 requestId 需要在一个 object 内唯一,可以通过 proxy 的 uint32_t tars_gen_requestid()接口获得一个该 object 内唯一的 id。sFuncName 主要用于框架层对接口调用的统计分析,可以缺省为""。buff 为要发送的内容,len 为 buff 的长度。rsp 则为本次调用得到的 ResponsePacket 包。
异步方法通过调用 proxy 的 rpc_call_asyc 方法访问服务
其中参数 requestId 需要在一个 object 内唯一,可以通过 proxy 的 uint32_t tars_gen_requestid()接口获得一个该 object 内唯一的 id。sFuncName 为回调对象响应后调用的函数名。buff 为要发送的内容,len 为 buff 的长度。callback 则为本次调用返回结果后,即服务端返回处理结果后,此回调对象会被响应。
设置接受服务端的 push 消息方法:
客户端具体实现
main.cpp
TestRecvThread.h
TestRecvThread.cpp
客户端测试结果
如果 push 成功,结果如下

Last updated
Was this helpful?