最近遇到的一个问题是需要从springboot的项目中调用另外一个python项目的机器学习模型等内容,之前的一篇文章讲的是利用Redis作为共享内存,从而实现在C++程序中调用python模型的方法,但这种方法的主要应用场景是离线环境(搭载在机器人上的miniPC)。而这次的项目中,python部分内容较多,除了加载机器学习模型之外还干了很多事情,如果全部将这些代码重写为Java工作量过于庞大,反之亦然。所以最终选择搭建RESTful服务器,在springboot项目中进行远程调用。
RESTful服务
关于restful的理解可以参考上面这篇文档。需要注意的是restful只是一种设计理念,并不是一种确定的规范。
这里为什么说选择restful类型的服务而不是其它类型的web呢?主要是以下两个原因:
- 1.因为python那边代码是整个项目的核心,springboot项目主要是一个展示作用(其实代码也很多),以后可能会拓展到其它web项目;
- 2.无需考虑任何安全问题,可以随心所欲的跨域
- 3.传入一个参数,返回一个处理结果,这是典型的get操作。
简易python Web框架–flask_restful
- 文档
- 安装方式:
pip install flask-restful
该框架十分简洁,几行代码就可以搭建出一个restful服务器,具体的使用方式在文档里有详细的描写。下面是我搭建服务器的主要代码:
from flask import Flask, request from flask_restful import Resource, Api from core.AJExtract2 import AJExtract2 app = Flask(__name__) api = Api(app) # 初始化模型 aj = AJExtract2() class CpwsRestful(Resource): def __init__(self): pass def get(self, file_name): global aj return aj.restful_interface(file_name) api.add_resource(CpwsRestful, '/<string:file_name>') if __name__ == '__main__': # 配置到服务时debug一定要改为false,开发时可以为true app.run(debug=True)
默认端口是5000,因此可以使用类似下面的url访问它:
localhost:5000/file_name
使用RestTemplate访问rest服务
restTemplate 是springboot提供的访问rest服务的工具,使用也是非常方便。
- 安装
restTemplate 属于 starter-web,在maven中添加下面的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
使用步骤
- 1.添加配置类
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory){ return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(5000);//单位为ms factory.setConnectTimeout(5000);//单位为ms return factory; } }
- 2.调用
@Override public String getAutoBpmnFile(String file_name) { //get json数据 System.out.println("url:" + URL + file_name); JSONObject json = restTemplate.getForEntity(URL + file_name, JSONObject.class).getBody(); System.out.println(json); return json.toJSONString() }
总结
至此,就解决了文章开头所述的问题。这里只是提供一种思路,针对不同的应用场景,有不同的解决方案。
点击量:6679
4 条评论
孙 · 2021年4月20日 下午6:12
spring的第二步调用不知道该放在哪里,能发一下源码吗
孙 · 2021年4月20日 下午6:13
793127553@qq.com谢谢!
maicius · 2021年4月30日 下午11:54
这个代码是从一个实习项目里摘抄出来的,不太好分享。那个调用就随便新建一个类就好了
关于同源策略的一点思考 – 小麦冬 · 2020年8月16日 上午2:21
[…] Flask_restful 真是个好框架,两三行代码就能搭建好restful服务器,具体参考快速搭建RESTful服务 […]