接口要求:
1、对外提供一个服务
2、可扩展
3、安全性
1、对外提供一个服务
以前的webservice方式是针对不同的功能提供不同的url。比如以下2个市场经营提供的接口:
1)A系统查询待办数量接口
http://ip:port/services/ServiceForMOA
2)A系统创建工单接口
http://ip:port/services/BusinessInterfaceService
咱们现在的系统比较大,如果说针对不同的功能,都创建一个接口,那么试想我得维护多少接口文档,接口文档内容越多,就越难维护越容易出错。
那么要实现统一的对外服务接口,比如只有一个url
http://ip:port/zjmarket/BOMCJK
同时,客户端能获取调用到不同功能的方法,那么我们想到的解决办法就是通过参数告诉我,需要调用哪个方法,在代码实现上可以是通过反射,也可以是通过工厂模式。
2、可扩展可维护
其实上面第一点要求提供对外提供一个服务,就要求了接口的可扩展性。
可扩展性的定义是,客户有了一个新的功能要求,那么我不需要修改以前的代码,可以很好的发布一个接口。
可以发现以上第一点的解决方案就可以实现可扩展的要求。
当我有一个新的功能时,我新建一个类,写上几个方法即可。完全不需要修改以前的任何代码。
3、安全性
说到安全性,第一个想到的就是密钥了。
两个系统间商定一个密钥,在调用接口时是必须携带该密钥经加密后的md5参数签名。
4、针对不同系统返回不同字段
维护一张字段表(接口方法名、字段名),维护一张字段与系统的映射表(字段名、系统名)
在调用接口时,需传参系统名。在接口实现上,可以通过表关联查询系统与字段的映射数据,或者程序初始化时将这些数据缓存入redis,再从redis高效获取。
在系统初期,映射表数据不多的情况下,性能的优势或许不大,但是到后面会怎样,大家都知道了。。。很多系统越跑越慢,大都是因为在很多可以优化性能的地方,没有优化
。
结论:
接口参数:Map<String,String> 分为公共参数和业务参数2部分,前者包含系统名、签名参数、方法名,后者根据不同业务分别有不同的参数。