nacos-sdk-python icon indicating copy to clipboard operation
nacos-sdk-python copied to clipboard

flask项目注册到nacos,一开始没问题.过一会nacos监控那里实例数就没了

Open zhouwei4780 opened this issue 5 years ago • 18 comments

code

import datetime
import logging
import random

from flask import Flask

from pyctuator.pyctuator import Pyctuator
import nacos
# Keep the console clear - configure werkzeug (flask's WSGI web app) not to log the detail of every incoming request
logging.getLogger("werkzeug").setLevel(logging.WARNING)

my_logger = logging.getLogger("example")

app = Flask("Flask Example Server")


@app.route("/")
def hello():
    my_logger.debug(f"{datetime.datetime.now()} - {str(random.randint(0, 100))}")
    print("Printing to STDOUT")
    return "Hello World!"


example_app_address = "192.168.1.2"
example_sba_address = "192.168.1.6"

Pyctuator(
    app,
    "huiche-ai",
    app_url=f"http://{example_app_address}:5000",
    pyctuator_endpoint_url=f"http://{example_app_address}:5000/pyctuator",
    registration_url=f"http://{example_sba_address}:8764/instances",
    app_description="Demonstrate Spring Boot Admin Integration with Flask",
)
def regis_server_to_nacos():
    SERVER_ADDRESSES = "192.168.1.6"
    NAMESPACE = "public"

    # no auth mode
    client = nacos.NacosClient(SERVER_ADDRESSES, namespace=NAMESPACE)
    # auth mode
    # client = nacos.NacosClient(SERVER_ADDRESSES, namespace=NAMESPACE, username="nacos", password="nacos")

    # get config
    data_id = "nacos.cfg.dataId"
    group = "test"
    print(client.get_config(data_id, group))

    client.add_naming_instance("heiche-ai", "192.168.1.2", "5000")
if __name__ == '__main__':
    regis_server_to_nacos()
    app.run(port=5000, host="0.0.0.0",debug=True)
  1. 启动项目,nacos上成功注册 image

2.过一会 image

zhouwei4780 avatar Sep 13 '20 14:09 zhouwei4780

你需要调用send_heartbeat这个方法来一直发心跳包给nacos

ceshi123qz avatar Sep 14 '20 03:09 ceshi123qz

你需要调用send_heartbeat这个方法来一直发心跳包给nacos

只需要调用一次send_heartbeat方法即可还是需要自己循环一定间隔调用一次?

wangfengwangfeng avatar Sep 23 '20 00:09 wangfengwangfeng

现在要借助send_heartbeat自己实现心跳机制,没eureka_client实现方便啊

tm2311 avatar Oct 20 '20 04:10 tm2311

你需要调用send_heartbeat这个方法来一直发心跳包给nacos

只需要调用一次send_heartbeat方法即可还是需要自己循环一定间隔调用一次?

我是自己循环一定间隔调用一次

gaozhengjie avatar Jan 19 '21 05:01 gaozhengjie

你需要调用send_heartbeat这个方法来一直发心跳包给nacos

只需要调用一次send_heartbeat方法即可还是需要自己循环一定间隔调用一次?

定时调用,比如间隔3秒

ceshi123qz avatar Jan 19 '21 05:01 ceshi123qz

你需要调用send_heartbeat这个方法来一直发心跳包给nacos

只需要调用一次send_heartbeat方法即可还是需要自己循环一定间隔调用一次?

定时调用,比如间隔3秒

即使定时调用了,服务一直运行的情况下,实例的健康状态也不连续,规律性掉线重连,请问您遇到这个问题了吗?nacos2.0.1版本

WLBRich avatar May 10 '21 02:05 WLBRich

没有发现规律性掉线重连,但是的确会掉线重连,需要在调用的时候try catch一下,否则程序碰到异常会退出。

发件人: yangj2133 @.*** 发送时间: 2021年5月10日 10:43 收件人: nacos-group/nacos-sdk-python 抄送: wangfengwangfeng; Comment 主题: Re: [nacos-group/nacos-sdk-python] flask项目注册到nacos,一开始没问题.过一会nacos监控那里实例数就没了 (#21)

你需要调用send_heartbeat这个方法来一直发心跳包给nacos

只需要调用一次send_heartbeat方法即可还是需要自己循环一定间隔调用一次?

定时调用,比如间隔3秒

即使定时调用了,服务一直运行的情况下,实例的健康状态也不连续,规律性掉线重连,请问您遇到这个问题了吗?nacos2.0.1版本

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/nacos-group/nacos-sdk-python/issues/21#issuecomment-836089190 , or unsubscribe https://github.com/notifications/unsubscribe-auth/ABO34LGDSC3AIS44I7PA7X3TM5B45ANCNFSM4RKWQNKQ . https://github.com/notifications/beacon/ABO34LAZC7UHLDRJF5FLKT3TM5B45A5CNFSM4RKWQNK2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOGHK3KZQ.gif

wangfengwangfeng avatar May 10 '21 04:05 wangfengwangfeng

您好,您这个问题解决了吗?我也遇到类似的问题,注册上去不健康

rlacjfjin avatar Mar 16 '22 08:03 rlacjfjin

我遇到python端服务注册成功,心跳也正常发送和接收,但是服务周期性的不健康。在对比golang发送到服务端的心跳数据之后,发现python端发送的心跳请求中的beat参数(JSON格式),其中的serviceName参数格式不正确,正确格式应该是:分组名@@服务名,而python端的格式:服务名。修改心跳时上报服务名参数即可。具体为在发送心跳时将服务名拼接为分组名@@服务名的格式即可正常。测试之后服务注册和心跳正常。

qq2032554981 avatar Aug 29 '22 07:08 qq2032554981

我遇到python端服务注册成功,心跳也正常发送和接收,但是服务周期性的不健康。在对比golang发送到服务端的心跳数据之后,发现python端发送的心跳请求中的beat参数(JSON格式),其中的serviceName参数格式不正确,正确格式应该是:分组名@@服务名,而python端的格式:服务名。修改心跳时上报服务名参数即可。具体为在发送心跳时将服务名拼接为分组名@@服务名的格式即可正常。测试之后服务注册和心跳正常。

感谢,确实是这个原因。

zabida avatar Sep 27 '22 02:09 zabida

没错,这个问题非常奇怪,并且前面提到的方法都没有效果。最后我使用这种方式临时解决了这个问题:

import sys
import os
import threading


import time
from flask import Flask, request, jsonify
from nacos import NacosClient


app = Flask(__name__)

# NacosClient.set_debugging()
client = NacosClient("127.0.0.1:8848", namespace="public")
app.config['JSON_AS_ASCII'] = False

q = queue.Queue()
lock = threading.Lock()






# 定义处理心跳消息的函数
def handle_heartbeat():
    while True:
        try:
            requests.get('http://127.0.0.1:8100/heartbeat')
            instance_info = q.get()
            client.add_naming_instance(instance_info['serviceName'], instance_info['ip'], instance_info['port'])
        except:
            if(not q.empty()):
                return


@app.route('/heartbeat')
def heartbeat():

    instance_info = {'serviceName': 'flaskService', 'ip': '127.0.0.1', 'port': 8100}
    lock.acquire()
    try:
        q.put(instance_info)
        time.sleep(2)
    finally:
        lock.release()
    return 'OK'


if __name__ == '__main__':
    # 注册 Flask 应用到 Nacos 中
    client.add_naming_instance('flaskService', '127.0.0.1', 8100)
    t = threading.Thread(target=handle_heartbeat)
    t.start()
    app.run(debug=False,port=8100)

我额外开启了一个线程,这个线程自己实现了对服务的心跳检测,然后不断向nacos注册,说明这是健康的服务。

Huterox avatar May 01 '23 13:05 Huterox

我用的shedule,来每五秒发送心跳到nacos

import schedule
import threading

# 每五秒,发送心跳到nacos,注意,需要运行schedule.run_pending()
schedule.every(5).seconds.do(client.send_heartbeat,
     service_name=app.config['SERVICE_NAME'],
    ip=app.config['SERVICE_IP'],
    port=app.config['SERVICE_PORT'],
    cluster_name=app.config['NACOS_SERVICE_CLUSTER_NAME']
)
    
def run_scheduled_task() -> None:
    # 一直运行
    while True:
        # 检查是否有规划了时间的任务准备运行
        schedule.run_pending()
        time.sleep(1)

# 启动schedule,运行后台任务
threading.Thread(target=run_scheduled_task).start()

KunxiSun avatar Sep 19 '23 06:09 KunxiSun

这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。

Huterox avatar Sep 19 '23 06:09 Huterox

issue翻来翻去都有点劝退nacos python了,哈哈

Jazzylol avatar Mar 12 '24 11:03 Jazzylol

这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。

Huterox avatar Mar 12 '24 11:03 Huterox

issue翻来翻去都有点劝退nacos python了,哈哈

原因我倒是找到了,nacos现在最新版本是2.x,这个python sdb只支持到1.x,所以很多地方有坑。

我自己研发了一个python的sdk,还在测试中,目前比较简陋

KunxiSun avatar May 15 '24 11:05 KunxiSun

这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。

Huterox avatar May 15 '24 11:05 Huterox

实际上,在使用是部分1.x也会出现这个问题,当初发现这个问题的时候是我在本地使用1.1.4 的时候出现的,期待你能解决这个问题,并分享仓库让我们学习学习。

Huterox avatar May 16 '24 02:05 Huterox