文章

odoo对外接口一种实现方式

2019-05-14 | 1 minute read |标签 性能 系统 系统分析 |分类 开发

odoo对外接口一种实现方式

背景

在互联网化社会中,每个企业之间协作还停留在靠微信,电话,在强调毫秒级反应的信息化社会中,显然这种依靠人力协作方式无法适应当前的信息化社会快节奏,那么系统势必需要对外提供接口服务,对于有开放能力的合作伙伴,这样就不用再麻烦的导入系统,极大方便了客户下单,加快了下单速度,也减少一线员工的录入订单工作量

技术方案介绍

odoo自带了xmlrpc,这样技术在几年前还是比较时髦的,经过几年发展后,出现了接口不易读,解析速度慢,新语言兼容性差等问题,我们的技术方案重点是创建一套基于json格式的新接口,然后通过xmlrpc调用odoo接口,在技术选型上,选择了python中网络性能比较好的tornado

关于数据安全与鉴权

​ 由于xmlrpc调用时候,密码和账号都在公网上跑,这难免有丢失密码的风险,所以为了保证安全性,设计了密钥对和参数签名方式,其签名流程如下:

绘图1

不论是我方主动推送,还是需求调用,统一使用签名方式。

为了加强并发性能,鉴权使用mongodb数据库,由于xmlrpc使用超级用户,需要额外的公司以及关联客户信息,我们将信息配置于mongo中,得益于非关系数据库易于修改表单内容特性,在未来的场景中我们不用担心其性能。

关于io复用

​ 之所有选择tornado作为转发层,就是考虑到tornado的Ioselect面对多并发性能优势,tornado在py27中新版本增加新函数run_in_executor可以实现任何方法异步化,而不用使用底层的ioselect,极大的方便了异步函数的使用。

关于主动推送信息

​ 参考微信接口服务,我们发现确实需要主动推送一些数据需求,主动推送触发条件,是比较麻烦的,我们决定采用消息队列方式解耦系统,这就牵扯改造ODOO,现在的方案使用rabbitmq,使用群组消费模式,并复发三次,如果没有收到我们预定返回消息就重试,相反则不重发。

系统架构图

绘图1