python flask如何注册到nacos

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen

背景

shigen之前遇到了一个服务,需要结合nacos+ Spring security实现服务的负载均衡。其中最为重要的就是python服务自己注册到nacos上,趁着闲暇时间,来研究了一番。

nacos官网中提到了【其它语言的sdk】:

点击【python】就跳转到了GitHub。

看着好像也没说的很清楚,我们自己来调用SDK实现一下。

代码实现

首先确保nacos服务启动了,shigen这里用的docker-compose的方式启动的:

对应的docker-compose文件如下:

yaml 复制代码
 version: '3'
 services:
   nacos-standalone:
     image: nacos/nacos-server:v2.1.2-slim
     container_name: nacos-server
     ports:
       - 8848:8848
       - 9848:9848
       - 9849:9849
     environment:
       - 'MODE=standalone'
       - 'TIME_ZONE=Asia/Shanghai'
     volumes:
       - ./conf:/home/nacos/conf
       - ./logs:/home/nacos/logs
       - ./data:/home/nacos/data

代码可以参考shigen的gitee-cloud-patform

首先下载依赖:

 pip install nacos-sdk-python

依赖安装完成,就可以继续写代码了,主要是注册上服务和发送心跳。

最开始,shigen尝试了官方的SDK,总是出现异常,最后看了一下官方的描述:

Supported Python version:

Python 2.7 Python 3.6 Python 3.7

Supported Nacos version

Nacos 0.8.0 ~ 1.3.2

好家伙,我忽视了nacos的版本,注意,我的nacos是这样的:nacos/nacos-server:v2.1.2-slim,直接2.0+,不适配。害得我折腾了一下午,最后和伙伴出去跑步了,心里一想,我真是钻牛角尖。服务的注册也不是我的首要任务,实在不行,用官方的API照样可以注册上去。

于是,回来尝试了一下:

python 复制代码
 import sys
 # 用于异步处理心跳检测
 import threading
 import time
 from typing import NoReturn
 ​
 import requests
 from flask import Flask, jsonify, request
 ​
 app = Flask(__name__)
 ​
 ​
 # 服务注册
 def service_register(service_name: str, ip: str, port: int):
     url = f"http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName={service_name}&ip={ip}&port={port}"
     res = requests.post(url)
     print(f"完成注册: {res.status_code}")
 ​
 ​
 # 心跳检测
 def service_beat(service_name: str, ip: str, port: int) -> NoReturn:
     while True:
         url = f"http://127.0.0.1:8848/nacos/v1/ns/instance/beat?serviceName={service_name}&ip={ip}&port={port}"
         res = requests.put(url)
         print(f"心跳检测中... 响应状态码: {res.status_code}")
         time.sleep(5)
 ​
 ​
 @app.route('/get_server_info', methods=['GET'])
 def get_server_info():
     server_ip = request.host.split(':')[0]
     server_port = request.host.split(':')[1]
 ​
     response = {'ip': server_ip, 'port': server_port}
     return jsonify(response)
 ​
 ​
 if __name__ == '__main__':
     if len(sys.argv) > 1:
         port = int(sys.argv[1])
     else:
         port = 10000
     service_name = 'python-server'
     ip = '127.0.0.1'
     service_register(service_name, ip, port)
     # 5 秒后执行心跳检测
     threading.Timer(5, service_beat(service_name, ip, port)).start()
     app.run()
 ​

参考文章:spring boot和flask整合nacos

特意的留了一个命令行参数作为服务的端口号,这样的话,副本数就很好控制了。

控制台操作一下:

注意:服务在第一次启动注册之后,需要不断的对nacos发送心跳,表明服务的存活。

最后实现的效果是这样的:

那接下来就是网关层的调用和负载均衡了,这个下期再讲。

与shigen一起,每天不一样!

相关推荐
容若只如初见3 小时前
项目实战--Spring Boot + Minio文件切片上传下载
java·spring boot·后端
码农爱java3 小时前
Spring Boot 中的监视器是什么?有什么作用?
java·spring boot·后端·面试·monitor·监视器
Apifox.4 小时前
什么是 HTTP POST 请求?初学者指南与示范
后端·http·学习方法·web
无名指的等待7124 小时前
SpringBoot实现图片添加水印(完整)
java·spring boot·后端
甜甜圈的小饼干8 小时前
Spring Boot+Vue项目从零入手
vue.js·spring boot·后端
我曾遇到一束光8 小时前
Spring boot 更改启动LOGO
数据库·spring boot·后端
tiger_angel9 小时前
springboot集成gzip和zip数据压缩传输-满足2k数据自动压缩(适用大数据信息传输)
大数据·spring boot·后端·数据压缩·压缩数据·压缩传输消息
笔触狂放9 小时前
【Django】网上蛋糕项目商城-关键字搜索,商品详情功能
后端·python·django
q5673152310 小时前
Python 3.x 下的 3D 游戏引擎
开发语言·后端·python·3d·django·游戏引擎
奋斗的袍子00710 小时前
SpringBoot:SpringBoot统一响应和统一异常处理
java·spring boot·后端·spring·统一异常处理·统一响应·自定义异常