如何在Python中使用FastApi进行微服务
#python #fastapi #microservices #backend

您可以使用微服务来用于各种后端功能,但请记住,您需要很好地了解它们才能获得全部利益。访问本教程,以指导您在Python中精心使用微服务。我们将向您介绍使用FastApi创建两个简单的微服务来对用户进行身份验证并显示信息。

在过去的几年中,我们可以看到IT行业从整体应用转向微服务的趋势。今天,我们将描述运动背后的想法,概述方法的优点和缺点,并展示如何使用Fastapi Python框架与微服务一起工作。

准备好了吗?那就去!

微服务。他们如何工作?

Microservices

微服务体系结构将软件应用程序的功能部分解耦功能部分的概念将功能部分分解为轻质,可部署的解决方案,每个解决方案在一般生态系统中都有自己的目标。该方法已被许多领先的公司(例如Netflix,Amazon,Apple)采用,并且非常适合任何想要采用敏捷方法进行软件生产的业务。

让我们描述微服务体系结构的一些关键特征:

1。多个组件

  • 每个服务都是自己的独立组成部分,
  • 组件部署,更换和删除是可能的,而不会损害其他服务,
  • 您具有相对显式的组件接口,而无需紧密数据耦合。

2。面向业务

  • 这些服务是围绕业务环境和需求构建的
  • 每个微服务是自己的产品,
  • 微服务需要拥有管理各自产品的跨职能团队。

3。智能连接

4。分散一切

  • 每个服务都有自己的资源和数据存储,
  • 命名决定在整个系统中可能有所不同,
  • 您需要实现Data Transfer Objects(dtos)进行通信。

5。让它失败

  • 微服务必须确认其他服务可能会失败,
  • 服务故障由于可用性问题,例如连接问题,服务器停机时间等。

您通常可以使用API​​网关形式的其他架构层来简化客户端应用程序从系统收集数据所需的连接。

这种方法有缺点。因此,请记住,API网关可以:

  • 增加客户请求的响应时间
  • 如果无法正确缩放,成为瓶颈,
  • 添加另一个(可能的)失败的点,
  • 增加维护成本。

我应该实施微服务吗?利弊。

正如我们已经了解了什么是微服务,我们还应该讨论为您的项目选择这种类型的架构的积极和负面影响。您可以将下表视为为您的下一个产品选择正确的建筑设置的“备忘单”。

,信息障碍
阳性 负面
每个服务都可以自行运行 服务之间的通信延迟以获得最终响应
由于服务模块化而少的开发时间 多个微服务之间的测试可能是一个挑战
基础架构缩放取决于单个服务 支持多个实例的成本可以快速扩展
更容易添加新功能或禁用现有的功能 由于数据提供的其他层
代码是由业务逻辑组织的 某些用例可以跨越多个服务
独立于旧代码堆栈 支持一个系统中多个代码堆栈
真棒故障隔离 创建DTO和故障机制所需的其他工作

微服务的FastApi实施

现在,我们知道了微服务背后的理论,我们准备创建一个应用程序,该应用程序将使用架构为用户提供一些信息。我们将使用上述fastapi实现此目标。

但是等等...什么是Fastapi?

我很高兴您问!让我们看看我们可以在框架的官方网站上阅读的内容:

fastapi是一个现代,快速(高性能),用于使用标准Python类型提示的3.6+构建API的网络框架。

该框架的官方网站提到了Fastapi的许多专业人士。在我看来,从微服务角度来看,最有用的功能是:代码的简单性(易于使用和避免样板),由于StarlettePydantic的高运营能力,以及与行业标准的兼容性-OpenAPIJSON Schema

我们没有烧瓶吗?

虽然这两个框架都非常适合创建API,但FastApi比Flask具有一些关键优势:

  • 更轻松的视图声明,
  • 开箱即用的数据验证,
  • FastAPI错误消息默认显示为JSON格式,
  • 它通过ASGI支持异步任务。

Fastapi是一个年轻得多的框架,它实施了许多当今API创建的标准,成为编码社区中街区的酷孩子,并迅速越来越受欢迎。

安装FastApi

您可以使用PIP工具安装FastApi:

pip install fastapi

要运行服务器,您还需要安装Uvicorn

pip install "uvicorn[standard]"

就是一切!

我们准备使用fastapi编写第一个微服务。

问题定义

我们将创建两个简单的服务:

  • 将检查提供的令牌是否正确的auth_service
  • 一个将为您所有问题提供答案的information_service

介意,这两种服务都将是超级简化,只是为了展示实践中的理论。如果您想学习如何在FastApi中正确实施身份验证,请参考this tutorial

创建身份服务

让我们首先创建auth_service.py文件并添加代码工作所需的导入:

from typing import Optional

from fastapi import FastAPI, Header, Response
from starlette.status import HTTP_200_OK, HTTP_401_UNAUTHORIZED

现在创建FastApi应用程序:

app = FastAPI()

我们需要编码的只是POST登录视图。视图的响应将取决于标题中的Authorization值。这将为我们提供两个可能的结果:

  • OK,如果Authorization标头具有值"merixstudio"
  • UNAUTHORIZED,在任何其他情况下。
@app.post("/login/")
def login(
   authorization: Optional[str] = Header(None)
) -> Response:
    if not authorization == "merixstudio":
        return Response(status_code=HTTP_401_UNAUTHORIZED)
    return Response(status_code=HTTP_200_OK)

使用Uvicorn,我们可以在端口8001上启动我们的服务:

uvicorn auth_service:app --reload --port 8001

信息服务创建

现在,我们已经启动并运行了验证服务,我们可以创建信息服务。创建info_service.py并添加以下导入:

from functools import wraps
from typing import Any, Callable, Optional

import requests
from fastapi import FastAPI, Header, Response
from fastapi.responses import JSONResponse

再次,我们将创建FastAPI应用程序。

app = FastAPI()

我们需要定义我们将在auth_service中联系的端点:

LOGIN_ENDPOINT = "http://127.0.0.1:8001/login/"

现在,我们将编写一个自定义的Python装饰器,该装饰器将联系Auth_Service,检查是否可以授权用户并抛出异常,如果可以的话。当没有错误时,端点将正常运行。

def auth_required(func: Callable) -> Callable:
    @wraps(func)
    def wrapper(*args: Any, **kwargs: Any):
        try:
            response = requests.post(
               url=LOGIN_ENDPOINT,
               headers={
                  "Authorization": kwargs["authorization"],
               },
            )
            response.raise_for_status()
            return func(*args, **kwargs)
        except requests.HTTPError as error:
            return Response(
               status_code=error.response.status_code
            )

    return wrapper

我们可以立即定义信息终点,并使用您需要的所有答案。注意我们刚刚创建的@auth_required装饰器:

@app.get("/info/")
@auth_required
def get_information(
   authorization: Optional[str] = Header(None)
) -> JSONResponse:
    return JSONResponse(content={"info": "The answer is 42."})

我们可以在端口8000上启动此服务,再次使用Uvicorn:

uvicorn auth_service:app --reload --port 8000

一起运行微服务

我们将使用卷发向API提出一些请求。让我们完全没有标题开始:

>> curl http://127.0.0.1:8000/info/ -i
HTTP/1.1 401 Unauthorized

您可以看到,我们获得了从auth_service转移的401 Unauthorized状态。如果我们通过正确的标题,我们将得到以下响应:

>> curl http://127.0.0.1:8000/info/ -i --header "Authorization: merixstudio"
HTTP/1.1 200 OK
{"info":"The answer is 42."}

它有效!太好了!

结论

在今天的博客文章中,我们了解了什么是微服务。我们讨论了在您的项目中使用基于微服务的架构的利弊。近年来,许多大公司都在其产品中使用了微服务架构:亚马逊,Netflix,Uber,Spotify ...或来自波兰游乐场的OLX。随着越来越多的公司将其基础设施转移到云中,这种趋势可能会持续下去。对于后端软件开发的未来,无服务器的微服务可能很重要。