flask项目注册到nacos,一开始没问题.过一会nacos监控那里实例数就没了
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)
- 启动项目,nacos上成功注册

2.过一会

你需要调用send_heartbeat这个方法来一直发心跳包给nacos
你需要调用send_heartbeat这个方法来一直发心跳包给nacos
只需要调用一次send_heartbeat方法即可还是需要自己循环一定间隔调用一次?
现在要借助send_heartbeat自己实现心跳机制,没eureka_client实现方便啊
你需要调用send_heartbeat这个方法来一直发心跳包给nacos
只需要调用一次send_heartbeat方法即可还是需要自己循环一定间隔调用一次?
我是自己循环一定间隔调用一次
你需要调用send_heartbeat这个方法来一直发心跳包给nacos
只需要调用一次send_heartbeat方法即可还是需要自己循环一定间隔调用一次?
定时调用,比如间隔3秒
你需要调用send_heartbeat这个方法来一直发心跳包给nacos
只需要调用一次send_heartbeat方法即可还是需要自己循环一定间隔调用一次?
定时调用,比如间隔3秒
即使定时调用了,服务一直运行的情况下,实例的健康状态也不连续,规律性掉线重连,请问您遇到这个问题了吗?nacos2.0.1版本
没有发现规律性掉线重连,但是的确会掉线重连,需要在调用的时候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
您好,您这个问题解决了吗?我也遇到类似的问题,注册上去不健康
我遇到python端服务注册成功,心跳也正常发送和接收,但是服务周期性的不健康。在对比golang发送到服务端的心跳数据之后,发现python端发送的心跳请求中的beat参数(JSON格式),其中的serviceName参数格式不正确,正确格式应该是:分组名@@服务名,而python端的格式:服务名。修改心跳时上报服务名参数即可。具体为在发送心跳时将服务名拼接为分组名@@服务名的格式即可正常。测试之后服务注册和心跳正常。
我遇到python端服务注册成功,心跳也正常发送和接收,但是服务周期性的不健康。在对比golang发送到服务端的心跳数据之后,发现python端发送的心跳请求中的beat参数(JSON格式),其中的serviceName参数格式不正确,正确格式应该是:分组名@@服务名,而python端的格式:服务名。修改心跳时上报服务名参数即可。具体为在发送心跳时将服务名拼接为分组名@@服务名的格式即可正常。测试之后服务注册和心跳正常。
感谢,确实是这个原因。
没错,这个问题非常奇怪,并且前面提到的方法都没有效果。最后我使用这种方式临时解决了这个问题:
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注册,说明这是健康的服务。
我用的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()
这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。
issue翻来翻去都有点劝退nacos python了,哈哈
这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。
issue翻来翻去都有点劝退nacos python了,哈哈
原因我倒是找到了,nacos现在最新版本是2.x,这个python sdb只支持到1.x,所以很多地方有坑。
我自己研发了一个python的sdk,还在测试中,目前比较简陋
这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。
实际上,在使用是部分1.x也会出现这个问题,当初发现这个问题的时候是我在本地使用1.1.4 的时候出现的,期待你能解决这个问题,并分享仓库让我们学习学习。