内容简介:如果要想将地球物理学专业软件或代码共享给更多的用户使用,复杂的安装配置无疑会让可移植性变差。那么,当前流行的微服务框架无疑是理想的解决方案之一。今天在回家后晚上没忍住,亲测了一下让Jupyter Notebook变为微服务的kernel gateway工具。作为Jupyter系列项目中的一个,这个功能还是很酷的,只要通过简单的改造,你的nb程序就可以变成microservice啦!
1、什么要做成服务?
软件即服务的理念,我想大家都不陌生。随着更多巨头们拥抱云,传统的单机版软件,已经越来越少。不知道你有没有觉得,现在需要破解的软件越来越少,传统的PC版软件,也都流行用户登陆,之后可以体验更多云端增值服务。
特别是对于一些基于特定AI算法和计算环境开发的专业软件,因为要依赖特定的软硬件环境,移植起来并不容易,这时候微服务的概念逐渐流行, 为什么Restful的API这么流行。
微服务可以将一套软件拆分成高内聚低耦合的解决方案。通过合理的接口设计,可以让复杂的环境依赖,变成很多独立的环境单元,这不但有利于开发,而且也有利于用户使用。今天我们就介绍一种,专门针对Python代码的微服务解决方案。
2、Jupyter kernelgateway
Jupyter Kernel Gateway可以看成是一个web服务器,提供了可以访问Jupyter kernel的解决方案。通过REST形式的方式,用户可以远程的使用这个网关,以websocket的来与网内指定的python服务进行通信。
JKG的好处是,不改变你的python使用方式,可以将在Notebook写好的程序,通过几行代码就可以发布成服务/
下面体验一下kernelgateway的notebook_http功能
- 首先是安装JKG
# install from pypi
pip install jupyter_kernel_gateway
# show all config options
jupyter kernelgateway --help-all
# run it with default options
jupyter kernelgateway
然后,启动Jupyter Notebook,写一个ipynb文件:
开始第一个代码块cell,导入下面两个包
import math
import json
- 再启动第二个代码块,输入(一个简单的角度换算)
# GET /convert
req = json.loads(REQUEST)
args = req['args']
if 'angle' not in args:
print(json.dumps({'convertedAngle':None}))
else:
angle = int(args['angle'][0])
converted = math.radians(angle)
print(json.dumps({'convertedAngle':converted}))
注意:上面的# GET /convert,这个是关键,convert代表将来的微服务入口,这个cell的前三行是固定写法,记下来。里面的print是返回给调用端的内容。
因为是REST方式调用,通过print导出的信息,都要采用json格式来进行封装。
写好没问题后,保存到本地,注意目录要能通过http访问到。运行命令不容易记,写在这里吧
jupyter kernelgateway --KernelGatewayApp.api='kernel_gateway.notebook_http' --KernelGatewayApp.seed_uri='程序名称.ipynb'
ps:如果出现signal相关错误,可以通过尝试conda update ipykernel解决
一句话总结:除了JKG方式,针对python用户,还有一个选择,那就是Flask,感兴趣的朋友们,不妨两种都试试,测试满意后直接封装成docker,部署到云上,回想一下是不是也没什么,开发微服务也就是这么回事呢?