中间件实现粗粒度远程方法接口的思想
Data Transfer Object(数据传输对象),简称DTO。
在分布式系统中,客户端和服务器端交互有两种情形:第一个是客户端从服务器端读取数据;第二个是客户端将本身的数据传递给服务器端。
一个数据传输对象 (DTO),用该对象包含远程调用所需要的所有数据。
应用程序可以分别对 DTO 发出一系列单独的过程调用,而不会引发远程调用开销。
减少远程调用次数。通过在单个远程调用中传输更多的数据。
应用程序减少远程调用次数, 提高了性能。
远程调用可以使应用程序的运行速度大大降低。减少调用次数是提高性能的最佳方法之一。
在单个调用中来回传递更多的数据,还可以更有效地将远程应用程序的内部情况隐藏在粗粒度接口的背后。这就是使用远程门面模式的主要原因
定义 DTO 有助于发现有意义的业务对象。在创建用作 DTO 的自定义类时,您通常会注意到作为一组凝聚性信息而显示给用户或另一个系统的元素分组。通常,这些分组用作描述应用程序所处理的业务域的对象的有用原型。
可测试性。将所有参数封装到可序列化对象中可以提高可测试性。
将来自多个源的数据聚合到服务器上的单个 DTO 中。
以上理论,是咏南中间件定义远程方法接口的基础。
咏南中间件DTO对象可以传输的对象包括:字符、整型、浮点、时间、行列数据集、图片、文件。
从上图可以看出,咏南中间件的远程方法是“粗接口”设计。只需要二个接口(一个二进制,一个JSON),就可以。
这就是粗接口的好处,并不需要定义许多的远程接口。
以上这一切的核心,基于封装良好的数据序列、还原对象。咏南中间件分别使用msgpack和ynserial俩种数据序列、还原对象。
可能有人要问,datasnap可以定义粗粒度接口吗?当然可以。
procedure TForm1.Qrys(accountno, sql, sql2: string; DataSet, DataSet2: TClientDataSet); // TClientDataSet主从表查询 var url: SockString; i: integer; serial: TynSerial; begin serial := TynSerial.Create; try url := 'querys2'; serial.WriteString('accountno', accountno); // 帐套号 一次序列所有的参数 serial.WriteString('sql', sql); // 查询SQL serial.WriteString('sql2', sql2); i := FHttp.Post(url, serial.Text, FDataType); // http post if i = 200 then begin serial.Text := FHttp.Content; serial.ReadClientDataSet('dataset', DataSet); // 一次接收所有中间件返回的数据 serial.ReadClientDataSet('dataset2', DataSet2); end else ShowMessage(IntToStr(i) + ' error'); finally serial.Free; end; end;