python flask服务如何注册到nacos

news/2024/4/27 13:52:05

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

背景

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

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

nacos其它语言SDK

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

官网内容

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

代码实现

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

nacos启动

对应的docker-compose文件如下:

version: '3'
services:nacos-standalone:image: nacos/nacos-server:v2.1.2-slimcontainer_name: nacos-serverports:- 8848:8848- 9848:9848- 9849:9849environment:- '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照样可以注册上去。

于是,回来尝试了一下:

import sys
# 用于异步处理心跳检测
import threading
import time
from typing import NoReturnimport requests
from flask import Flask, jsonify, requestapp = 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 = 10000service_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一起,每天不一样!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10857.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【Spring 篇】SpringMVC的请求:舞台上的开端

在Web开发的舞台上,请求就如同一场充满激情的开端,而SpringMVC是这场表演的舞台主持人,它能够优雅地接收和处理各种请求,引领我们进入一个美妙的编码之旅。在本篇博客中,我们将深入探讨SpringMVC的请求处理机制&#x…

JavaScript高级(十八)---进程和线程,宏任务和微任务

进程和线程 进程(process):计算机已经运行的程序,是操作系统管理程序的一种方式,我们可以认为,启动一个应用程序,就会默认启动一个进程(也可能是多个进程)。 线程&…

Java小项目--满汉楼

Java小项目–满汉楼 项目需求 项目实现 1.实现对工具包的编写 先创建libs包完成对jar包的拷贝和添加入库 德鲁伊工具包 package com.wantian.mhl.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource; import java.io.FileInputStream…

01mysql

登陆mysql 默认数据库 进入,展示,删除 ,查看当前正使用的库 select version()查看版本 查看表结构desc 查询 not in不会忽略空 in会自动忽略 like模糊查询 %o%中间带o的 _A%第二个字母是A的 查名字是下划线的 %\_% 排序 order …

初识微信小程序之swiper和swiper-item的基本使用

在我还没接触到微信小程序之前,通常使用轮播要么手写或使用swiper插件去实现,当我接触到微信小程序之后,我看到了微信小程序的强大之处,让我为大家介绍一下吧! swiper与swiper-item一起使用可以做轮播图 基本使用&…

【机器学习】无监督学习:解锁数据中的潜在结构与关系

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…