文章目录
1.准备工作
1.1.安装python环境
,定制网站在官网下载python定制网站安装包以后,进行安装,定制网站配置好对应的环境变量(ps定制网站使用安装包安装,定制网站界面有添加到python定制网站到环境变量选项)。
1.2.安装框架
该框架(函数库)是python的一款MVC框架,相信做web定制网站端开发过来的,定制网站都比较容易理解,尤其Java,例如SpringMVC框架。定制网站这个主要是用来开发HTTP接口的。
pip install flask- 1
1.3.安装requests函数库
定制网站这个是用来发起Http请求的,定制网站因为我们如果将服务发定制网站布到注册中心的话,定制网站需要我们向注册中心发起http请求。
pip install requests- 1
1.4.定制网站安装注册中心
安装略
nacos定制网站服务端访问地址:http://:8848/nacos。具体nacos定制网站学习参考如下两个
nacos github地址:
nacos 定制网站官方中文学习网:
2.python发布http/rest接口
创建demo.py
2.1.发布http+get
创建一个py文件,例如demo.py
from flask import Flask,jsonify,request'''python发布restful服务实例@author:hutao@date: 2022-04-11'''#初始化。官方解释:http://flask.pocoo.org/docs/0.12/api/#flask.Flaskserver = Flask(__name__)#处理乱码server.config['JSON_AS_ASCII']=False'''使用rest进行get请求,定制网站通过请求拼接参数进行传参,其中name是传参请求实例:http://127.0.0.1:8085/simulation/analysis?name=胡涛请求参数:请求地址中的name=胡涛响应参数:{ "code": "200", "data": { "age": 25, "job": "python", "name": "胡涛" }, "msg": "SUCCES"}'''@server.route('/simulation/analysis',methods=['get'])def demo_rest_get_request(): # 处理业务逻辑 name = request.args['name'] result = {"code":"200","msg":"SUCCES","data":{"name":name,"age":25,"job":"python"}} return jsonify(result)if __name__ == "__main__": server.run(port=8085,debug=True)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
启动该demo.py文件,然后通过postman工具调用这个接口,效果如下所示。
2.2.发布http+post+json
'''使用rest进行post请求,通过请求提 json传参,其中name是传参请求地址:http://127.0.0.1:8085/simulation/analysis请求参数:{ "name":"胡涛", "job":"java"}响应参数:{ "code": "200", "data": { "age": 25, "job": "java", "name": "胡涛" }, "msg": "SUCCES"}'''@server.route('/simulation/analysis',methods=['post'])def demo_rest_post_request(): # 处理业务逻辑 name = request.json.get('name') job = request.json.get('job') result = {"code":"200","msg":"SUCCES","data":{"name":name,"age":25,"job":job}} return jsonify(result)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
2.3.发布restful
'''使用restful进行get请求,通过请求地址进行传参,其中胡涛是传参请求地址:http://127.0.0.1:8085/simulation/analysis/胡涛请求参数:将地址中的胡涛映射到属性字段name上响应参数:{ "code": "200", "data": { "age": 26, "job": "python", "name": "胡涛" }, "msg": "SUCCES"}'''@server.route('/simulation/analysis/<name>',methods=['get'])def demo_restful_request(name): result = {"code":"200","msg":"SUCCES","data":{"name":name,"age":25,"job":"python"}}return jsonify(result)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
3.Java通过rest请求接口
//调用python服务String url = "http://127.0.0.1:8085/simulation/analysis?name=hutao";ResponseEntity<RestData> forEntity = restTemplate.getForEntity(url, RestData.class);RestData<PythonData> data = forEntity.getBody();- 1
- 2
- 3
- 4
4.Python服务注册
4.1.Nacos注册接口
通过postman对nacos服务发起注册请求即可。
- 请求地址:http://127.0.0.1:8848/nacos/v1/ns/instance
- 请求方式:POST
- 请求参数:
备注:请求参数并不是Json格式,不同版本,可能会存在差异,本人使用的是1.4.3版本,请求参数并不能通过json格式提交。而是在请求地址后面拼接参数。
http://49.232.70.33:8848/nacos/v1/ns/instance?serviceName=algorithm-service&ip=127.0.0.1&port=8085- 1
不过这个不是重点,具体什么请求参数,什么请求方式,这个由于nacos开源,可以自己去定义的。
该接口返回OK以后,即注册成功,此时登陆注册中心,即可看到我们注册的服务。
4.2.Nacos心跳接口
上述注册的接口,会在一段时间内和注册中心断开,因此注册中心没有收到客户端(注册的服务)的心跳,因此判断该服务出问题,该版本大概是15秒左右,就会变成如下这样。过一段时间后,任然没有心跳,则会在服务列表剔除。
因此为了保证我们的服务注册上以后,保持健康状态,即让注册中心知道我们的服务没有问题,网络可达,因此需要定期向注册中心发起心跳检测的请求。
- 请求地址:http://127.0.0.1:8848/nacos/v1/ns/instance/beat
- 请求方式:put
- 请求参数:同注册
http://127.0.0.1:8848/nacos/v1/ns/instance/beat?serviceName=algorithm-service&ip=127.0.0.1&port=8085- 1
4.3.python实现思路
我们已经知道了通过上述两个接口,即可实现注册和心跳检测,因此,我们只需要将我们的python服务发布http接口的时候,给注册中心发起一个请求进行注册即可,接着在通过一个异步任务定时的向注册中心发起心跳检测即可。
当然,目前也有一些开源的软件实现了,不过笔者并不推荐,因为从技术上来说,这个真的很简单,自己实现即可,就是python给注册中心发起请求而已,并没有什么太复杂的功能。
例如目前开源了nacos-sdk-python,不过由于不同版本的nacos可能存在版本差异,导致到时候调试或者开发存在其他问题,因此不推荐使用。因为nacos开源,并且我们安装的nacos可能会是我们定制化后的。因此推荐你直接调用你所部署的nacos的服务接口
4.3.1.调用Nacos注册接口
#nacos服务注册def service_register(): url = "http://49.232.70.33:8848/nacos/v1/ns/instance?serviceName=algorithm-service&ip=127.0.0.1&port=8085" res = requests.post(url) print("向nacos注册中心,发起服务注册请求,注册响应状态: {}".format(res.status_code))- 1
- 2
- 3
- 4
- 5
- 6
4.3.2.调用Nacos心跳接口
#服务检测(每5秒心跳一次)def service_beat(): while True: url = "http://49.232.70.33:8848/nacos/v1/ns/instance/beat?serviceName=algorithm-service&ip=127.0.0.1&port=8085" res = requests.put(url) print("已注册服务,执行心跳服务,续期服务响应状态: {}".format(res.status_code)) time.sleep(5)- 1
- 2
- 3
- 4
- 5
- 6
- 7
4.4.完整代码示例
from flask import Flask,jsonify,requestimport requestsimport threadingimport time'''python发布restful服务实例@author:hutao@date: 2022-04-11'''# Flask初始化参数尽量使用你的包名,这个初始化方式是官方推荐的,官方解释:http://flask.pocoo.org/docs/0.12/api/#flask.Flaskserver = Flask(__name__)#处理乱码server.config['JSON_AS_ASCII']=False'''使用restful进行get请求,通过请求地址进行传参,其中胡涛是传参请求地址:http://127.0.0.1:8085/simulation/analysis/胡涛请求参数:将地址中的胡涛映射到属性字段name上响应参数:{ "code": "200", "data": { "age": 25, "job": "python", "name": "胡涛" }, "msg": "SUCCES"}'''@server.route('/simulation/analysis/<name>',methods=['get'])def demo_restful_request(name): # 处理业务逻辑 #name = request.args['name'] result = {"code":"200","msg":"SUCCES","data":{"name":name,"age":25,"job":"python"}} return jsonify(result)'''使用rest进行get请求,通过请求拼接参数进行传参,其中name是传参请求实例:http://127.0.0.1:8085/simulation/analysis?name=胡涛请求参数:请求地址中的name=胡涛响应参数:{ "code": "200", "data": { "age": 25, "job": "python", "name": "胡涛" }, "msg": "SUCCES"}'''@server.route('/simulation/analysis',methods=['get'])def demo_rest_get_request(): # 处理业务逻辑 name = request.args['name'] result = {"code":"200","msg":"SUCCES","data":{"name":name,"age":25,"job":"python"}} return jsonify(result)'''使用rest进行post请求,通过请求提 json传参,其中name是传参请求地址:http://127.0.0.1:8085/simulation/analysis请求参数:{ "name":"胡涛", "job":"java"}响应参数:{ "code": "200", "data": { "age": 25, "job": "java", "name": "胡涛" }, "msg": "SUCCES"}'''@server.route('/simulation/analysis',methods=['post'])def demo_rest_post_request(): # 处理业务逻辑 name = request.json.get('name') job = request.json.get('job') result = {"code":"200","msg":"SUCCES","data":{"name":name,"age":25,"job":job}} return jsonify(result)#nacos注册中心信息'''将服务注册到注册中心注册说明:将http://127.0.0.1:8085/**这个服务上的所有服务注册到注册中心,并且起名叫做algorithm-service其他微服务进行访问时,访问http://algorithm-service/**即可,即其他服务,使用algorithm-service去注册中心,寻找真实的ip地址例如原本访问 post访问:http://127.0.0.1:8085/simulation/analysis 此时变成 http://algorithm-service/simulation/analysis'''#nacos服务def service_register(): url = "http://49.232.70.33:8848/nacos/v1/ns/instance?serviceName=algorithm-service&ip=127.0.0.1&port=8085" res = requests.post(url) print("向nacos注册中心,发起服务注册请求,注册响应状态: {}".format(res.status_code))#服务检测def service_beat(): while True: url = "http://49.232.70.33:8848/nacos/v1/ns/instance/beat?serviceName=algorithm-service&ip=127.0.0.1&port=8085" res = requests.put(url) print("已注册服务,执行心跳服务,续期服务响应状态: {}".format(res.status_code)) time.sleep(5)#发布http服务,并且注册到nocosif __name__ == "__main__": service_register() #5秒以后,异步执行service_beat()方法 threading.Timer(5,service_beat).start() server.run(port=8085,debug=True)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110