|
@@ -7,7 +7,7 @@ import os
|
|
|
import requests
|
|
|
|
|
|
|
|
|
-class nacos_service:
|
|
|
+class NacosService:
|
|
|
CLIENT = None
|
|
|
DATA_ID = None
|
|
|
GROUP = None
|
|
@@ -17,29 +17,23 @@ class nacos_service:
|
|
|
logger = logging.getLogger('app') # 这里设置名字
|
|
|
|
|
|
__instance = None
|
|
|
+ _registered = False # 添加注册标志位
|
|
|
|
|
|
def __init__(self):
|
|
|
if os.name == 'posix': # 'posix' 表示类Unix系统,包括Linux
|
|
|
- default_address = "http://127.0.0.1:8848"
|
|
|
+ default_address = "127.0.0.1:8848"
|
|
|
else:
|
|
|
- default_address = "http://192.168.3.80:8848"
|
|
|
- self.LOCAL_IP = str(os.getenv(key="NACOS_REGISTER_IP", default=socket.gethostbyname(socket.gethostname())))
|
|
|
- self.SERVER_ADDRESSES = str(os.getenv(key="NACOS_SERVER_ADDRESS", default=default_address))
|
|
|
- self.NAMESPACE = str(os.getenv(key="NACOS_NAME_SPACE", default="dev"))
|
|
|
- self.DATA_ID = str(os.getenv(key="NACOS_DATA_ID", default="python-mendunr"))
|
|
|
- self.GROUP = str(os.getenv(key="DEFAULT_GROUP", default="DEFAULT_GROUP"))
|
|
|
- self.logger.info("启动参数: %s", {
|
|
|
- "IP": self.LOCAL_IP,
|
|
|
- "SERVER_ADDRESSES": self.SERVER_ADDRESSES,
|
|
|
- "NAMESPACE": self.NAMESPACE,
|
|
|
- "DATA_ID": self.DATA_ID,
|
|
|
- "nacosGroup": self.GROUP}
|
|
|
- )
|
|
|
+ default_address = "192.168.3.80:8848"
|
|
|
+ self.LOCAL_IP = str(os.getenv("NACOS_REGISTER_IP", default=socket.gethostbyname(socket.gethostname())))
|
|
|
+ self.SERVER_ADDRESSES = default_address
|
|
|
+ self.NAMESPACE = "dev"
|
|
|
+ self.DATA_ID = "python-mendunr"
|
|
|
+ self.GROUP = "DEFAULT_GROUP"
|
|
|
|
|
|
def __new__(cls, *args, **kwargs):
|
|
|
- if nacos_service.__instance is None:
|
|
|
- nacos_service.__instance = object.__new__(cls, *args, **kwargs)
|
|
|
- return nacos_service.__instance
|
|
|
+ if NacosService.__instance is None:
|
|
|
+ NacosService.__instance = object.__new__(cls, *args, **kwargs)
|
|
|
+ return NacosService.__instance
|
|
|
|
|
|
### 获取配置
|
|
|
def getConfig(self):
|
|
@@ -47,9 +41,10 @@ class nacos_service:
|
|
|
|
|
|
### 注册实例
|
|
|
def register_instance(self):
|
|
|
- self.logger.info("注册nacos实例 分组: %s ", self.GROUP)
|
|
|
- self.logger.info("注册nacos实例 时间: %s ", time.strftime('%H:%M:%S', time.localtime(time.time())))
|
|
|
- res = requests.post(url=self.SERVER_ADDRESSES + "/nacos/v1/ns/instance",
|
|
|
+ if self._registered:
|
|
|
+ return
|
|
|
+
|
|
|
+ res = requests.post(url=f"http://{self.SERVER_ADDRESSES}/nacos/v1/ns/instance",
|
|
|
data={
|
|
|
'groupName': self.GROUP,
|
|
|
'metadata': '{"preserved.register.source":"SPRING_CLOUD","preserved.heart.beat.interval": 5500, "preserved.heart.beat.timeout": 30000, "preserved.ip.delete.timeout": 60000}',
|
|
@@ -60,79 +55,81 @@ class nacos_service:
|
|
|
'clusterName': 'DEFAULT',
|
|
|
'ip': self.LOCAL_IP,
|
|
|
'weight': 1,
|
|
|
- 'ephemeral': True,
|
|
|
+ 'ephemeral': False, # 修改这里为 False
|
|
|
'serviceName': self.GROUP + "@@" + self.DATA_ID
|
|
|
})
|
|
|
- self.logger.info("register_instance res %s", str(res.content, 'UTF-8'))
|
|
|
+ if res.status_code == 200:
|
|
|
+ self.logger.info("register_instance res %s", str(res.content, 'UTF-8'))
|
|
|
+ self._registered = True # 设置注册成功标志位
|
|
|
+ else:
|
|
|
+ self.logger.error(f"Failed to register instance: {res.status_code} - {res.text}")
|
|
|
+
|
|
|
def send_heartbeat(self):
|
|
|
try:
|
|
|
- res = requests.put(url=self.SERVER_ADDRESSES + "/nacos/v1/ns/instance/beat",
|
|
|
+ res = requests.put(url=f"http://{self.SERVER_ADDRESSES}/nacos/v1/ns/instance/beat",
|
|
|
data={
|
|
|
"ip": self.LOCAL_IP,
|
|
|
"port": "3333",
|
|
|
"namespaceId": self.NAMESPACE,
|
|
|
"serviceName": self.GROUP + "@@" + self.DATA_ID,
|
|
|
- # "groupName":self.GROUP,
|
|
|
"clusterName": "DEFAULT"}
|
|
|
- ).json()
|
|
|
- if res["code"] == 20404: ### 找不到资源重新注册
|
|
|
- self.register_instance()
|
|
|
- # continue
|
|
|
- # time.sleep(4)
|
|
|
- t = Timer(4, self.send_heartbeat) ## 2秒执行一次
|
|
|
+ )
|
|
|
+ if res.status_code == 200:
|
|
|
+ res_json = res.json()
|
|
|
+ if res_json["code"] == 20404: ### 找不到资源重新注册
|
|
|
+ self.register_instance()
|
|
|
+ else:
|
|
|
+ self.logger.error(f"Failed to send heartbeat: {res.status_code} - {res.text}")
|
|
|
+ t = Timer(4, self.send_heartbeat) ## 4秒执行一次
|
|
|
t.start()
|
|
|
except Exception as e:
|
|
|
- print(e)
|
|
|
+ self.logger.error(f"send_heartbeat error: {e}")
|
|
|
|
|
|
def getServer(self, serverName):
|
|
|
- res = requests.get(url=self.SERVER_ADDRESSES + "/nacos/v1/ns/instance/list",
|
|
|
- params={'namespaceId': self.NAMESPACE, 'serviceName': self.GROUP + "@@" + serverName})
|
|
|
- hosts = res.json()["hosts"]
|
|
|
- if len(hosts) > 0:
|
|
|
- return hosts[0]
|
|
|
+ try:
|
|
|
+ res = requests.get(url=f"http://{self.SERVER_ADDRESSES}/nacos/v1/ns/instance/list",
|
|
|
+ params={'namespaceId': self.NAMESPACE, 'serviceName': self.GROUP + "@@" + serverName})
|
|
|
+ if res.status_code == 200:
|
|
|
+ hosts = res.json()["hosts"]
|
|
|
+ if len(hosts) > 0:
|
|
|
+ return hosts[0]
|
|
|
+ else:
|
|
|
+ self.logger.error(f"Failed to get server list: {res.status_code} - {res.text}")
|
|
|
+ except Exception as e:
|
|
|
+ self.logger.error(f"getServer error: {e}")
|
|
|
return None
|
|
|
|
|
|
def start(self):
|
|
|
try:
|
|
|
- self.logger.info("启动参数: %s", {
|
|
|
- "IP": self.LOCAL_IP,
|
|
|
- "SERVER_ADDRESSES": self.SERVER_ADDRESSES,
|
|
|
- "NAMESPACE": self.NAMESPACE,
|
|
|
- "DATA_ID": self.DATA_ID,
|
|
|
- "nacosGroup": self.GROUP}
|
|
|
- )
|
|
|
self.CLIENT = nacos.NacosClient(self.SERVER_ADDRESSES, namespace=self.NAMESPACE)
|
|
|
self.register_instance()
|
|
|
self.send_heartbeat()
|
|
|
except Exception as e:
|
|
|
- print(e)
|
|
|
+ self.logger.error(f"start error: {e}")
|
|
|
|
|
|
def get_nacos_configs(self):
|
|
|
- url = self.SERVER_ADDRESSES + "/nacos/v1/cs/configs"
|
|
|
+ url = f"http://{self.SERVER_ADDRESSES}/nacos/v1/cs/configs"
|
|
|
params = {
|
|
|
'tenant': self.NAMESPACE,
|
|
|
'dataId': self.DATA_ID,
|
|
|
'group': self.GROUP
|
|
|
}
|
|
|
- r = requests.get(url, params)
|
|
|
- r.encoding = r.apparent_encoding
|
|
|
- r_dict = r.json()
|
|
|
- return r_dict
|
|
|
+ try:
|
|
|
+ r = requests.get(url, params)
|
|
|
+ r.encoding = r.apparent_encoding
|
|
|
+ if r.status_code == 200:
|
|
|
+ r_dict = r.json()
|
|
|
+ return r_dict
|
|
|
+ else:
|
|
|
+ self.logger.error(f"Failed to get Nacos configs: {r.status_code} - {r.text}")
|
|
|
+ except Exception as e:
|
|
|
+ self.logger.error(f"get_nacos_configs error: {e}")
|
|
|
+ return None
|
|
|
|
|
|
|
|
|
-nacos_service_single = nacos_service()
|
|
|
+nacos_service_single = NacosService()
|
|
|
|
|
|
|
|
|
# 发送url请求,获取nacos上的配置
|
|
|
def get_nacos_configs():
|
|
|
- url = nacos_service_single.SERVER_ADDRESSES + "/nacos/v1/cs/configs"
|
|
|
- params = {
|
|
|
- 'tenant': nacos_service_single.NAMESPACE,
|
|
|
- 'dataId': nacos_service_single.DATA_ID,
|
|
|
- 'group': nacos_service_single.GROUP
|
|
|
- }
|
|
|
- r = requests.get(url, params)
|
|
|
- r.encoding = r.apparent_encoding
|
|
|
- r_dict = r.json()
|
|
|
- return r_dict
|
|
|
-
|
|
|
+ return nacos_service_single.get_nacos_configs()
|