**微服务:**有些人喜欢它们,因为它们可以将单体应用分解成更易于管理的分布式服务;有些人讨厌它们,因为试图协调几十个分布式服务以完成一项简单的任务会产生复杂性。无论你对微服务的爱憎如何,不可否认的是,微服务的兴起对分布式软件架构产生了重大影响,它鼓励组件的可重用性。
在本教程中,我将介绍微服务架构的概念以及为什么Python是创建微服务的最佳选择。但学习微服务的最好方法是建立一个,所以这就是我们要做的。
- 定义为Spotify创建音乐视频播放列表的实施方案
- 获取Spotify和YouTube API的凭据,并创建一个微服务来混合它们
- 使用Flask将我们的微服务作为一个API建立起来
- 使用pytest对API进行测试
- 为我们的微服务创建持续集成(CI)。
听起来很有趣?让我们开始吧。
在你开始之前。安装Spotify视频的Python环境
为了跟上本文的代码,你可以下载并安装我们预先建立 的Spotify Videos环境,其中包含Python 3.9版本和本文中使用的软件包。
为了下载这个随时可用的Python环境,你需要创建一个 ActiveState Platform 账户。只需使用你的GitHub凭证或你的电子邮件地址来注册。注册很简单,它可以为你解锁ActiveState平台的许多好处
或者你也可以使用我们的 State工具 来安装这个运行时环境。
对于Windows用户,在CMD提示下运行以下程序,就可以自动下载并安装我们的CLI、State工具以及 Spotify视频 到一个虚拟环境中。
powershell -Command "& $([scriptblock]::Create((New-Object Net.WebClient).DownloadString('https://platform.activestate.com/dl/cli/install.ps1'))) -activate-default Pizza-Team/Spotify-Videos"
对于Linux用户,运行下面的程序来自动下载并安装我们的CLI、State工具 以及Spotify视频 到一个虚拟环境中。
sh <(curl -q https://platform.activestate.com/dl/cli/install.sh) --activate-default Pizza-Team/Spotify-Videos
微服务和Python
微服务的发展跨越了大约三十年,从。
- 面向服务的架构(SOA),它在90年代就定义了分布式服务的许多方面的服务治理(如发现、注册、日志和可观察性)。不幸的是,大多数开发者只记得处理SOAP和WSDL标准的痛苦,这些标准是基于极其冗长的XML。
- 微服务架构,提倡使用小型、独立的服务,这些服务有专门的接口,可以独立扩展,同时还可以相互通信,通常通过HTTP协议。标准已经从最初的REST发展到更现代的(不那么健谈的)GraphQL。
就像任何流行语一样,微服务这个词被使用、误用和滥用了。一般来说,一个真正的微服务。
- 围绕业务能力构建
- 可独立部署和打包,每个实例在自己的流程中运行
- 有一个独立的数据存储层
- 有一个孤立的开发、测试和部署环境,没有任何外部依赖性
- 提供单一的应用程序接口(API),这是唯一可能的连接方式。
Python是实现微服务的最佳选择,不仅是因为语言本身的巨大优势,还因为它很适合在微服务架构中使用,通过。
- Flask、FastAPI和Nameko等框架
- 消息格式 ,如JSON(JavaScript对象符号)和协议缓冲器
- HTTP(同步)和AMQP(异步)等协议
- 通信样式,如单接收器(只有一个服务会处理一个请求)或多接收器(零、一或多个服务可以处理一个请求)。
1-Python微服务实现
Spotify是一个介绍新歌的好方法,但我常常希望能看看与之配套的音乐视频。我总是可以把歌曲的名字插入YouTube,看看是否能获得点击率,但这比我通常愿意投入的精力要多得多。但是,如果我可以通过一次点击就能获得歌曲和视频呢?
想象一下,一个微服务的唯一目的是为Spotify的全球播放列表中的前50首歌曲找到最相关的YouTube视频。这个微服务将。
- 连接到Spotify的公共API,拉出前50名的列表
- 连接到YouTube公共API,并根据前50名的列表运行查询
- 向用户返回一个由歌曲的一些元信息组成的列表,以及它找到的相应视频。
下图是 该微服务的系统上下文图 。
为了完成上图中的任务,你需要。
- 获得Spotify (应用授权)API 的安全 凭证
- 获得YouTube (GCP项目的API密钥和YouTube数据API启用)API 的安全 证书
- 使用 Spotipy创建一个围绕Spotify API的Python包装器 ,以查询全局的歌曲列表
- 使用Python-youtube创建一个围绕YouTube API的Python包装器 ,以搜索相应的视频。
2-Spotify的音乐视频播放列表
下面的代码显示了我们的样本微服务中的核心逻辑,它查询API并返回结果。
def
正如你所看到的,第一行。
- 查询Spotify 获取播放列表的 公共API方法
- 封装器使用来自环境变量 SPOTIPY_CLIENT_ID 和 _SPOTIPY_CLIENT_SECRET_的密钥/秘密组合来处理认证 。
- 播放列表和歌曲数量被作为参数传递。
- 在迭代每首歌曲以获得YouTube结果之前,对API返回的结果数量进行细微验证。
3-通过Flask查询微服务
我们的微服务中的逻辑非常简单,但你可以通过对YouTube API进行异步调用和正确处理异常来改进它。为了简单起见,我们只需写一个函数,将逻辑包裹在Flask的HTTP(同步)端点上。
@app.route
这个函数有两个有趣的地方。
- 一个路由映射注解,它被定义为REST API风格的HTTP GET方法。
- 实际上,这个微服务在严格意义上并不完全是RESTful。欲了解更多信息,请点击 此链接。
- 一个文档字符串,它指向一个Swagger/OpenAPI文档文件,该文件使用 Flagger Flask扩展来提供该微服务公共API的实时文档。
当你运行Flask应用程序时,运行 http://localhost:5000/apidocs 端点的开发服务器 会让你访问围绕微服务逻辑的API包装。
这个GET方法的图形显示了参数、类型和默认值,以及预期响应结构和HTTP代码。它还可以让你直接从浏览器上尝试服务。
4-测试微服务
微服务应该是自成一体的,并且独立测试。为了给我们的微服务添加一个简单的测试,我们将使用 pytest 创建一个 test_app.py 文件并添加以下代码。
import
这个测试结构很简单。
- 它为Flask应用设置了一个客户端
- 设置请求参数的默认值(响应的长度应该是10项
- 调用GET端点。
要运行更详细的测试,你应该包括错误代码的断言,并再次测试无效的参数。你可以用一个简单的命令行调用来运行测试。
python -m pytest
5-微服务持续集成
持续集成(CI)是一个过程,涉及到根据被推送到存储库的源代码的变化自动构建和测试软件。微服务是应用(CI)的完美用例,因为它们是独立的,应该包括CI的配置。
幸运的是,你可以在GitHub的公开托管仓库中找到一个运行CI工作流程的工具。你只需要添加一个 .github/workflows/flask.yml 文件来配置一个基本的依赖/构建/测试动作。
name
该工作流程相当容易理解。每次 推送版本 库的_主_ 分支时,这些动作都以瀑布模式运行 ,每次执行后你都会收到一封通知邮件。你还可以将持续集成的结果链接到README中,以获得关于状态的即时反馈。
结论。Python让微服务变得简单
微服务通常容易上手,但很难掌握。只要记住你需要的核心部分就可以了。
- 明确的范围界限
- 一个可行的设计
- 一套测试
鉴于上述情况,编码逻辑和构建项目应该很容易。
虽然我们在本教程中停止了CI,但一个完整的微服务的最后一步是部署,这也可以通过 持续部署 (CD) 自动化 。当然,一旦你部署了一个具有微服务架构的应用程序,你就需要处理分布式系统固有的异质性和复杂性。
微服务从实施到运行的复杂性都在增加。要处理这种复杂性并不容易,但有许多服务可以帮助你。你可能想从阅读一些文章开始,这些文章建议从单体代码开始,然后应用模式,在需求稳定后才将其迁移到微服务。
关于有效实现微服务的更多信息,请参考 fullstackpython.com、 vinaysahni.com和 realpython.com的这些文章 。
- 文章中使用的所有代码都可以在GitHub上找到。
- 下载我们的Spotify VideosPython环境,建立你自己的微服务,为你的Spotify播放列表拉入音乐视频。
通过ActiveState Platform,你可以在几分钟内创建你的Python环境,就像我们为这个项目建立的一样。自己尝试一下,或者了解更多关于它如何帮助Python开发者提高工作效率的信息。