Browser Caching for GWT RPC Response

最近在学习Web System中的Caching技术,其中一种常见的是browser cache,对HTTP GET response应用cache,并通过某些HTTP Header字段控制cache policy。然而,我们web server是基于GWT开发,GWT有自己的一套RPC系统,利用HTTP POST实现client和server之间的异步通讯。这时候问题就来了,用户每一次点击将会触发若干GWT RPC,但browser不会cache HTTP POST response,导致每次点击都要等待后台处理。由于系统中大部分RPC是只读,如果能把browser cache利用起来,不仅可以改善用户体验,而且能减低后台的负载。


那么,很直接的想法是,能否将GWT RPC的POST方式改成GET。这种转换的一个前提是,对于很多的只读RPC,输入参数一般很简单,比如getRequest(int reqId),输入参数就是一个int,完全可以用REST方式将方法名和参数值嵌入URL,这样就能够通过GET发送RPC请求了。


想法成形了,但是如何修改GWT RPC内部机制呢?幸运的是,GWT提供在client和server端都提供了一些API,允许外部系统与RPC进行整合。下面从client和server两个方面来总结如何实现。


Client-side

通过ServiceDefTarget接口,可以设置custom RpcRequestBuilder,实现GET方式的RequestBuilder,并将方法名和参数值嵌入URL,代码段如下:



Server-side

需要实现一个Servlet来接受GET请求。参考如下doGet实现,一部分是从URL中取出方法名和参数值,然后调用真正的RPC方法,另一部分是集成GWT RPC系统。最重要的部分是调用RPC和RPCServletUtils的一些API,将方法返回值encode和serialize成GWT RPC定义的格式,并写入HttpServletResponse。


HTTP GET方式的RPC框架搭好后,需要应用servlet filter设置response HTTP Header的参数来通知browser使用cache并且告诉它cache policy。GWT server library是一个提供GWT和Spring整合的开源库,它提供了一个ResponseHeaderFilter,可以满足需求。最后,在web.xml中定义如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用: Caching allocator 是一种对象缓存内核内存分配器。它的作用是在内核中分配和管理内存,以提高内存分配的效率和性能。引用: slab cache 是一种针对每个CPU分配一个本地缓存的数据结构,也可以称为本地缓存。它的目的是减少对全局内存分配器的竞争,从而提高内存分配和释放的速度。引用: 在文章目录中可以看到关于智能 Allocator 和 bitmap_allocator 的内容,这些都是与内存分配相关的不同实现方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [The Slab Allocator An Object-Caching Kernel Memory Allocator](https://download.csdn.net/download/redkowl/10275414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Linux内存管理(二十五):slab 分配器概述](https://blog.csdn.net/jingerppp/article/details/127749743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [GNU C++ Allocator分类总结与归纳](https://blog.csdn.net/yueguangmuyu/article/details/115831216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值