这里讨论的web service是供其他应用程序调用的API。这一部分只是谈到用最原始,最简单的方式来实现相关的需求,返回的结果提供xml和json两种格式。如果你是web service高手,请绕行。我们从最简单的方式着手讨论web service,后续的文章才会讨论SOAP,WSDL,RESTFUL相关的内容。
为什么需要web service?
互联网高速发达的今天,企业开发的应用和工具无法满足所有用户的需求,通过开放web service的方式开放API后,用户可以通过相关的服务制作满足特定需求的网站或者工具来满足不同用户的需求。成功的案例很多,flickr,twitter,facebook等厂商从中广泛受益。
为什么使用servlet?因为它够用了;为什么使用jetty,因为他轻量,和spring结合起来用非常方便启动服务和调试;为什么使用spring?我只能说:狗日的Spring,你的功能太棒了!
整体架构
具体实现
1:简单的用户鉴权和系统参数鉴权。
参数中包括2个字段:session,seckret_key。session代表用户的独有请求ID,seckret_key是约定的特定字段加密后的信息,例如给定用户一个“111”的字符串MD5加密后的字符串。在用户鉴权的时候,两个都正确,才能通过,然后访问业务系统。
有人会问:为什么不是Oauth协议的方式来搞定呢?我只能说,我们还没有那么大的业务需求。后面再讨论。
在系统中,action对应的name是固定的,所以用户传入错误的ation name的时候需要直接返回。
2:访问代理。
根据传入的Action的名称来访问相关的类获取结果,显然需要用策略模式来实现。我需要知道在spring的bean中有哪些action,把这些action在系统启动的时候存到一个对象中,供我们后续调用,很明显,需要实现Spring的ApplicationContextAware接口来搞定。
定义的接口是:
public interface Action{
public ResultDomain execute();
}
WebApplicationContext的实现:
private Map
public void setApplicationContext(ApplicationContext context)
throws BeansException {
Map map = context.getBeansOfType(Action.class);
if(CollectionUtils.isEmpty(map)){
return;
}
Set
Iterator
Map.Entry
while(it.hasNext()){
entry=it.next();
executeActionMap.put(entry.getKey(), entry.getValue());
}
}
public ExecuteAction getExecuteAction(String name) {
return executeActionMap.get(name);
}
ActionPorxy的实现。
public ResultDomain proxy() {
HttpServletRequest request = ServletActionContext.getRequest();
String action = request.getParameter("action");
Action action = webApplicationContext.getExecuteAction(action);
ResultDomain result = action.execute();
return result;
}
//some get set method
最后通过ActionPorxy就可以直接得到希望得到的对象来后续处理了。
3:返回结果
在servlet的doService的方法中,调用返回结果的类,然后根据用户需要的格式返回xml或者json数据。result的访问也采用了策略模式,根据用户选择返回结果的格式来访问具体的类。
使用到的json包是:jsonlib; 使用到的xml转换:xStream。
jetty的相关配置。
就不说怎么配置spring的bean了。下面配置都需要在
a:)http或者ajp的配置
b:)filter的配置
需要在org.mortbay.jetty.servlet.ServletHandler中配置filters的属性
c:)servlet的配置,和log配置请参考前面一篇文章《Spring的同集群内的远程调用的3种方法》
其他配置不懂的地方可以去参考以下jetty的源码,熟悉spring很容易弄的。
这样只是做了个简单的实现,如果放到现网跑肯定会出现各种各样到问题(逐步深入),下一步就讨论到一些业务的分离和系统部署,来逐步提高性能。