用一个例子说明怎么使用Swagger和connexion、Docker构建深度学习服务

因为鄙人大创的需要,需要将深度学习模型打包成服务,所以这里写一个教程说明如何搭建服务。因为此刻我们的模型还没有训练好,所以就写一个简单的demo,实现的步骤都是一样的。自己对于connexion包用得不多,且YAML语言也是简单了解了一下,所以如果有错,请指正。

工具解释

Swagger

Swagger是一个强大的工具,就我掌握的而言,它是一个集文档生成、前后端代码生成功能的强大工具,能够根据YAML语言的API描述生成Android、python代码(可能需要修改某一些地方才能运行)、Web版文档。它编写的规则是基于OpenAPI规范的,OpenAPI是API描述规范,具体可以参考github上的链接OpenAPI Specification。API一般使用YAML语言进行描述,YAML语言可以与JSON进行转换,既然能相互转换,也就是说在Swagger里面可以按照OpenAPI规范使用JSON语言或YAML语言对API进行描述,很多地方一般都是使用YAML语言的。Swagger分为Swagger-codegen、Swagger-ui和Swagger-editor三个模块,关于这三个模块的详细介绍可以参看这一篇文档Swagger从入门到精通。其实Swagger提供了在线版Swagger
这里推荐一篇写得还不错的OpenAPI规范OpenAPI

connexion包

这个包使用较少,网上资料也很少,其实文档里面使用方法说得非常得清楚,参见PyPI文档connexion包

Docker

Docker真的小,我本以为一个容器或几个容器的运行,一般笔记本遭不住,结果很不错吧,看看一个容器占得内存,这个容器挂了一个服务
在这里插入图片描述
仅仅18M,超乎想象。这里给自己留一个坑去学一学Docker的内部机制架构。关于Docker入门网上有很多资料,我参考的是Docker入门-菜鸟教程,关于各种命令的使用以及Dockerfile的使用可以自行看看别人的博客。其中这里记录一下,在使用过程中踩的坑,就是CMD命令,这个命令我的理解是镜像的一个属性,当使用镜像创建一个容器时如果在执行docker run命令时没有指定其他的命令,那么使用Dockerfile中定义的CMD命令,这个CMD命令也是容器的一个属性,容器的CMD属性与其镜像的CMD属性一致,当将容器转为镜像的时候,这个属性是会传递给镜像的,这个命令是在容器启动时就会执行(每一次启动),包括命令docker start、docker run(创建一个新的容器),如果启动的命令即CMD包括/bin/bash那么可以在docker start -i来与容器进行交互,如果CMD没有这个那么使用docker start -i也不能启动交互,直接就退出来了。这里注意下最好将dockerfile文件放到一个空文件夹下,不然发送到Docker daemon 的数据很大,他会将所有与dockerfile在同一目录下的文件全部发送到Docker daemon,这是占磁盘空间的。

搭建

这里给出简单的加法运算,搭建REST API服务
dockerfile:

FROM fedora:28
MAINTAINER Tanglj <邮箱>

RUN pip3 install connexion -i http://mirrors.aliyun.com/pypi/simple/  --trusted-host mirrors.aliyun.com

ADD ./ /test_docker
EXPOSE 5000

WORKDIR /test_docker

CMD python3 ConnexionTest.py

Connexion文件:

import connexion

app = connexion.App(__name__, specification_dir='./')

app.add_api('addtest.yml')

if __name__ == '__main__':
    app.run(debug=True)

API描述文件:

swagger: "2.0"
info:
  description: "test add op"
  title: "Add"
  version: "1.0"
consumes:
  - "application/json"
produces:
  - "application/json"
basePath: /
paths:
  /add:
    post:
      summary: "add op"
      operationId: "Add.add"  #文件名.函数名
      tags:
        - add
      parameters:
        - name: a #与函数中的参数名一致
          in: query  
          type: integer
        - name: b
          in: query
          type: integer
      responses:
        '200':
          description: "success"
        
      

Add python代码:

def add(a,b):
    return a+b

接下来我们使用

docker build -t 标签 . 

创建镜像,build命令会去当前路径找Dockerfile。然后使用如下命令创建容器并做主机与虚拟机的端口映射

docker run -it -p 5000:5000 标签 /bin/bash

为什么我们要使用新的CMD命令呢,因为如果不使用的化,根据Dockerfile中的CMD那么容器直接会执行python的命令然后就结束了,而我们还需要配置swagger-ui模块,所以需要进入交互模式,所以修改CMD命令为/bin/bash。其中的-it不能少,表示交互,如果没有-it参数那么也不会进入交互模式。
接下来我们进入了容器命令行界面
在这里插入图片描述

这样只需运行python Connexion文件即可,你会发现程序提示错误,根据错误提示,我们需要安装Swagger-ui模块,我自己手动安装了一遍发现一堆错误,所以只好用另一种方法了,就是运行

 pip3 install connexion[swagger-ui]

估计connexion对swagger-ui做了集成。
接下来登录http://localhost:5000/ui/即可,效果:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swagger一个开源的API文档工具,它提供了一种简单但功能强大的方式来描述、构建、测试和可视化RESTful风格的Web服务。 通过使用Swagger,开发人员可以使用Swagger注释来描述API的细节,包括请求和响应的结构、参数、错误代码等。这些注释可以用于生成可交互的API文档,以及客户端和服务器端的代码。 举个例子,假设我们有一个名为"User"的API,它包含以下操作:获取用户信息、创建用户、更新用户和删除用户。如果我们使用Swagger来描述这个API,我们可以定义每个操作的请求和响应结构、参数、错误码等。然后,Swagger可以根据这些描述生成一个可交互的API文档,其中包含了每个操作的详细说明、示例请求和响应以及其他相关信息。 使用Swagger的好处是多方面的。首先,它提供了一种统一的方式来描述和文档化API,使开发人员和用户能够更好地理解和使用API。其次,Swagger生成的API文档是可交互的,用户可以在文档中直接尝试API,并查看请求和响应的示例。这使得开发人员可以更快地理解和使用API,减少了开发和调试的时间。此外,Swagger还可以根据API描述生成客户端和服务器端的代码,提供了一种快速构建和集成API的方式。 综上所述,使用Swagger可以帮助开发人员更好地描述、文档化和使用API,提高开发效率和API的可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值