背景
我们知道web-platform 可以主要是以Java/Scala开发的。我们很希望能够支持用Python开发,所以,我们开发了ar-python插件。这个插件很早就开发了,这次完善之后,让他可以和user-system 插件配合,从而可以做精细化权限控制。
为什么要支持Python写接口
其实web-platform是我大AI中台设计的一部分。所以这个插件的开发缘由自然有支持AI的成分在里面。大部分算法工程师熟悉的是C/C++ 和Python,模型训练完成后,最后大概率是要提供web服务的。所以我们希望模型预测部分能够直接用Python开发,然后嵌入到已有的"web服务里"。ar-python完成了这个工作,允许算法用python写一个action,然后直接注册到web服务里,然后就可以提供对外提供服务或者测试了。
上面是第一个场景。第二个场景是,对于一些简单的业务逻辑,没必要那么正儿八经的去开发一套新的插件,用python写个简单的脚本是最高效率的。
使用流程
ar-python 插件支持两种模式,第一种模式是快速体验模式,这个时候不依赖于数据,第二种是生产环境模式,是需要数据库支持的。我们先来看看快速体验模式。
安装命令行:
pip install watchdog requests click uuid sfcli
新建一个容器目录:
sfcli create --name python_container
修改config/application.yml 确保数据库被禁用,启动容器:
sfcli runtime
然后安装插件:
sfcli plugin --add ar_python:1.0.0 --token xxxxxxx
token 到config/application.yml 里去找admin_token.
现在我们可以注册一段python代码到系统里(我用python代码写的)
import requests
request_url = "http://127.0.0.1:9007/run"
def registerPyAction(enableAdmin, params={}):
datas = {"code": """from pyjava.api.mlsql import PythonContext
for row in context.fetch_once():
print(row)
context.build_result([{"content": "{}"}], 1)
""", "action": "registerPyAction", "codeName": "echo"}
if enableAdmin:
datas = {**datas, **{"admin_token": "xxxxxx"}}
r = requests.post(request_url, data={**datas, **params})
print(r.text)
print(r.status_code)
registerPyAction(True)
里面的admin_token就是config/application.yml 的admin_token. 我们注册了一个echo的python代码。
现在我们可以调用这个python代码了:
# echo
def pyAction(codeName, enableAdmin=True, params={}):
datas = {"codeName": codeName, "action": "pyAction"}
if enableAdmin:
datas = {**datas, **{"admin_token": "xxxxxxx"}}
r = requests.post(request_url, data={**datas, **params})
print(r.text)
print(r.status_code)
pyAction("echo")
我在我自己的Macbook Pro上测试,上面的代码执行时间在20ms以内。理论上能满足一般的预测需求了。
生产模式
生产模式下,会有复杂的权限管理以及数据库依赖。ar_python插件自身只需要一张表:
case class PythonScript(id: Int, var name: String, var code: String)
但是它依赖于user-system插件,可以通过如下方式安装:
sfcli plugin --add app_runtime_with_db:1.0.0 --token xxxx
sfcli plugin --add user-system:1.0.0 --token xxxxxx
值得注意的是,我们需要将user-system/app_runtime_with_db/ar_python 需要的库表准备好,然后通过如下方式注册到系统上:
sfcli add_db --plugin_name user-system \
--host 127.0.0.1 \
--db_name app_runtime_plugin_full \
--user xxxx \
--password xxx \
--token xxxxx
sfcli add_db --plugin_name ar_python \
--host 127.0.0.1 \
--db_name app_runtime_plugin_full \
--user xxxx \
--password xxx \
--token xxxxx
用户可以直接带上admin_token操作所有接口。但是也可以做更精细化的权限控制。在ar_python中,有三总类型权限:
管理权限需要有admin_token的用户进行赋权。之后拥有权限管理的人便可以赋予特定用户执行注册和执行代码的权限了。这个后续会单独出文章介绍,我也会尽快开发一个python库,方便在暂时还没有web界面的情况下进行操作。