nacos_config.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import nacos
  2. import socket
  3. from threading import Timer
  4. import logging
  5. import time
  6. import os
  7. import requests
  8. class NacosService:
  9. CLIENT = None
  10. DATA_ID = None
  11. GROUP = None
  12. LOCAL_IP = None
  13. SERVER_ADDRESSES = None
  14. NAMESPACE = None
  15. logger = logging.getLogger('app') # 这里设置名字
  16. __instance = None
  17. _registered = False # 添加注册标志位
  18. def __init__(self):
  19. if os.name == 'posix': # 'posix' 表示类Unix系统,包括Linux
  20. default_address = "127.0.0.1:8848"
  21. else:
  22. default_address = "192.168.3.80:8848"
  23. self.LOCAL_IP = str(os.getenv("NACOS_REGISTER_IP", default=socket.gethostbyname(socket.gethostname())))
  24. self.SERVER_ADDRESSES = default_address
  25. self.NAMESPACE = "dev"
  26. self.DATA_ID = "python-mendunr"
  27. self.GROUP = "DEFAULT_GROUP"
  28. def __new__(cls, *args, **kwargs):
  29. if NacosService.__instance is None:
  30. NacosService.__instance = object.__new__(cls, *args, **kwargs)
  31. return NacosService.__instance
  32. ### 获取配置
  33. def getConfig(self):
  34. return self.CLIENT.get_config(self.DATA_ID, self.GROUP)
  35. ### 注册实例
  36. def register_instance(self):
  37. if self._registered:
  38. return
  39. res = requests.post(url=f"http://{self.SERVER_ADDRESSES}/nacos/v1/ns/instance",
  40. data={
  41. 'groupName': self.GROUP,
  42. 'metadata': '{"preserved.register.source":"SPRING_CLOUD","preserved.heart.beat.interval": 5500, "preserved.heart.beat.timeout": 30000, "preserved.ip.delete.timeout": 60000}',
  43. 'namespaceId': self.NAMESPACE,
  44. 'port': 3333,
  45. 'enable': True,
  46. 'healthy': True,
  47. 'clusterName': 'DEFAULT',
  48. 'ip': self.LOCAL_IP,
  49. 'weight': 1,
  50. 'ephemeral': False, # 修改这里为 False
  51. 'serviceName': self.GROUP + "@@" + self.DATA_ID
  52. })
  53. if res.status_code == 200:
  54. self.logger.info("register_instance res %s", str(res.content, 'UTF-8'))
  55. self._registered = True # 设置注册成功标志位
  56. else:
  57. self.logger.error(f"Failed to register instance: {res.status_code} - {res.text}")
  58. def send_heartbeat(self):
  59. try:
  60. res = requests.put(url=f"http://{self.SERVER_ADDRESSES}/nacos/v1/ns/instance/beat",
  61. data={
  62. "ip": self.LOCAL_IP,
  63. "port": "3333",
  64. "namespaceId": self.NAMESPACE,
  65. "serviceName": self.GROUP + "@@" + self.DATA_ID,
  66. "clusterName": "DEFAULT"}
  67. )
  68. if res.status_code == 200:
  69. res_json = res.json()
  70. if res_json["code"] == 20404: ### 找不到资源重新注册
  71. self.register_instance()
  72. else:
  73. self.logger.error(f"Failed to send heartbeat: {res.status_code} - {res.text}")
  74. t = Timer(4, self.send_heartbeat) ## 4秒执行一次
  75. t.start()
  76. except Exception as e:
  77. self.logger.error(f"send_heartbeat error: {e}")
  78. def getServer(self, serverName):
  79. try:
  80. res = requests.get(url=f"http://{self.SERVER_ADDRESSES}/nacos/v1/ns/instance/list",
  81. params={'namespaceId': self.NAMESPACE, 'serviceName': self.GROUP + "@@" + serverName})
  82. if res.status_code == 200:
  83. hosts = res.json()["hosts"]
  84. if len(hosts) > 0:
  85. return hosts[0]
  86. else:
  87. self.logger.error(f"Failed to get server list: {res.status_code} - {res.text}")
  88. except Exception as e:
  89. self.logger.error(f"getServer error: {e}")
  90. return None
  91. def start(self):
  92. try:
  93. self.CLIENT = nacos.NacosClient(self.SERVER_ADDRESSES, namespace=self.NAMESPACE)
  94. self.register_instance()
  95. self.send_heartbeat()
  96. except Exception as e:
  97. self.logger.error(f"start error: {e}")
  98. def get_nacos_configs(self):
  99. url = f"http://{self.SERVER_ADDRESSES}/nacos/v1/cs/configs"
  100. params = {
  101. 'tenant': self.NAMESPACE,
  102. 'dataId': self.DATA_ID,
  103. 'group': self.GROUP
  104. }
  105. try:
  106. r = requests.get(url, params)
  107. r.encoding = r.apparent_encoding
  108. if r.status_code == 200:
  109. r_dict = r.json()
  110. return r_dict
  111. else:
  112. self.logger.error(f"Failed to get Nacos configs: {r.status_code} - {r.text}")
  113. except Exception as e:
  114. self.logger.error(f"get_nacos_configs error: {e}")
  115. return None
  116. nacos_service_single = NacosService()
  117. # 发送url请求,获取nacos上的配置
  118. def get_nacos_configs():
  119. return nacos_service_single.get_nacos_configs()