1、要实现的功能
书接上回,本回书我们要完成开放接口平台核心引擎的多Handler支持机制。
如图1所示。
图1 开放接口服务器端架构
2、Filter还是装饰模式
装饰者模式貌似是一个实现的候选,类似Java的I/O实现。
多“装饰”一层,就获得了新的功能,原来的功能还在。
对我现在的应用场景来说,这种实现方式过于复杂了。
相对而言,Filter更简洁。
当前的应用场景对性能是有极高要求的,不适合使用哪怕稍微复杂的模式。
3、Handler接口定义
我的Handler接口定义如下。
public interface Handler {
public void inWay(HttpServletRequest request,HttpServletResponse response);
public void outWay(HttpServletRequest request,HttpServletResponse response);
}
更有节操的童鞋会自己定义Request、Response0,甚至Context对象。以便脱离Web容器的限制,进一步实现自己的底层通信协议。
我这里先偷个懒,等有时间了慢慢来。
Handler接口中,inWay方法对应图1左侧的向下箭头,outWay对应右侧的向上箭头。
这样,在同一个Handler定义进、出的逻辑。
对于实现序列化功能的Handler,inWay中实现反序列化,outWay中实现序列化。
对于实现加密功能的Handler,inWay中实现解密,outWay中实现加密。
对于实现压缩功能的Handler,inWay中实现解压缩的逻辑,outWay中实现压缩的逻辑。
这样,当不需要某个Handler的时候,直接去掉就好了。
当然,outWay中可以do nothing。
另外,非常重要的,Handler实现类不可以有自己的属性。Handler实例不能有“状态”。
我们需要Handler是线程安全的。
3、可配置
多个Handler是可配置的,每个Handler链可以服务于一个或多个接口。
在Handler无状态、线程安全的基础上,我们可以采用在每个JVM中Handler单例的方式,避免频繁创建、回收Handler对象的损失。
配置信息可以保存在properties文件中,可以保存在xml中,可以保存在数据中,范例如下:
openapi.handler.keys=surface,encrypt,auth
openapi.handler.surface=cn.hailong.common.openapi.handler.SurfaceHandler
openapi.handler.encrypt=cn.hailong.common.openapi.handler.EncryptHandler
openapi.handler.auth=cn.hailong.common.openapi.handler.AuthHandler
配置系统中可能用到的所有Handler,并在系统启动时加载。
在上面的配置中,配置了每个Handler的类名,加载的时候