1.准备工作

1.1.安装python环境

https://www.python.org/,在官网下载python安装包以后,进行安装,配置好对应的环境变量(ps使用安装包安装,界面有添加到python到环境变量选项)。
在这里插入图片描述
在这里插入图片描述

1.2.安装Flask框架

该框架(函数库)是python的一款MVC框架,相信做web端开发过来的,都比较容易理解,尤其Java,例如SpringMVC框架。这个主要是用来开发HTTP接口的。

pip install flask

在这里插入图片描述

1.3.安装requests函数库

这个是用来发起Http请求的,因为我们如果将服务发布到注册中心的话,需要我们向注册中心发起http请求。

pip install requests

在这里插入图片描述

1.4.安装注册中心nacos

安装略
nacos服务端访问地址:http://:8848/nacos。具体nacos学习参考如下两个
nacos github地址:https://github.com/alibaba/nacos
nacos 官方中文学习网:https://nacos.io/zh-cn/docs/what-is-nacos.html

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.Flask
server = 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)

启动该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)

在这里插入图片描述

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)

在这里插入图片描述

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();

4.Python服务注册

4.1.Nacos注册接口

通过postman对nacos服务发起注册请求即可。

  1. 请求地址:http://127.0.0.1:8848/nacos/v1/ns/instance
  2. 请求方式:POST
  3. 请求参数:
    在这里插入图片描述

备注:请求参数并不是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

不过这个不是重点,具体什么请求参数,什么请求方式,这个由于nacos开源,可以自己去定义的。
在这里插入图片描述
该接口返回OK以后,即注册成功,此时登陆注册中心,即可看到我们注册的服务。
在这里插入图片描述

4.2.Nacos心跳接口

上述注册的接口,会在一段时间内和注册中心断开,因此注册中心没有收到客户端(注册的服务)的心跳,因此判断该服务出问题,该版本大概是15秒左右,就会变成如下这样。过一段时间后,任然没有心跳,则会在服务列表剔除。
在这里插入图片描述
因此为了保证我们的服务注册上以后,保持健康状态,即让注册中心知道我们的服务没有问题,网络可达,因此需要定期向注册中心发起心跳检测的请求。

  1. 请求地址:http://127.0.0.1:8848/nacos/v1/ns/instance/beat
  2. 请求方式:put
  3. 请求参数:同注册
http://127.0.0.1:8848/nacos/v1/ns/instance/beat?serviceName=algorithm-service&ip=127.0.0.1&port=8085

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))

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)

4.4.完整代码示例

from flask import Flask,jsonify,request
import requests
import threading
import time
'''python发布restful服务实例
@author:hutao
@date: 2022-04-11
'''
# Flask初始化参数尽量使用你的包名,这个初始化方式是官方推荐的,官方解释:http://flask.pocoo.org/docs/0.12/api/#flask.Flask
server = 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服务,并且注册到nocos
if __name__ == "__main__":
    service_register()
    #5秒以后,异步执行service_beat()方法
    threading.Timer(5,service_beat).start()
    server.run(port=8085,debug=True)

5.Java微服务调用

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐