创建一个简单的微服务之一(微服务组件介绍)

微服务

微服务架构非常适合并发量大或者是业务复杂的场景,微服务的核心是高内聚、低耦合。将独立的大项目拆分成一个一个的服务,每个服务可以独立的开发、测试、构建、部署。微服务最大的好处是降低单个系统复杂性。为了能够顺利的进行微服务开发设计,首先需要了解明确微服务的组件与开发规范。

开发规范

根据云原生的特点,微服务架构的核心就是拆分功能服务。

但是不同的服务是由不同的开发团队负责,如果大家都按照自己的开发方式就会导致服务之间难以协同,微服务对开发成员之间的配合是有要求的,因此需要共同遵守同一个规范,本博客系列主要介绍以 Python 编程语言作为开发主语言,并介绍相关规范,各个厂商都有自己编码规范,大家可以作为参考。PEP8 是 Python 官方给定的标准编码规范,要求非常严格。但在团队正常开发中,如果所有人都严格的完全遵守 PEP8,对代码各种吹毛求疵,反而效率会变低。一般大家都会对在代码规范和开发效率中寻找平衡。这里推荐一份giteepython编码规范给大家。

接口规范

除了编码规范以外,其实还有很多规范。微服务对外提供数据通常是以 API的方式提供,由于微服务之间以及微服务对外都有很多的数据交互,因此需要定义接口开发规范。接口开发的设计规范有很多,因为很多应用场景中服务需要通过网络对外提供服务,为了提高和网络的通用性,一般常用的 HTTP 接口设计 适合一般的架构。微服务通常都采用 RESTful API 架构设计,笔者相关微服务的应用中也会是完全遵循RESTful API架构设计思想和开发规范。数据传输采用Json的方法,当然也可以采用常见的数据传输格式有 XML、YAML或者是自定义数据格式。

Flask框架

本项目采用的核心框架是 Flask。Flask是Python的 Web开发框架,相比其他的框架如 Django具有轻量、快速、解耦合、无限制等优势。除了核心框架以外, Flask 还提供了相当庞大的组件库供你选择,本项目用到的重要组件有以下几个:Flask-RESTPlus 组件]、Flask-SQLAlchemy 组件、Flask-Script 组件、Flask-Migrate 组件。其中 Flask-RESTPlus`组件是我们重点研究学习的组件,因为可以对微服务传输的RestAPI信息进行解析。除了上述几个主要的组件之外,还有很多辅助组件和依赖主键,这些组件可通过 Flask 官网Flask GitHubPyPi 等网站自行查阅。

Flask 微服务框架

根据Flask和Flask-RESTPlus我们就可以开发微服务了。但是Flask由于是很灵活的微内核框架,每个项目的目录结构、目录层级、代码编排、依赖关系、架构设计等都是千差万别的。

那么有没有一款类似Django或者是Vue的脚手架工具,一键生成我们需要的目录结构呢?很遗憾,到目前从市面上还没有找到。

虽然还没有类似的轮子,但是我们可以自己造啊。经过长时间实际项目开发和经验积累,逐渐摸索出一套架构设计精巧、目录层次合理的框架,Flask 微服务框架(Flask microservices frame)简称FMSF。

FMSF几乎涵盖了在开发过程中能遇到的所有问题,为了对FMSF能有清晰的认识,下列列出几项有关FMSF亮点:

  • 有着清晰的目录结构、目录层级、代码编排、依赖关系、架构设计等。
  • 具有四套环境(开发环境、测试环境、生成环境、单元测试),项目配置可通过环境变量进行自动配置,无需改动任何代码。
  • 扩展能力强,不受限于Flask的约束,可定制扩展项。
  • 开发速度快,将复杂繁琐的RESTful协议封装在底层,工程师无需了解底层的每个细节,只需要关注具体业务服务即可。
  • 详细的文档教程、代码详解、测试用例、设计思想和生命周期流程图。

代码路径及其含义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
microservice-model
├── README.md #项目的说明文档或入门手册
├── app #微服务的核心功能
│ ├── __init__.py
│ ├── api #不同路由路径下的不同功能
│ │ └── ai_example
│ │ └── example.py
│ ├── config #配置路径
│ │ ├── log_config.py
│ │ └── other config py files
│ ├── logs #日志存储路径
│ │ ├── ml_info.log
│ │ └── other log files
│ ├── modules #不同功能的代码实现路径,包括基础功能和测试功能
│ │ ├── ai_example
│ │ │ └── example.py
│ │ ├── base
│ │ │ └── to do
│ │ └── test
│ │ │ └── to do
│ ├── route #路由配置路径
│ │ └── __init__.py
│ └── utils #lib以及其他公用代码路径
│ └── __init__.py
├── manage.py #服务启动代码
├── gun.py #多进程启动代码
└── requirements.txt #依赖配置代码