1 小时上线之用 Flask 开发一个短信微服务

2020-07-02 00:00:00 微服 开发 配置 日志 环境变量

前言

Flask 是 Python 开发的轻量 Web 框架,有多轻量呢?10 行以内就可以开发一个 Web 服务,不过这只能用来做演示,今天我就用 1 个小时来开发一个用于生产环境的短信微服务。以下是生产环境直接可用的服务代码,绝非示例教程。

为什么要开发短信微服务?

短信服务我们都是依赖公有云的实现,通过公有云的 API 直接调用,那为什么还要自己封装呢?

  • 因为微服务环境下我们要减少代码的重复量,如果有多个微服务需要使用短信服务,那就要复制多遍代码,把公有云的 API 包装成我们自己的微服务 API 可以将代码的复制减少为一行 Http 请求。
  • 调用 API 的 accesskey 和 secret 不需要复制给多个服务,减少安全风险。
  • 可以根据我们的业务需求加入共用的业务逻辑。
多了一层调用有没有性能影响?

多了一层调用是多了一个网络请求,但是影响微乎其微。我们不可能因为面向对象的方式太多调用就写逐行执行的代码吧。

  • 公有云短信服务本就是异步调用,错误处理也是异步回调的方式。
  • 微服务内部网络的调用应该是非常快的,可以同虚拟机部署或者同机房部署。

开始

首先我们建立项目的骨架。

为什么要建立项目的骨架呢?

因为 Flask 太过于轻量,所以例如配置、路由等规范需要由开发人员自己定义。一般成熟的开发团队都有自己的一套开发骨架,要统一配置,统一开发规范,统一集成相关系统等。我这里就分享一套适用于生产环境的非常简单的开发骨架。

新建一个项目目录,然后在里面建立 app 和 config 两个 Python 目录。app 用于存放业务相关代码,config 用于存放配置相关代码。

配置类

在 config/config.py 中添加如下内容,配置的设计因人而异,Flask 也没有做任何限制。我这里的设计是使用 BaseConfig 作为配置基类,存放所有共用的配置,而不同的环境使用不同的配置子类,子类只需要修改特定的值就可以,便于查看。

如果配置的值需要在运行是注入(如数据库连接等),则可以使用环境变量的方式(如下面的 SECRET_KEY),我同时使用 or 提供了没有环境变量的默认值。

import os


class BaseConfig:
    """
    配置基类,用于存放共用的配置
    """
    SECRET_KEY = os.environ.get('SECRET_KEY') or os.urandom(16)
    DEBUG = False
    TESTING = False


class ProductionConfig(BaseConfig):
    """
    生产环境配置类,用于存放生产环境的配置
    """
    pass


class DevelopmentConfig(BaseConfig):
    """
    开发环境配置类,用于存放开发环境的配置
    """
    DEBUG = True


class TestingConfig(BaseConfig):
    """
    测试环境配置类,用于存放开发环境的配置
    """
    DEBUG = True
    TESTING = True


registered_app = [
    'app'
]

config_map = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'testing': TestingConfig
}

相关文章