在 Kubernetes 上使用 Flask 搭建 Python 微服务


在 Kubernetes 上使用 Flask 搭建 Python 微服务

文章插图
导读:微服务遵循领域驱动设计(DDD),与开发平台无关 。Python/ target=_blank class=infotextkey>Python 微服务也不例外 。Python3 的面向对象特性使得按照 DDD 对服务进行建模变得更加容易 。
本文字数:12786,阅读时长大约: 15分钟
微服务遵循领域驱动设计(DDD),与开发平台无关 。Python 微服务也不例外 。Python3 的面向对象特性使得按照 DDD 对服务进行建模变得更加容易 。本系列的第 10 部分演示了如何将用户管理系统的查找服务作为 Python 微服务部署在 Kube.NETes 上 。
微服务架构的强大之处在于它的多语言性 。企业将其功能分解为一组微服务,每个团队自由选择一个平台 。
我们的用户管理系统已经分解为四个微服务,分别是添加、查找、搜索和日志服务 。添加服务在 JAVA 平台上开发并部署在 Kubernetes 集群上,以实现弹性和可扩展性 。这并不意味着其余的服务也要使用 Java 开发,我们可以自由选择适合个人服务的平台 。
让我们选择 Python 作为开发查找服务的平台 。查找服务的模型已经设计好了(参考 2022 年 3 月份的文章),我们只需要将这个模型转换为代码和配置 。
Pythonic 方法
Python 是一种通用编程语言,已经存在了大约 30 年 。早期,它是自动化脚本的首选 。然而,随着 Django 和 Flask 等框架的出现,它的受欢迎程度越来越高,现在各种领域中都在应用它,如企业应用程序开发 。数据科学和机器学习进一步推动了它的发展,Python 现在是三大编程语言之一 。
许多人将 Python 的成功归功于它容易编码 。这只是一部分原因 。只要你的目标是开发小型脚本,Python 就像一个玩具,你会非常喜欢它 。然而,当你进入严肃的大规模应用程序开发领域时,你将不得不处理大量的ifelse,Python 变得与任何其他平台一样好或一样坏 。例如,采用一种面向对象的方法!许多 Python 开发人员甚至可能没意识到 Python 支持类、继承等功能 。Python 确实支持成熟的面向对象开发,但是有它自己的方式 -- Pythonic!让我们探索一下!
领域模型
AddService通过将数据保存到一个 MySQL 数据库中来将用户添加到系统中 。FindService的目标是提供一个 REST API 按用户名查找用户 。域模型如图 1 所示 。它主要由一些值对象组成,如User实体的NamePhoneNumber以及UserRepository
在 Kubernetes 上使用 Flask 搭建 Python 微服务

文章插图
图 1: 查找服务的域模型
让我们从Name开始 。由于它是一个值对象,因此必须在创建时进行验证,并且必须保持不可变 。基本结构如所示:
 
  1. class Name:
     
  2. value: str
     
  3. def __post_init__(self):
     
  4. if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:
     
  5. raise ValueError("Invalid Name")
     
如你所见,Name包含一个字符串类型的值 。作为后期初始化的一部分,我们会验证它 。
Python 3.7 提供了@dataclass装饰器,它提供了许多开箱即用的数据承载类的功能,如构造函数、比较运算符等 。如下是装饰后的Name类:
 
  1. from dataclasses import dataclass
     
  2. @dataclass
  3. class Name:
  4. value: str
  5. def __post_init__(self):
  6. if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:
  7. raise ValueError("Invalid Name")
 
以下代码可以创建一个Name对象:
 
  1. name = Name("Krishna")
value属性可以按照如下方式读取或写入:
 
  1. name.value = https://www.isolves.com/it/cxkf/yy/Python/2022-10-20/"Mohan"
     
  2. print(name.value)
     
可以很容易地与另一个Name


推荐阅读