Python关于系统环境的最佳实践(python操作系统环境哪个好)

Python关于系统环境的最佳实践(python操作系统环境哪个好)

解决方案goocz2025-01-21 10:20:1419A+A-

如上篇【Ci/CD中nacos的正确使用姿势】所述。为了确保开发-测试-运维环节的交付件不经修改的传递,以规避可能的错误。在python中也可以使用类似的机制,通过dns、host、以及环境变量来管理系统环境参数,并让开发、测试、运维环节实现从代码到配置文件的不修改传递。

下面分别介绍下大、中、小型项目中的工具或编码方式。

Consul

Consul 是 HashiCorp 开发的一款开源工具,主要用于服务发现、配置管理和分布式系统的健康检查。它为微服务架构提供了强大的支持,能够帮助开发者和运维人员管理和协调服务之间的通信。Consul 是一个功能强大的工具,适用于需要服务发现和配置管理的分布式系统。它的多数据中心支持、健康检查和安全性功能使其成为 微服务架构中不可或缺的一部分。通过 Consul,开发者可以更轻松地管理和协调服务,提高系统的可靠性和可维护性。以下是 Consul 的一些主要特性和功能:

  1. 服务发现 :Consul 提供了服务发现的功能,使得服务能够动态地注册和发现其他服务。服务在启动时可以向 Consul 注册其信息(如地址、端口等 ),而其他服务可以查询 Consul 来获取这些信息。
  2. 健康检查:Consul 支持对注册服务进行健康检查。您可以配置 HTTP 或 TCP 健康检查,Consul 会定期检查服务的健康状态,并在服务不可用时将 其从服务列表中移除。
  3. 分布式键值存储:Consul 提供了一个分布式的键值存储,允许用户存储应用程序配置、状态信息等数据。开发者可以通过 Consul 的 API 读取和写入这些数据。
  4. 多数据中心支持:Consul 支持多数据中心的配置,能够在多个数据中心之间进行服务发现和健康检查。这使得在分布式环境中进行服务管理变得更加简单 。
  5. ACL 和安全性:Consul 提供了访问控制列表(ACL),允许用户对不同的服务和操作进行权限管理。这有助于保护敏感数据和确保系统的安全性。
  6. UI 和 API:Consul 提供了一个用户友好的 Web UI,方便用户查看服务的状态、健康检查结果和配置数据。此外,Consul 还提供了 RESTful API, 允许开发者通过编程方式与 Consul 进行交互。

Consul适合大型项目中用来作为配置中心和名字服务。主要使用场景如下:

  1. 微服务架构:在微服务架构中,Consul 可以简化服务之间的通信和管理。
  2. 动态基础设施:在云环境中,Consul 可以帮助动态地发现和管理服务。
  3. 配置管理:Consul 的键值存储功能可以用于集中管理应用程序的配置。

etcd

etcd 是一个开源的分布式键值存储系统,旨在提供高可用性和一致性的数据存储。它由 CoreOS 开发,广泛用于配置管理、服务发 现和分布式系统中的数据共享。etcd 基于 Raft 共识算法,确保数据在集群中的一致性和可靠性。以下是 etcd 的一些主要特性和功能 :

  1. 分布式键值存储:etcd 是一个分布式的键值存储系统,可以存储任意结构的数据。用户可以通过简单的 API 存储和检索键值对,适合用于配置管理和状态存储。
  2. 高可用性和一致性:etcd 使用 Raft 算法来实现数据的一致性和高可用性。即使在网络分区或节点故障的情况下,etcd 也能保持数据的一致性,确保系统的可靠性。
  3. 观察者模式:etcd 支持观察者模式,允许客户端观察特定键的变化。当键的值发生变化时,etcd 会通知所有订阅该键的客户端。这使得应用程序能够实时响应配置变化。
  4. 多版本并发控制(MVCC):etcd 实现了多版本并发控制,允许同时进行读写操作而不会相互干扰。这提高了系统的性能和响应速度。
  5. 安全性:etcd 支持通过 TLS 加密数据传输,确保数据在网络中的安全性。此外,etcd 还提供访问控制列表(ACL),允许用户对不同的操作和数据进行权限管理。
  6. 成和生态系统:etcd 与 Kubernetes 紧密集成,作为 Kubernetes 的后端存储,管理集群的状态和配置。此外,etcd 也可以与其他工具和服务(如 Consul、Docker Swarm 等)一起使用,成为分布式系统中的重要组成部分。

etcd 是一个功能强大且可靠的分布式键值存储系统,适合用于需要高可用性和一致性的分布式应用。它的观察者模式和多版本并发控制 特性使其在微服务架构和云计算环境中得到了广泛应用。通过 etcd,开发者能够更轻松地管理和协调分布式系统中的数据,提高系统的 可靠性和可维护性。其主要使用场景如下:

  1. 配置管理:etcd 可以用于集中管理应用程序的配置,确保所有实例都能获取最新的配置信息。
  2. 服务发现:通过存储服务的地址和状态,etcd 可以帮助实现服务的动态发现。
  3. 分布式锁:etcd 的原子操作特性可以用于实现分布式锁,确保在分布式环境中对资源的安全访问。

zookeeper

Apache Zookeeper 是一个开源的分布式协调服务,用于管理大型分布式系统中的配置信息、命名、同步和提供组服务。它由 Yahoo 开发,后来成为 Apache 软件基金会的一部分。Zookeeper 提供了一种简单的接口来实现分布式应用程序的协调和管理,确保系统的高可用性和可靠性。其主要特性如下:

  1. 高可用性: Zookeeper 通过复制机制确保数据的高可用性。它的集群由多个节点组成,称为 Zookeeper 服务器,能够在某些节点故障时继续提供服务。
  2. 一致性: Zookeeper 确保在所有节点之间的数据一致性。它使用一种称为“顺序一致性”的机制,保证客户端读取到的数据是最新的,并且所有 更新操作都是有序的。
  3. 简单的 API: Zookeeper 提供了简单的 API,允许开发者以键值对的形式存储数据。数据以树形结构组织,称为 ZNode,每个 ZNode 可以存储数据和子 ZNode。
  4. 观察者模式: 客户端可以在 ZNode 上注册观察者,当 ZNode 的数据或状态发生变化时,Zookeeper 会通知所有注册的客户端。这使得应用程序能 够实时响应配置变化。
  5. 分布式锁: Zookeeper 支持分布式锁的实现,允许多个进程安全地访问共享资源,避免数据竞争和冲突。
  6. 事务支持: Zookeeper 支持原子操作,可以对多个 ZNode 执行事务性操作,确保操作的原子性和一致性。

Zookeeper 的工作原理基于一个简单的客户端-服务器模型:

  • 客户端:应用程序通过 Zookeeper 客户端与 Zookeeper 服务器进行交互,发送请求和接收通知。
  • 服务器:Zookeeper 服务器负责存储数据、处理客户端请求和维护数据一致性。服务器之间通过投票机制达成共识,确保数据的一致性。

Zookeeper 被广泛应用于以下场景:

  1. 配置管理:集中管理分布式系统中的配置信息,确保各个节点能够获取最新的配置。
  2. 服务发现:在微服务架构中,Zookeeper 可以帮助服务之间的动态发现和注册。
  3. 分布式锁:实现分布式环境中的锁机制,确保对共享资源的安全访问。
  4. 领导者选举:在分布式系统中,Zookeeper 可以用来选举领导者,确保系统的高可用性。

Apache Zookeeper 是一个强大且可靠的分布式协调服务,适用于需要高可用性和一致性的分布式应用程序。其简单易用的 API 和强大的功能使其成为微服务架构和分布式系统中的重要组成部分。通过 Zookeeper,开发者能够更轻松地管理和协调分布式系统中的资源,提高系统的可靠性和可维护性。

使用consul、etcd、zookeeper

在python使用上述工具很简单,如下



小型系统的编码方式

将系统环境相关的配置项,规范出来,给出明确边界。


充分借助环境参数进行维护,是一个好的办法,可避免交付件传递过程中的无序和错误。

下面以数据库的系统参数配置作为实例介绍下最佳姿势。

  1. 环境变量:将敏感信息(如数据库凭据)存储在环境变量中。这可以将它们与源代码分离,并允许在不修改代码的情况下轻松更 改配置。
  2. 配置文件:使用配置文件(例如 .ini、.json、.yaml 或 .env)来管理非敏感的配置设置。这使得在不改变代码库的情况下更改设置变得简单。
  3. 使用配置管理库:使用像 configparser、pydantic 或 dotenv 这样的库可以简化配置设置的管理。
  4. 验证:验证配置设置,以确保它们符合预期的格式和约束。
  5. 封装:将数据库配置和连接封装在类或模块中,以促进重用和组织。

.env 文件应该放在项目的根目录下,通常是与您运行的主 Python 脚本(即主程序)位于同一目录。这使得 python-dotenv 库能够在您的应用程序启动时找到并加载该文件中定义的环境变量。

  1. 示例目录结构

以下是您的项目目录可能的结构示例:

my_project/
│
├── .env
├── main.py
├── requirements.txt
└── other_modules/
├── module1.py
└── module2.py
  1. 访问 .env 文件

在您的 Python 代码中,您可以使用以下方式加载 .env 文件中的环境变量:

from dotenv import load_dotenv
import os
# 从 .env 文件加载环境变量
load_dotenv()
# 现在可以访问这些变量
mysql_user = os.getenv("MYSQL_USER")
mysql_pass = os.getenv("MYSQL_PASS")
  1. 要点

文件权限:确保 .env 文件具有适当的权限,以便您的应用程序可以读取它。

版本控制:如果您使用 Git,建议将 .env 文件添加到 .gitignore 文件中,以避免将敏感信息提交到版本控制中。

多个环境:如果您有不同的环境(例如开发、测试、生产),您可能希望为每个环境创建单独的 .env 文件(例如 .env.development、.env.production),并根据当前环境加载适当的文件。

通过将 .env 文件放在项目的根目录中,您可以确保它易于访问,并且您的应用程序可以顺利加载所需的配置设置。


#.env
MYSQL_USER=root
MYSQL_PASS=rootpwd
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_DB=db_name
#main.py
import os
from dotenv import load_dotenv
import pymysql  # 确保安装 pymysql

# 从 .env 文件加载环境变量
load_dotenv()

class MySQLConfig:
    def __init__(self):
        self.user = os.getenv("MYSQL_USER")
        self.passwd = os.getenv("MYSQL_PASS")
        self.host = os.getenv("MYSQL_HOST")
        self.port = int(os.getenv("MYSQL_PORT"))
        self.db = os.getenv("MYSQL_DB")

        # 验证配置
        self.validate_config()

    def validate_config(self):
        if not all([self.user, self.passwd, self.host, self.db]):
            raise ValueError("数据库配置参数不能为空。")

    def generate_conn_str(self):
        return f"mysql+pymysql://{self.user}:{self.passwd}@{self.host}:{self.port}/{self.db}"

# 示例用法
try:
    config = MySQLConfig()
    conn_str = config.generate_conn_str()
    print("连接字符串:", conn_str)  # 输出连接字符串

    # 示例:连接到数据库
    connection = pymysql.connect(
        host=config.host,
        user=config.user,
        password=config.passwd,
        database=config.db,
        port=config.port
    )
    print("成功连接到数据库!")

    with connection.cursor() as cursor:
        # show DATABASES 将列出所有数据库
        cursor.execute("SHOW DATABASES")
        dbs = cursor.fetchall()
        for (db_name,) in dbs:
            print(db_name)
            # 看db下的表
            cursor.execute("SELECT table_name FROM information_schema.tables WHERE table_schema = '{}' and TABLE_TYPE='BASE TABLE'".format(db_name))
            tables = cursor.fetchall()
            for (table_name,) in tables:
                print(f"{' '*len(db_name)}{table_name}")


    connection.close()

except ValueError as e:
    print(f"配置错误: {e}")
except pymysql.MySQLError as e:
    print(f"数据库连接错误: {e}")

参考资料:

  1. Consul : https://www.consul.io/
  2. etcd: https://etcd.io/
  3. 示例代码 :https://gitee.com/wapuboy/learning-programming-with-gauss/tree/master/code/python/src/config
点击这里复制本文地址 以上内容由goocz整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

果子教程网 © All Rights Reserved.  蜀ICP备2024111239号-5