|
@@ -1,71 +1,134 @@
|
|
-import json
|
|
|
|
-import platform
|
|
|
|
-from flask import Flask
|
|
|
|
-from nacos import NacosClient
|
|
|
|
|
|
+import nacos
|
|
|
|
+import socket
|
|
|
|
+from threading import Timer
|
|
|
|
+import logging
|
|
|
|
+import time
|
|
|
|
+import os
|
|
|
|
+import requests
|
|
|
|
|
|
-app = Flask(__name__)
|
|
|
|
|
|
|
|
-config_json = {
|
|
|
|
- "local": {
|
|
|
|
- "address": "192.168.3.80:8848",
|
|
|
|
- "namespace": "dev",
|
|
|
|
- "username": "nacos",
|
|
|
|
- "password": "nacos",
|
|
|
|
- "data_id": "python-mendunr",
|
|
|
|
- "group": "DEFAULT_GROUP"
|
|
|
|
- },
|
|
|
|
- "production": {
|
|
|
|
- "address": "127.0.0.1:8848",
|
|
|
|
- "namespace": "dev",
|
|
|
|
- "username": "nacos",
|
|
|
|
- "password": "2099citu##$$**.com",
|
|
|
|
- "data_id": "python-mendunr",
|
|
|
|
- "group": "DEFAULT_GROUP"
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
|
|
+class nacos_service:
|
|
|
|
+ CLIENT = None
|
|
|
|
+ DATA_ID = None
|
|
|
|
+ GROUP = None
|
|
|
|
+ LOCAL_IP = None
|
|
|
|
+ SERVER_ADDRESSES = None
|
|
|
|
+ NAMESPACE = None
|
|
|
|
+ logger = logging.getLogger('app') # 这里设置名字
|
|
|
|
+
|
|
|
|
+ __instance = None
|
|
|
|
|
|
|
|
+ def __init__(self):
|
|
|
|
+ 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="http://192.168.3.80:8848"))
|
|
|
|
+ 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}
|
|
|
|
+ )
|
|
|
|
|
|
-class NacosConfig:
|
|
|
|
- def __init__(self, environment='local'):
|
|
|
|
- env_config = config_json[environment]
|
|
|
|
- self.SERVER_ADDRESSES = env_config['address']
|
|
|
|
- self.NAMESPACE = env_config['namespace']
|
|
|
|
- self.USERNAME = env_config['username']
|
|
|
|
- self.PASSWORD = env_config['password']
|
|
|
|
- self.data_id = env_config['data_id']
|
|
|
|
- self.group = env_config['group']
|
|
|
|
- self.client = NacosClient(server_addresses=self.SERVER_ADDRESSES, namespace=self.NAMESPACE,
|
|
|
|
- username=self.USERNAME, password=self.PASSWORD)
|
|
|
|
- self.config_data = None
|
|
|
|
|
|
+ def __new__(cls, *args, **kwargs):
|
|
|
|
+ if nacos_service.__instance is None:
|
|
|
|
+ nacos_service.__instance = object.__new__(cls, *args, **kwargs)
|
|
|
|
+ return nacos_service.__instance
|
|
|
|
|
|
- def load_config(self):
|
|
|
|
- """从Nacos加载配置"""
|
|
|
|
- config_str = self.client.get_config(data_id=self.data_id, group=self.group)
|
|
|
|
- self.config_data = json.loads(config_str) if config_str else {}
|
|
|
|
- return self.config_data
|
|
|
|
|
|
+ ### 获取配置
|
|
|
|
+ def getConfig(self):
|
|
|
|
+ return self.CLIENT.get_config(self.DATA_ID, self.GROUP)
|
|
|
|
|
|
- def get_config(self):
|
|
|
|
- """返回当前加载的配置数据"""
|
|
|
|
- if self.config_data is None:
|
|
|
|
- self.load_config()
|
|
|
|
- return self.config_data
|
|
|
|
|
|
+ ### 注册实例
|
|
|
|
+ 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",
|
|
|
|
+ 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}',
|
|
|
|
+ 'namespaceId': self.NAMESPACE,
|
|
|
|
+ 'port': 3333,
|
|
|
|
+ 'enable': True,
|
|
|
|
+ 'healthy': True,
|
|
|
|
+ 'clusterName': 'DEFAULT',
|
|
|
|
+ 'ip': self.LOCAL_IP,
|
|
|
|
+ 'weight': 1,
|
|
|
|
+ 'ephemeral': True,
|
|
|
|
+ 'serviceName': self.GROUP + "@@" + self.DATA_ID
|
|
|
|
+ })
|
|
|
|
+ self.logger.info("register_instance res %s", str(res.content, 'UTF-8'))
|
|
|
|
+ def send_heartbeat(self):
|
|
|
|
+ try:
|
|
|
|
+ res = requests.put(url=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秒执行一次
|
|
|
|
+ t.start()
|
|
|
|
+ except Exception as e:
|
|
|
|
+ print(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]
|
|
|
|
+ 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)
|
|
|
|
|
|
-# 根据操作系统选择环境
|
|
|
|
-plat = platform.system().lower()
|
|
|
|
-environment = 'local' if plat == 'windows' else 'production'
|
|
|
|
-nacos_config = NacosConfig(environment=environment)
|
|
|
|
-configs = nacos_config.get_config()
|
|
|
|
|
|
+ def get_nacos_configs(self):
|
|
|
|
+ url = 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
|
|
|
|
|
|
|
|
|
|
-@app.route('/config')
|
|
|
|
-def get_config_route():
|
|
|
|
- """返回当前配置,或者可以选择在这里重新加载配置"""
|
|
|
|
- # 可以在这里选择是否重新加载配置,或者根据需要进行其他逻辑处理
|
|
|
|
- # nacos_config.load_config() # 如果需要每次请求都检查更新,可以取消注释这行代码
|
|
|
|
- return json.dumps(nacos_config.get_config())
|
|
|
|
|
|
+nacos_service_single = nacos_service()
|
|
|
|
|
|
|
|
|
|
-if __name__ == '__main__':
|
|
|
|
- app.run(debug=True)
|
|
|
|
|
|
+# 发送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
|
|
|
|
+
|