当前位置: 首页 > 新闻 > 信息荟萃
编号:1182
Python云原生:构建应对海量用户数据的高可扩展Web应用.pdf
http://www.100md.com 2020年1月3日
第1页
第9页
第13页
第27页
第44页
第269页

    参见附件(9895KB,325页)。

     Python云原生:构建应对海量用户数据的高可扩展Web应用,这是一本关于讲解用Python来构建云原生应用的书籍,读者朋友们可以在这里学习到专业的知识点。

    Python云原生内容

    《Python云原生:构建应对海量用户数据的高可扩展Web应用》以一个应用开发贯穿始终,从云原生和微服务的概念原理讲起,使用Python构建云原生应用,并使用React构建Web视图。为了应对大规模的互联网流量,使用了Flux构建UI和事件溯源及CQRS模式。考虑到Web应用的安全性,《Python云原生:构建应对海量用户数据的高可扩展Web应用》对此也给出了解决方案。书中对于关键步骤进行了详细讲解并给出运行结果。读者可以利用Docker容器、CI/CD工具,敏捷构建和发布本书示例中的应用到AWS、Azure这样的公有云平台上,再利用平台工具对基础设施和应用的运行进行持续监控。

    Python云原生特色

    零云原生是云计算时代的发展趋势和必然结果,将持续领航云时代架构理念

    用Python 语言进行开发,易如门,易掌握,集现今诸多热点技术之大成

    流程完整,示例具体详细,一个实际开发案例贯穿始终,全面开放代码

    Python云原生作者

    Manish Sethi是一名在印度班加罗尔工作的工程师。在他的职业生涯中,曾为初创公司和财富10强公司工作,帮助企业采用云原生方法来构建大规模可扩展产品。他经常花时间学习和使用新技术,并积极地使用无服务器架构、机器学习和深度学习等方法解决实际问题。他还撰写博客,在聚会上发表演讲,从而为班加罗尔DevOps和Docker社区贡献自己的所学。

    译者简介

    宋净超,就职于蚂蚁金服,Kubernetes及云原生应用布道师,Service Mesh爱好者社区联合发起人。乐于分享,拥抱开源,活跃于Kubernetes及微服务开发者社区。经常作为讲师在Qcon、ArchSummit等技术会议上进行分享,也常参与云栖大会等行业会议和线下Meetup。

    Python云原生目录

    1.云原生应用和微服务简介

    2.使用Python构建微服务

    3.使用Python构建Web应用

    4.与数据服务交互

    5.使用React构建Web视图

    6.使用Flux来构建UI以应对大规模

    7.事件溯源与CQRS

    8.Web应用的安全性

    9.持续交付

    10.应用容器化

    11.部署到AWS云平台

    12.部署到Azure云平台

    13.监控云应用

    Python云原生:构建应对海量用户数据的高可扩展Web应用截图

    更多免费电子书搜索「雅书」 https:yabook.org

    内 容 简 介

    本书以一个应用开发贯穿始终,从云原生和微服务的概念原理讲起,使用 Python 构建云原生应用,并使用 React 构建 Web 视图。为了应对大规模的互联网流量,使用了 Flux 构建 UI 和事件溯源及 CQRS

    模式。考虑到 Web 应用的安全性,本书对此也给出了解决方案。书中对于关键步骤进行了详细讲解并给

    出运行结果。读者可以利用Docker容器、CICD工具,敏捷构建和发布本书示例中的应用到AWS、Azure

    这样的公有云平台上,再利用平台工具对基础设施和应用的运行进行持续监控。

    本书适合全栈工程师和想要使用Python构建云原生应用的开发者学习。

    Copyright ? 2017 Packt Publishing. First published in the English language under the title ‘Cloud Native

    Python’.

    本书简体中文版专有出版权由 Packt Publishing 授予电子工业出版社。未经许可,不得以任何方式复

    制或抄袭本书的任何部分。专有出版权受法律保护。

    版权贸易合同登记号 图字:01-2017-6967

    图书在版编目(CIP)数据

    Python云原生:构建应对海量用户数据的高可扩展Web 应用 (印)马尼什·塞西(Manish Sethi)著;

    宋净超译. —北京:电子工业出版社,2018.7

    书名原文:Cloud Native Python

    ISBN 978-7-121-34177-9

    Ⅰ. ①P… Ⅱ. ①马… ②宋… Ⅲ. ①网页制作工具-程序设计 Ⅳ. ①TP393.092

    中国版本图书馆CIP数据核字(2018)第099661号

    策划编辑:孙奇俏

    责任编辑:牛 勇

    印 刷:

    装 订:

    出版发行:电子工业出版社

    北京市海淀区万寿路173信箱 邮编100036

    开 本:787×980 116 印张:20.25 字数:405千字

    版 次:2018年7月第1版

    印 次:2018年7月第1次印刷

    定 价:89.00元

    凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话: (010)88254888,88258888。

    质量投诉请发邮件至zlts@phei.com.cn,盗版侵权举报请发邮件至dbqq@phei.com.cn。

    本书咨询联系方式:010-51260888-819,faq@phei.com.cn。

    译者序

    本书主要讲解如何使用 Python 来构建云原生应用,其中包含了对云原生应用架构和微

    服务概念的解析,还包括了使用 React 来构建 Web UI,使用 MongoDB 来存储数据,使用

    Kafka 消息队列、CQRS和事件溯源的方式来支持分布式处理等内容。然后详细演示了如何

    使用 Jenkins来做 CICD,将应用部署到 AWS 或 Azure 云平台上。

    整本书一气呵成,一个示例贯穿始终,即构建一个“微博”应用。记得当年我还在读

    大学的时候,还使用 Java 构建过类似微博的 Web 应用,那也是我第一次构建 Web 应用,但是那时只是为了学习 JSP 和 Java Web 应用,也没有用到什么开发框架,而且只是在本地

    运行。我在看到本书时有种相见恨晚的感觉,如果当初我就读了这本书,那么使用 Python

    构建一个可扩展的 Web应用不是轻而易举吗?还可以将应用程序部署到云平台上,让自己

    的成果公之于众,这对于自己的技术生涯也是不小的激励。本书给出了构建应用的详细步

    骤和代码示例,甚至每一步的输出结果和页面截图都给出了,所以本书十分适合全栈工程

    师和想要使用 Python 构建云原生应用的开发者学习。

    Python 也是我最喜欢的语言之一,它简单,优美,容易使用,而且是很多操作系统都

    内置支持的编程语言。Python 有着众多第三方包和框架,使用它不仅可以快速开发 Web 应

    用,还可以进行数据分析、机器学习,甚至调用其他语言,所以有人将 Python 称为“胶水”

    语言。现在使用 Python 构建云原生应用又成了广大 Python 爱好者的新方向。

    在翻译本书前,我已经翻译过 Cloud Native Go 这本书,同时在很多会议和网站上分享

    过有关云原生的话题。还创建了“云原生应用架构”公众号(CloudNativeGo) ,欢迎读者

    朋友多多关注。也欢迎大家通过我的 Twitter ( @jimmysongio )、 GitHub

    (https:github.comrootsongjc)和博客(https:jimmysong.io)与我交流。由于译者的精力

    和时间有限,书中难免会出现一些纰漏,欢迎广大读者指正。

    Kubernetes与云原生应用布道者 宋净超

    2018年 5 月于北京

    更多免费电子书搜索「雅书」 https:yabook.orgPython云原生:构建应对海量用户数据的高可扩展Web 应用

    【IV】

    推荐序

    2000 年左右是“.com”的繁荣时代,那时我使用 C ++和 Perl 开发 Web应用程序。那

    个年代人们必须亲自去 ISP 数据中心安装机器并进行 RAID 配置。2003—2006 年,应用开

    发转向了依靠基于虚拟机的共享主机。而如今,有了像 AWS、Azure、Google Cloud 这样

    的云计算提供商,以及 Python、Ruby和 Scala 等编程语言,使得创建和扩展网站像玩玩具

    一样简单。

    虽然云计算的出现使创建网络应用变得更简单,但是云计算的新工具、新部署方法和

    新工作流程不断出现,增加了学习云计算的难度。举个例子,开发人员应该使用哪些计算

    产品呢?软件即服务,平台即服务,还是基础架构即服务平台?开发人员应该选择 Docker

    还是普通的虚拟机来部署?整个软件架构应该遵循 MVC 还是微服务模型?

    本书作者 Manish 针对 Python 开发人员,全面讲解了云计算领域的各项技术。本书从

    云计算的分类及其产品基础开始讲起。书中的大多数章节都是独立的,读者可以选择阅读

    自己感兴趣的部分。本书简单明了地解释了像 CI 和 Docker 这样的复杂技术,满足了软

    件开发的敏捷模型所要求的,开发人员在几天(而不是几周)内学会使用新工具。本书给

    出了安装、配置的流程,并辅以代码,以使开发人员快速掌握所需的知识,从而提高工作

    效率。

    本书尤其适合全栈开发者阅读,同时也适合新手和中级 Python 开发人员学习。本书旨

    在帮助 Python 开发者快速掌握当今软件开发所需要使用的工具和技术。

    云计算的复杂性在于细节,无论是部署流程,管理基础设施,保护安全,还是建立工

    具生态系统,这些选择都将对正在构建软件应用的开发及运维团队产生深远的影响。

    Ankur Gupta

    NumerateLabs LLP创始人

    ImportPython DjangoWeekly 主编 关于作者

    【V】

    关于作者

    Manish Sethi是一名在印度班加罗尔工作的工程师。在他的职业生涯中,曾为初创公司

    和财富 10 强公司工作,帮助企业采用云原生方法来构建大规模可扩展产品。

    他经常花时间学习和使用新技术,并积极地使用无服务器架构、机器学习和深度学习

    等方法解决实际问题。他还撰写博客,在聚会上发表演讲,从而为班加罗尔DevOps和Docker

    社区贡献自己的所学。

    我要感谢我的兄弟 Mohit Sethi和我的母亲 Neelam Sethi,在我的职业生涯中

    和编写本书的过程中,他们给了我非常多的鼓励和支持。

    更多免费电子书搜索「雅书」 https:yabook.orgPython云原生:构建应对海量用户数据的高可扩展Web 应用

    【VI】

    关于审校者

    Sanjeev Kumar Jaiswal是一名拥有 8 年行业经验的计算机工程师。他平时使用 Perl、Python和 GNULinux 处理事务。他目前从事渗透测试、源代码评审、安全设计和实施以及

    Web 和云安全项目开发相关工作。

    目前,Sanjeev 也在学习 NodeJS 和React Native。他喜欢教学,会教一些工程专业的学

    生和 IT 专业人员。在过去的 8 年中他一直利用业余时间教学。

    2010 年,他秉承通过分享来学习的理想,为计算机科学专业的学生和 IT 专业人员建

    立了 Alien Coders(http:www.aliencoders.org)社区,这在印度的工程专业的学生中广受好

    评。 可以通过 Facebook主页 http:www.facebook.comaliencoders、 在 Twitter上@aliencoders

    以及 GitHub页面 https:github.comjassics关注他。

    他撰写了 Instant PageSpeed Optimization 一书, 并与人共同撰写了 Learning Django Web

    Development,这两本书都已由 Packt 出版。他已为 Packt 审校了 7 本以上的书籍,并期待

    为 Packt 和其他出版商编写或审校更多书籍。

    Mohit Sethi 是一名解决方案架构师,在云计算、存储、分布式系统、数据分析和机器

    学习等领域的 IaaS、PaaS 和 SaaS方面,有超过 10 年的构建和管理产品的经验。此前,他

    曾在硅谷初创公司、财富 10 强公司和国防组织工作。他是一名有 12 年以上开源经验的贡

    献者,并且在班加罗尔举办 DevOps聚会已经超过 3 年。

    可以通过 Twitter(https:twitter.commohitsethi) 、LinkedIn(https:in.linkedin.com

    inmohitsethi7)和 GitHub(https:github. commohitsethi)与他联系。 目录

    【VII】

    目录

    前言 .............................................................................................................................. XIII

    1 云原生应用和微服务简介 ............................................................................................ 1

    云计算简介 ............................................................................................................................... 2

    软件即服务 ............................................................................................................................................ 3

    平台即服务 ............................................................................................................................................ 4

    基础设施即服务 .................................................................................................................................... 4

    云原生概念 ............................................................................................................................... 5

    云原生为何物?为何重要 .................................................................................................................... 5

    云原生运行时环境 ................................................................................................................................ 6

    云原生架构 ............................................................................................................................................ 6

    理解十二要素应用 ................................................................................................................... 9

    设置 Python 环境 ................................................................................................................... 11

    安装Git ................................................................................................................................................ 11

    安装和配置Python .............................................................................................................................. 19

    熟悉 GitHub和 Git 命令 ........................................................................................................ 26

    本章小结 ................................................................................................................................. 27

    2 使用 Python构建微服务 ............................................................................................ 29

    Python 概念解析 .................................................................................................................... 29

    模块 ...................................................................................................................................................... 29

    函数 ...................................................................................................................................................... 30

    微服务模型 ............................................................................................................................. 31

    构建微服务 ............................................................................................................................. 32

    更多免费电子书搜索「雅书」 https:yabook.orgPython云原生:构建应对海量用户数据的高可扩展Web 应用

    【VIII】

    构建user资源的方法 .......................................................................................................................... 38

    构建tweet资源的方法 ........................................................................................................................ 47

    测试 RESTful API .................................................................................................................. 52

    单元测试 .............................................................................................................................................. 53

    本章小结 ................................................................................................................................. 56

    3 使用 Python构建 Web应用 ...................................................................................... 57

    应用入门 ................................................................................................................................. 58

    创建应用程序用户 ................................................................................................................. 59

    使用Observable和AJAX ................................................................................................................... 61

    绑定数据到adduser模板 .................................................................................................................... 63

    用户发送推文 ......................................................................................................................... 65

    在推文模板上使用Observable和AJAX ........................................................................................... 67

    绑定数据到addtweet模版 .................................................................................................................. 69

    CORS——跨源资源共享 ...................................................................................................... 71

    Session 管理 ........................................................................................................................... 72

    Cookies ................................................................................................................................... 75

    本章小结 ................................................................................................................................. 76

    4 与数据服务交互 ......................................................................................................... 77

    MongoDB 有什么优势,为什么要使用它 ........................................................................... 77

    MongoDB中的术语 ............................................................................................................................ 78

    安装 MongoDB ....................................................................................................................... 79

    初始化MongoDB数据库 ................................................................................................................... 80

    在微服务中集成MongoDB ................................................................................................................ 82

    处理user资源...................................................................................................................................... 83

    处理推文资源 ...................................................................................................................................... 90

    本章小结 ................................................................................................................................. 93

    目录

    【IX】

    5 使用 React构建 Web视图 ........................................................................................ 95

    理解 React .............................................................................................................................. 95

    配置 React 环境 ...................................................................................................................... 96

    安装node ............................................................................................................................................. 96

    创建package.json ................................................................................................................................ 97

    使用 React 构建 webViews .................................................................................................... 98

    在微服务中集成Web视图 ............................................................................................................... 106

    用户验证 ............................................................................................................................... 109

    用户登录 ............................................................................................................................................ 109

    用户注册 ............................................................................................................................................ 111

    用户资料 ............................................................................................................................................ 114

    用户注销 ............................................................................................................................................ 117

    测试 React webViews ........................................................................................................... 117

    Jest ...................................................................................................................................................... 118

    Selenium ............................................................................................................................................. 118

    本章小结 ............................................................................................................................... 118

    6 使用 Flux来构建 UI以应对大规模流量 ................................................................... 119

    Flux 介绍 .............................................................................................................................. 119

    Flux概念 ............................................................................................................................................ 120

    在UI中添加日期 .............................................................................................................................. 121

    使用Flux创建 UI .............................................................................................................................. 121

    动作和分派器 .................................................................................................................................... 122

    数据源 ................................................................................................................................................ 125

    本章小结 ............................................................................................................................... 134

    7 事件溯源与 CQRS ................................................................................................... 135

    简介 ....................................................................................................................................... 136

    理解事件溯源 ....................................................................................................................... 138

    事件溯源定律 .................................................................................................................................... 140

    更多免费电子书搜索「雅书」 https:yabook.orgPython云原生:构建应对海量用户数据的高可扩展Web 应用

    【X】

    CQRS介绍 ........................................................................................................................... 142

    CQRS架构的优点 ............................................................................................................................. 144

    事件溯源与CQRS面临的挑战 ........................................................................................................ 145

    应对挑战 ............................................................................................................................................ 146

    解决问题 ............................................................................................................................................ 146

    使用 Kafka作为事件存储 ................................................................................................... 151

    使用Kafka做事件溯源 ..................................................................................................................... 152

    工作原理 ............................................................................................................................................ 154

    本章小结 ............................................................................................................................... 154

    8 Web应用的安全性 .................................................................................................. 155

    网络安全性和应用安全性 ................................................................................................... 155

    网络应用栈 ........................................................................................................................................ 155

    开发安全的 Web 应用程序建议 .......................................................................................... 176

    本章小结 ............................................................................................................................... 176

    9 持续交付 ................................................................................................................. 177

    持续集成与持续交付的变迁 ............................................................................................... 177

    理解SDLC ......................................................................................................................................... 177

    敏捷开发流程 .................................................................................................................................... 178

    持续集成 ............................................................................................................................... 180

    Jenkins 持续集成工具 .......................................................................................................... 182

    安装Jenkins ....................................................................................................................................... 182

    配置Jenkins ....................................................................................................................................... 185

    Jenkins自动化配置 ........................................................................................................................... 188

    Jenkins安全配置 ............................................................................................................................... 189

    插件管理 ............................................................................................................................................ 190

    版本控制系统 .................................................................................................................................... 191

    设置 Jenkins job .................................................................................................................... 191

    理解持续交付 .................................................................................................................................... 198 目录

    【XI】

    持续交付的诉求 ................................................................................................................................ 198

    持续交付与持续部署 ........................................................................................................................ 199

    本章小结 ............................................................................................................................... 199

    10 应用容器化 ............................................................................................................ 201

    Docker介绍 .......................................................................................................................... 201

    关于Docker和虚拟化的一些事实 ................................................................................................... 202

    Docker Engine——Docker的骨干 .................................................................................................... 202

    配置Docker环境 .............................................................................................................................. 203

    Docker Swarm .................................................................................................................................... 206

    在 Docker中部署应用 ......................................................................................................... 210

    构建和运行MongoDB Docker服务 ................................................................................................. 211

    Docker Hub是用来干什么的 ............................................................................................................ 214

    Docker Compose ................................................................................................................................ 221

    本章小结 ............................................................................................................................... 223

    11 部署到 AWS 云平台................................................................................................. 225

    AWS 入门 ............................................................................................................................. 225

    在 AWS 上构建应用程序基础架构 .................................................................................... 227

    生成认证密钥 .................................................................................................................................... 229

    Terraform——基础设施即代码构建工具 ......................................................................................... 233

    CloudFormation——构建基础设施即代码的AWS工具 ................................................................ 244

    云原生应用的持续部署 ....................................................................................................... 251

    工作原理 ............................................................................................................................................ 252

    本章小结 ............................................................................................................................... 259

    12 部署到Azure云平台 ............................................................................................. 261

    Microsoft Azure 入门 ........................................................................................................... 261

    Microsoft Azure基本知识 ................................................................................................................. 263

    在Azure中创建虚拟机 ..................................................................................................................... 265

    更多免费电子书搜索「雅书」 https:yabook.orgPython云原生:构建应对海量用户数据的高可扩展Web 应用

    【XII】

    在 Azure 中使用 Jenkins CICD流水线 ............................................................................. 280

    本章小结 ............................................................................................................................... 285

    13 监控云应用 ............................................................................................................ 287

    云平台上的监控 ................................................................................................................... 287

    基于 AWS的服务 ................................................................................................................ 288

    CloudWatch ........................................................................................................................................ 288

    CloudTrail ........................................................................................................................................... 293

    AWS Config service ........................................................................................................................... 294

    Microsoft Azure 服务 ........................................................................................................... 296

    Application Insights ............................................................................................................................ 296

    ELK技术栈介绍 ............................................................................................................................... 299

    开源监控工具 ....................................................................................................................... 305

    Prometheus ......................................................................................................................................... 305

    本章小结 ............................................................................................................................... 308

    前言

    【XIII】

    前言

    随着当今商业的迅速发展,企业为了支撑自身的迅速扩张,仅仅依靠自有的基础设施

    是远远不够的。因此,他们一直在追求利用云的弹性来构建支持高度可扩展应用程序的平

    台。

    本书是你一站式地了解使用 Python 构建云原生应用架构的理想读本。本书首先介绍了

    什么是云原生应用架构以及它们能够帮助你解决哪些问题。然后介绍了如何使用 REST API

    和 Python 构建微服务,并通过事件驱动的方式构建 Web 层。接下来,探讨了如何与数据服

    务进行交互,并使用 React 构建 Web 视图。之后详细介绍了应用程序的安全性和性能,以

    及如何在 Docker 中容器化你的服务。最后,讨论了如何在 AWS 和 Azure 平台上部署你的

    应用程序。在部署了应用程序后,围绕应用程序故障排查的一系列概念和技术结束了这本

    书。

    本书内容

    第 1 章 云原生应用和微服务简介,讨论云原生架构的基本概念和构建应用程序开发

    环境的方法。

    第 2 章 使用 Python 构建微服务,构建自己的微服务知识体系并根据用例进行扩展。

    第3章 使用Python构建Web应用,构建一个初始的Web应用程序并与微服务集成。

    第 4 章 与数据服务交互,教你如何将应用程序迁移到不同的数据库服务。

    第 5 章 使用 React构建 Web视图,讨论如何使用 React 构建用户界面。

    第 6 章 使用 Flux 来构建 UI 以应对大规模流量,帮助你理解如何使用 Flux 创建可扩

    展的应用程序。

    第 7 章 事件溯源与 CQRS,讨论如何以事件形式存储合约(transaction)。

    更多免费电子书搜索「雅书」 https:yabook.orgPython云原生:构建应对海量用户数据的高可扩展Web 应用

    【XIV】

    第 8 章 Web应用的安全性,讨论如何让你的应用程序免受外部威胁。

    第 9 章 持续交付,介绍应用程序频繁发布的相关知识。

    第 10 章 应用容器化,讨论容器服务和在 Docker中运行应用程序的方法。

    第 11 章 部署到 AWS 云平台,教你如何在 AWS 上构建基础设施并建立应用程序的

    生产环境。

    第 12 章 部署到 Azure云平台,讨论如何在 Azure 上构建基础设施并建立应用程序的

    生产环境。

    第 13 章 监控云应用,介绍不同的基础设施和应用的监控工具。

    阅读准备

    你需要在系统上安装Python, 和一个文本编辑器, 最好是Vim、 Sublime或者Notepad++。

    你需要下载 POSTMAN,这是一个功能强大的 API 测试套件,可以作为 Chrome 扩展插件

    来安装,可以从这里下载:https:chrome.google.comwebstoredetail

    postmanfhbjgbiflinjbdggehcddcbncdddomop?hl=en。

    除此之外,如果你还有如下 Web 应用的账号那就更好了:

    Jenkins

    Docker

    Amazon Web Services

    Terraform

    如果没有以上账号,本书将指导你创建这些 Web 应用账号。

    目标读者

    本书适用于具有一些Python基础、 熟悉命令行和HTTP应用程序基本原理的开发人员。

    对于那些想要了解如何构建、测试和扩展 Python 应用程序的人员来说,本书是一个理想选

    择。不需要有使用 Python 构建微服务的经验。 前言

    【XV】

    排版约定

    在本书中,你会发现有许多类型的文本样式用于区分不同类型的信息。以下是这些样

    式的例子和含义解释。

    文中的代码、数据表、目录名、文件名、文件扩展名、路径名、虚拟URL、用户输入

    和 Twitter将会如下显示:“创建一个 signup 路由,其将采用 GET 和 POST方法来读取页

    面,并将数据提交到后端数据库。”

    代码块排版如下:

    sendTweet(event){

    event.preventDefault;

    this.props.sendTweet(this.refs.tweetTextArea.value);

    this.refs.tweetTextArea.value = '';

    }

    命令行输入输出将按如下格式排版:

    apt-get install nodejs

    新术语与重要词汇以粗体显示。你在屏幕上看到的字,例如,对于在菜单或对话框中

    出现的条目将这样来描述:“单击 Create user 按钮,创建用户,并在其上附加策略。”

    警告或者重要提醒。

    提示和技巧。

    更多免费电子书搜索「雅书」 https:yabook.orgPython云原生:构建应对海量用户数据的高可扩展Web 应用

    【XVI】

    读者服务

    轻松注册成为博文视点社区用户(www.broadview.com.cn) ,扫码直达本书页面。

    下载资源:本书如提供示例代码及资源文件,均可在 下载资源 处下载。

    提交勘误:您对书中内容的修改意见可在 提交勘误 处提交,若被采纳,将获赠

    博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。

    交流互动:在页面下方 读者评论 处留下您的疑问或观点,与我们和其他读者一

    同学习交流。

    页面入口:http:www.broadview.com.cn34177

    1

    云原生应用和微服务简介

    我们开始吧!在开始构建应用程序之前,我们需要先回答以下几个问题:

    什么是云计算?包括哪些类型?

    什么是微服务?它的基本概念是什么?

    有哪些最佳实践?

    在开始编写应用程序之前,本章我们先来了解应用程序开发者和程序员应该理解的基

    本概念。

    首先来了解一下系统的构建及其演变。

    长久以来,人们一直在探索如何以更好的方式来构建程序框架。随着技术的发展和更

    新、更好技术的采用,IT 框架变得更加可靠,对客户(或者顾客)来说也更加高效,同时

    还能使工程师们更加愉悦地工作。

    持续交付有助于我们将软件开发周期转移到生产中,能够让我们从不同的视角识别出

    软件中容易出错的部分。我们坚定这样的理念:认真考虑每次代码提交,因为每次提交都

    有可能最终发布到生产。

    我们已经深刻体会到了利用 Web 来进行机器之间的交互带来的便利。虚拟化平台能够

    让我们自由安排和调整机器的大小,利用基础计算单元来提供大规模处理这些机器的方法。

    一些大型高效的云平台(如 Amazon、Azure 和 Google)已经接受了小组织拥有其服务的全

    部生命周期的观念。诸如领域驱动设计(DDD)、持续交付(CD)、按需请求虚拟化、基础

    设施自动化、小型自治组织和规模化系统等概念,这些特征可以有效地促进我们高效地开

    更多免费电子书搜索「雅书」 https:yabook.org发软件并将其投入到生产。而现在,微服务的概念已经崛起。这不是脱离实际开发而编造

    出来的;它是一种实际的模式,或者说是一种因为实用而崛起的模式。本书我们先从云计

    算的类型讲起,以说明如何创建、监控和推进微服务。

    许多组织都发现,掌握了细粒度的微服务结构,就可以快速将其转化为程序,了解更

    多的最新进展。微服务能使我们从根本上更灵活地应对和解决各种选择,让我们迅速适应

    变化,快速作出反应。

    云计算简介

    在开始介绍微服务和云原生概念之前,我们先来了解一下什么是云计算。

    云计算是一个宽泛的术语,它的范围十分宽广。每当一个领域发生巨大变革的时候,就会存在很多的炒作,云就是这样一个热点领域,许多商家将本来与其风马牛不相及的事

    物牵强附会。由于云存在广泛的施展空间,组织可以选择何时、何地和如何使用云计算。

    可以将云计算服务划分为以下几种类型。

    SaaS:终端用户可以直接使用的应用程序。

    PaaS:工具和服务的集合,其对于那些想要快速构建应用程序或快速将应用程序

    部署到生产环境,而不关心底层硬件的用户和开发者来说特别有用。

    IaaS:针对想要建立自己的商业模式并进行自定义的客户提供的类型。

    云计算,作为一个技术栈,我们可以这样来解释它:

    当我们谈及云计算时经常指的是一个技术栈,其涵盖了广泛的服务,其中很多服

    务是建立在其他服务的基础之上的,例如云。

    云计算模式被认为是不同的可配置的计算资源的集合(例如服务器、数据库和存

    储),它们之间互相通信,几乎可以在无须人为监督的情况下提供给用户。

    下图展示了云计算技术栈中包括的组件。

    下面我们通过用例来详细了解云计算中的各个组件。

    软件即服务

    下面描述了 SaaS的要点。

    软件即服务(SaaS)使用户能够通过浏览器访问由提供商提供的基于互联网提供

    服务的软件。这些服务是订阅式的,也被称为按需软件。

    提供SaaS的公司产品包括Google Docs生产力套件、 Oracle CRM (客户关系管理) 、微软及其 Office365 产品,以及 Salesforce CRM和QuickBooks。

    SaaS 可以进一步细分为垂直 SaaS 和水平 SaaS,前者侧重于医疗保健和农业等特

    定行业的需求,后者专注于软件行业,例如人力资源和销售。

    SaaS基本上是针对那些想要快速获取现成软件和应用的组织而言的,这些应用即

    更多免费电子书搜索「雅书」 https:yabook.org便是非技术人员也能理解和使用。组织基于对该软件的用途和预算,可选择不同

    的支持套餐。此外,你可以从世界的任何可以连接到互联网的地方访问这些服务。

    平台即服务

    下面描述了 PaaS的要点。

    对于 PaaS产品,组织或企业无须担心其内部应用程序的硬件和软件基础设施的管

    理问题。

    PaaS的最大优点是为开发团队(本地或远程)提供一些可能性,他们可以在通用

    框架上有效地构建、测试和部署应用程序,其中底层硬件和软件由 PaaS服务提供

    商提供。

    PaaS提供商提供平台,同时提供围绕该平台的服务。

    PaaS 提供商包括 Amazon Web Services(AWS Elastic Beanstalk)、微软 Azure

    (Azure Websites)、Google App Engine 和 Oracle(Big Data Cloud Service)。

    基础设施即服务

    下面描述了 IaaS 的要点。

    与 SaaS产品不同的是, IaaS向客户提供的是 IT 资源,例如运行应用程序的裸机、用于存储的硬盘和用于联网的网络电缆,用户可以根据业务模式自定义。

    对于 IaaS产品,由于客户可以完全访问其基础设施,故他们可以根据其应用需求

    扩展 IT 资源。在 IaaS 产品中,客户必须管理应用程序资源的安全性,并且在突

    发故障崩溃时构建灾难恢复模型。

    在 IaaS 中,服务是按需提供的,客户在使用时需要付费。因此,客户需要对资源

    进行成本分析,进行成本控制防止超出预算。

    允许客户消费者根据应用程序的要求定制其基础架构,在销毁基础架构后能够快

    速有效地重建。

    IaaS 服务基本上是按需付费的,这意味着你可以随时付款。IaaS 将根据你的资源

    使用情况和使用时间来收取费用。

    Amazon Web Services,提供亚马逊弹性计算云(Amazon EC2)和亚马逊简易存

    储服务(Amazon S3),是该云产品的第一大门户;然而,Microsoft Azure(虚拟

    机)、Rackspace(虚拟云服务器)和Oracle(裸机云服务)也有这样的产品。 云原生概念

    云原生是一种团队、文化和技术组织形式,利用自动化工具和架构来管理软件复杂度

    和加速软件交付。

    云原生概念已经超出了技术的范畴。我们需要从成功的公司、团队和个人身上了解行

    业的发展方向。

    目前,像Facebook和Netflix这样的大公司都已经在云原生技术上投入了大量的资源,而一些小的公司也意识到了该技术的价值。根据云原生技术实践的反馈,我们总结了如下

    一些优点。

    结果导向和团队合作:云原生的方法将一个大问题分解成众多的小问题,从而使

    每个团队都能专注于各自的部分。

    减少重复工作:自动化减少了困难、繁杂和重复的手动工作量,并减少了停机时

    间。这将使系统更有效率。

    可靠而高效的应用程序基础设施:自动化可以对不同环境(无论是开发、阶段发

    布还是生产)中的部署做更多控制,还可以处理意外事故。自动化构建不仅有助

    于正常部署,而且在灾难恢复的时候,也能使重新部署变得更加容易。

    应用程序洞察:为云原生应用程序构建的工具可为应用程序提供更多洞察,从而

    使调试、故障排查和审计变得容易。

    高效可靠的安全性:每个应用程序都会关注安全性,确保可靠的身份验证。云原

    生为开发人员提供了多种确保应用程序安全性的方式。

    经济高效的系统:使用云管理和部署应用程序可以有效地利用资源,包括应用程

    序发布,通过减少资源浪费使系统花费更合理。

    云原生为何物?为何重要

    云原生是一个宽泛的术语,它可以充分利用不同的技术,如基础架构自动化或中间件

    开发、支持服务等,这些功能都属于应用交付周期中的一部分。云原生方法包括频繁的版

    本发布(无 Bug、稳定),以及根据业务需求扩展应用程序。

    使用云原生方法,可以系统地实现应用程序构建目标。

    云原生方法远优于传统的面向虚拟化的业务流程,传统方法需要投入大量的精力来构

    更多免费电子书搜索「雅书」 https:yabook.org建开发环境,以及软件交付过程中的其他不同环境。理想的云原生架构应具有自动化和组

    合功能,这些自动化技术还应实现跨平台管理和部署应用程序。

    云原生架构还应该具有其他几个特性,如稳定的日志记录、应用程序和基础架构监控,以确保应用程序正常运行。

    云原生方法能够帮助开发人员使用例如 Docker等工具,在不同的平台上轻易地创建和

    销毁应用程序。

    云原生运行时环境

    当软件从一个计算环境迁移到另一个计算环境时,该如何使其可靠运行?最佳解决方

    案就是使用容器。这可能是从开发者自己的机器到预发布环境再到生产环境,也可能是从物

    理机到私有云或公共云中的虚拟机。Kubernetes已经成为容器服务的代名词,越来越流行。

    随着云原生框架的兴起和其周边应用程序的增加,容器的编排越来越受人关注。在容

    器运行时需要注意以下几点。

    管理容器状态和高可用性:一定要保持容器的状态(创建和销毁),特别是在生

    产中,因为从业务的角度看它们非常重要。而且还应该能够根据业务需求进行扩

    展。

    成本体现和分析:容器可以根据业务预算控制资源管理,并可在很大程度上降低

    成本。

    环境隔离:在容器内运行的每个进程都被隔离在该容器内。

    跨集群的负载均衡:应用流量由容器集群处理,在容器内均匀重定向,这将增加

    应用程序最大响应数量并维持高可用性。

    调试和灾难恢复:由于我们要在生产系统中使用,所以需要确保有正确的工具可

    以监控应用程序的运行状况,采取必要措施避免停机,并提供高可用性。

    云原生架构

    云原生架构类似于我们为遗留系统创建的应用程序架构,但在云原生应用程序架构中,我们应该考虑一些特性,例如十二要素应用程序(应用程序开发模式的集合)、微服务(将

    单体业务系统分解为独立可部署服务)、自服务敏捷基础设施(自服务平台)、基于 API 的

    协作(通过 API 进行服务之间的交互)和抗脆弱性(自我实现和加强的应用程序)。 首先,我们来探讨一下什么是微服务。

    微服务是一个更宽泛的术语,指将大型应用程序分解成更小的模块,分别开发直到发

    布。这种方法不仅有助于有效地管理每个模块,而且还可以帮助我们发现服务底层本身的

    问题。以下是微服务的一些关键部分。

    用户友好的界面:微服务之间可以实现明确的分离。微服务的版本控制可以更好

    地对 API进行控制,为消费者和生产者提供更大的自由度。

    跨平台部署和 API 管理:由于每个微服务都是一个单独的实体,因此可以更新单

    个微服务而不用更改其他服务,同时也更容易将服务回滚到之前的更改。这意味

    着用来部署微服务的工件应该兼容不同的 API 和数据模式。这些 API 必须在不同

    的平台上测试,并且测试结果应该在不同的团队,即运维、开发人员之间共享,大家共同维护一个集中的控制系统。

    应用灵活性:开发的微服务应该能够处理所有请求且必须做出响应,而不管请求

    的种类如何,包括可能的错误输入或无效请求。微服务也应该能够处理意外的负

    载请求并进行适当的响应。所以应当对微服务进行独立测试和集成测试。

    微服务的分布:最好将服务分为小块服务,以便单独跟踪和开发,最终组合起来

    形成一个微服务。这种技术使得微服务开发更稳定、更有效率。

    下图显示了一个云原生应用程序的高级架构。

    更多免费电子书搜索「雅书」 https:yabook.org在理想情况下,应用程序体系结构应该从两三个服务开始,然后通过不断更新版本进

    行扩展。了解应用程序架构非常重要,因为应用程序需要与系统的不同组件集成,并且在

    大型组织中会有团队来专门管理这些组件。微服务中的版本控制至关重要,因为软件开发

    的各个阶段都会使用不同的方法。

    微服务是一个新概念吗

    微服务的概念由来已久了。微服务是一种用来划分大型系统中不同组件边界的架构模

    式。所有的微服务都以相似的方式工作,然后将不同服务链接起来,根据请求的类型处理

    特定事务的数据流。

    下图描绘了微服务的体系结构。

    为什么说Python是云原生微服务开发的最佳选择

    为什么我们选择 Python并将其推荐给其他人?下面列举了几点原因。 可读性

    Python 是一种表达能力很强且易学习的编程语言。即便是业余爱好者也可以轻松掌握

    Python。与其他编程语言(例如 Java 更关注圆括号、大括号、逗号和冒号)相比,使用 Python

    你可以将更多的精力投入到编程上,减少调试语法的时间。

    库和社区

    Python 有大量可以在不同平台(例如 UNIX、Windows和 OS X)上运行的库。这些库

    可以根据你的应用程序需求轻松扩展。同时还有一个强大的社区致力于构建这些库,这使

    得 Python 成为最适合用于业务的语言。

    就 Python 社区而言,Python 用户组(PUG)是一个基于社区开发模式的社区,这可以

    促进Python在全球范畴内的普及。社区中的小组成员相互交流,有助于我们构建基于Python

    框架的大型系统。

    交互模式

    Python 交互模式可以帮助你在调试完代码后,立即将其添加到主程序中。

    可扩展

    Python 提供了更好的结构和概念,如模块,这比起任何其他脚本语言(如 shell 脚本),可以更系统地维护大型程序。

    理解十二要素应用

    一些实践经验更为云原生应用程序添光增彩。这些应用程序共同遵守十二要素应用程

    序宣言。该宣言概述了开发人员在构建现代 Web 应用程序时要遵循的方法。开发人员必须

    改变他们编码的方式,并为开发者和应用程序所运行的基础架构之间创建一个新的协议。

    下面是在构建云原生应用程序时需要考虑的几个方面。

    使用详实的设计,尽量自动化以降低时间成本和花费。

    在不同环境(如阶段和生产)和不同平台(如 UNIX 或 Windows)中应用程序的

    可移植性。

    更多免费电子书搜索「雅书」 https:yabook.org? 使用适用于云平台的应用程序,并了解资源分配和管理。

    使用一致的环境,减少持续交付部署中的错误,从而最大限度地发挥软件的敏捷

    性。

    通过最少的监督和设计灾难恢复架构来扩展应用程序,实现高可用性。

    十二个要素中有许多要素是相互影响的。强调声明性配置,聚焦于速度、安全性和规

    模。十二要素应用程序的基本特征如下。

    基准代码:每份部署代码都使用版本控制追踪,并在不同的平台中部署多个实例。

    依赖管理:应用程序应该显式声明依赖关系,并使用工具来单独管理依赖,例如

    Bundler、pip和 Maven。

    定义配置:不同环境中的配置(例如环境变量)可能会不同,例如开发环境、预

    发布环境和生产环境应该在操作系统级定义。

    后端服务:所有资源都要被当作应用程序自身的一部分来对待。例如数据库、消

    息队列这样的后端服务应该被当作附加资源来看待,在所有的环境中以相同的方

    式被消费。

    构建、发布、运行阶段隔离:包括构建组件、绑定配置,根据绑定的组件和配置

    文件启动一个或多个实例。

    进程无状态:以一个或多个无状态进程运行应用(例如 master和 worker),进程

    实例之间不共享任何内容。

    服务端口绑定:应用程序应当自包含,如果有任何需要对外暴露的服务,应当使

    用端口绑定的形式来完成(首选 HTTP)。

    扩容无状态进程:该架构应该强调基础平台中的无状态进程管理,而不是实现更

    复杂的应用程序。

    进程状态管理:进程应该可以迅速地增加,并在一小段时间后正常关闭。在这些

    方面可实现快速可扩展性、部署更改和灾难恢复。

    持续发布和部署到生产:保持环境一致,不论是预发布环境还是生产环境。这样

    可以保证在跨越不同的环境时获取相似的结果,有利于向生产环境持续交付。

    把日志当作事件流:不论是平台级的日志,还是应用级的日志,都十分重要,因

    为日志可以帮助你了解应用程序背后都做了什么。 ? 后台管理任务被当作一次性进程运行:在云原生的方法中,作为程序发布一部分

    的管理任务(例如数据库迁移)应该作为一次性进程运行,而不是作为常规应用

    程序长时间运行。

    例如 Cloud Foundry、Heroku和 Amazon Beanstalk这些云平台都已为部署十二要素应

    用程序做了优化。

    将应用程序与稳定的工程接口集成在一起,处理成无状态应用的设计,再考虑以上这

    些标准后,你的应用程序就可以部署到云平台了。Python 以其固有的、便捷的方式加速了

    Web 应用程序的开发。

    设置 Python环境

    全书都会用到 Python 环境,因此设置好开发环境是十分必要的,工欲善其事,必先利

    其器。

    下面是本书后面部分需要用到的账号。

    一个 GitHub账号用于源代码管理。请参考链接中的文章创建:

    https:medium.comappliedcodesetup-github-account-9a5ec9

    18bcc1

    AWS 和 Azure 账号用于应用程序部署。请参考下面链接中的文章创建:

    — AWS

    https:medium.comappliedcodesetup-aws-account-1727ce8

    9353e

    — Azure

    https:medium.comappliedcodesetup-microsoft-azure-acc

    ount-cbd635ebf14b

    现在,我们来设置开发环境需要用到的工具。

    安装 Git

    Git(https:git-scm.com)是一款免费的开源分布式版本控制系统,旨在快速

    高效地处理所有小型或大型项目。

    更多免费电子书搜索「雅书」 https:yabook.org在Debian Linux发行版(例如Ubuntu)上安装 Git

    在 Debian 系统上安装 Git有很多种方式。

    1.使用高级包管理工具(APT) :你可以使用 APT 包管理工具更新本地包。然后,使

    用下面的命令以 root 用户身份执行、下载和安装最新版的 Git:

    apt-get update –y

    apt-get install git -y

    执行以上命令将下载并安装 Git 到你的系统上。

    2.使用源码,可以按照下面的步骤来操作:

    (1)从 GitHub 上下载源代码,从源码中编译软件。在开始前,我们先安装 Git 的

    依赖,使用 root 用户执行下面的命令:

    apt-get update –y

    apt-get install build-essential libssl-dev

    libcurl4-gnutls-dev libexpatl-dev gettextunzip-y

    (2)在安装好必要依赖后,可以去 Git 代码仓库(https:github.comgit

    git)下载源代码,如下:

    wget https:github.eomgitgitarchivevl.9.l.zip –O git.zip

    (3)使用下面的命令解压下载的 ZIP 文件:

    unzip git.zip

    cd git-

    (4)需要编译包,使用 sudo 用户安装。执行下面的命令:

    make prefix=usrlocal all

    make prefix=usrlocal install

    执行以上命令将在usrlocal 目录下安装 Git。

    在Debian 发行版系统上配置 Git

    我们已经在系统上安装了 Git,现在还需要进行一些配置,以便让每次提交包含正确的信息。

    需要在配置中提供名字和电子邮件。可以使用以下命令添加这些值:

    git config --global user.name Manish Sethi

    git config --global user.email manish@sethis.in

    在Windows上安装 Git

    可以从官方网站(https:git-scm.comdownloadwin)下载最新版本的 Git,按照以下步骤在 Windows 系统上安装 Git:

    1.下载了.exe 文件后,双击运行。首先,你将会看到一个 GNU证书,如下图所示。

    更多免费电子书搜索「雅书」 https:yabook.org单击 Next 按钮,如下图所示。

    从该对话框可以看到,我们可以自定义要安装的程序,也可以使用默认配置,默认配

    置对于本书来说就可以了。

    2.另外,可以随 Git 同时安装 Git Bash。单击 Next按钮,如下图所示。

    3.在如下图所示的对话框中,可以启用 Git 包中的其他功能。然后单击 Next按钮。

    4.可以单击Next按钮,跳过其余部分,完成安装。

    完成安装后,将会看到如下图所示的界面。

    至此,我们就在 Windows 上成功地安装了 Git。

    更多免费电子书搜索「雅书」 https:yabook.org使用 Chocolatey

    笔者更青睐于使用这种方式在 Windows 10 上安装 Git。这种方式将安装与上面同样的

    包,但只需要一条命令。如果你从没听说过 Chocolatey,可以先去了解一下它。使用它安

    装软件仅需要一条命令,不需要在安装程序界面上点来点去!

    Chocolatey 十分强大,我们可以将它和 Boxstarter 搭配使用来创建开发环境。如果你

    负责为 Windows 开发环境的人员设置机器,这种方法绝对值得一试。

    我们来看看如何使用 Chocolatey 安装 Git。这里假定大家已经安装了 Chocolatey

    (https:chocoiatey.orginstall,只要在命令提示符中输入一行命令即可)。

    choco install git -params 'GitAndUnixToolsOnPath

    执行该命令会安装 Git和 BASH工具并将它们加入到 Path中。

    在Mac 上安装Git

    在开始安装 Git 之前,需要先给 OS X 系统安装命令行工具。

    为OS X安装命令行工具

    在安装任何开发者工具前,都需要先安装 Xcode(https:developer.apple.

    comxcode),这是一个大约 4GB的开发者套件。在设置 GitHub 时需要用到的命令行工

    具(如 Git)就是 Xcode开发者工具包中的一部分。苹果公司在 Mac App Store 中免费提供

    了这些工具。

    如果你的电脑有足够的空间,那就下载安装 Xcode,因为这里面包括了完整的开发者

    工具集。

    要下载命令行工具,需要在 develop.apple.com 上注册一个苹果开发者账号。创

    建完账号后,可以按照下列步骤选择命令行工具和 Xcode的版本:

    如果你使用的是 OS X 10.7.x,请下载 10.7 的命令行工具。如果你使用的是 OS X

    10.8.x,请下载 10.8 的命令行工具。

    下载完成后,打开 DMG 文件,根据提示步骤安装。 为 OS X 安装 Git

    在 Mac 上安装 Git 就和在 Windows 上安装一样简单。不再使用.exe 文件,而是使用

    dmg 文件,可以从Git网站(https:git-scm.comdownloadmac)下载。下面是安

    装步骤:

    1.双击下载的 dmg 文件,其会在 finder中打开,如下图所示。

    2.双击包(图中的 git-2.10.1-intel-universal-mavericks.dmg)文件,将会打开安装向导,如下图所示。

    更多免费电子书搜索「雅书」 https:yabook.org3.单击 Install 按钮,如下图所示。

    4.安装完成后将会看到如下图所示的界面。

    如果你使用的是 OS X 10.8,且没有修改安全性设置来运行安装第

    三方应用,则在安装该工具之前需要先调整 OS X的设置。

    安装和配置 Python

    现在我们开始安装 Python,后面将用它来构建微服务。本书使用的是 Python 3.x 版本。

    在Debian 发行版(如 Ubuntu)上安装Python

    可以使用多种方式在 Debian 发行版上安装 Python。

    使用 APT 包管理工具

    可以使用 APT 包管理工具更新本地的包索引。然后使用 root用户下载安装最新版本的

    Python:

    apt-get update –y

    apt-get install python3 -y

    下面的包将会被自动地下载和安装,因为它们是 Python 3的必备组件:

    libpython3-dev libpython3.4 libpython3.4-dev python3-chardet

    python3-colorama python3-dev python3-distlib python3-html5lib

    python3-requests python3-six python3-urllib3 python3-wheel python3.4-de

    必备组件安装好了之后,将会自动下载和安装 Python。

    使用源码安装

    可以从 GitHub 上下载源码编译安装,步骤如下:

    1.开始安装前需要先安装 Git 的依赖。使用 root用户执行下面的命令:

    apt-get update –y

    更多免费电子书搜索「雅书」 https:yabook.org apt-get install build-essential checkinstall libreadline-gplv2-

    dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-

    dev libc6-dev libbz2-dev -y

    2.从 Python官方网站(https:www.python.org)下载 Python 安装包。可以下

    载到指定的位置:

    cdusrlocal

    wget https:www.python.Orgftppython3.4.6Python-3.4.6.tgz

    3.解压软件包:

    tar xzf Python-3.4.6.tgz

    4.编译源码:

    cd python-3.4.6

    sudo .configure

    sudo make altinstall

    5.执行上面的命令将会在usrlocal 下安装 Python。执行以下命令检查 Python 版

    本:

    python3 –V

    python 3.4.6

    在Windows上安装 Python

    下面我们来看如何在 Windows 7 和更新版本上安装 Python。在 Windows上安装 Python

    十分简单快捷。我们将使用 Python 3以上版本,可以从 Python官方网站(https:www.

    python.orgdownloadswindows)下载。执行下面的步骤:

    1.根据你的系统配置下载 Windows x86-64 executable installer安装程序。打开后开始

    安装,如下图所示。

    2.选择安装类型。单击 Install Now 选择默认配置安装,将会看到如下图所示的界面。

    更多免费电子书搜索「雅书」 https:yabook.org3.安装完成后,将会看到如下图所示的界面。

    到此就完成了 Windows上的 Python安装。

    在Mac 上安装Python

    在正式开始安装 Python 之前,需要先安装 OS X 命令行工具。如果你在安装 Git 的时

    候已经安装了命令行工具,可以忽略这一步。

    为 OS X 安装命令行工具

    在安装任何开发者工具前,都需要先安装 Xcode(https:developer.apple.

    comxcode);你需要到connect.apple.com 上注册账号,然后下载对应版本的 Xcode

    工具。

    当然,还可以使用实用程序来安装命令行工具。随Xcode还安装了一个Xcode-select

    工具,如下所示:

    % xcode-select --install

    运行上述命令将会触发命令行工具的安装向导。按照安装向导的步骤就可以完成安装。

    为 OS X 安装 Python

    在 Mac 上安装 Python 和在 Windows 上安装 Git 一样简单。可以从 Python 官方网站

    (https:www.python.orgdownloads)下载安装包。然后按照下列步骤安装:

    1.下载 Python 安装包后,双击开始安装,之后将会看到如下图所示的弹出窗口。

    单击 Continue 按钮。

    更多免费电子书搜索「雅书」 https:yabook.org2.显示 Python 的版本信息,如下图所示。

    3.单击 Continue 按钮。弹出证书,然后单击 Agree 按钮。这一步是必须的,如下图

    所示。

    然后单击 Continue 按钮。 4.提示安装信息,例如磁盘占用和安装路径(如下图所示)。单击 Install 按钮。

    5.安装完成后,将会看到如下图所示的界面。

    更多免费电子书搜索「雅书」 https:yabook.org6.使用下面的命令查看安装的 Python 的版本:

    % python3 –V

    Python 3.5.3

    到此 Python安装完成!

    熟悉 GitHub和 Git命令

    在本节中,我们将熟悉一些 Git 命令,这些命令在整本书中都会被用到。

    git init:初始化本地代码仓库。

    git remote add origin <服务器>:将本地目录
    command:git remote add origin dbid=164250state=mod>链

    接到远程服务器的代码仓库,这样所有的更改都可以提交到远程仓库。

    Git status:列出所有已添加的文件目录,或者是被修改和需要提交的文件目录。

    Git add 或者git add <文件名>:添加文件目录才能追踪本地文件
    content=Git command:git add or git add dbid=164250

    state=mod>,其才可以被提交。

    git commit -m 提交信息:此命令可帮助你在本地计算机中提交跟踪的更改,并

    生成可识别更新代码的提交 ID。

    Git commit -am 提交信息:和上一个命令唯一的不同就是,在将所有的文件添

    加到 stage 中后,该命令会根据操作系统打开一个默认的文本编辑器,例如 Ubuntu

    (使用 Vim)或 Windows(使用 Notepad++)来提交这些信息。

    git push origin master:将最后一次提交的代码推送到远程代码仓库。

    测试以上命令确保环境安装正确。

    至此,我们已经安装了 Git 和 Python,在后面构建微服务的时候会用到它们。在本节

    中,我们着重测试安装的软件并熟悉如何使用它们。

    首先,我们先熟悉一下Git命令。它通过HTTPS获取外部Python代码(通常通过GitHub),并将代码复制到本地的工作目录下:

    git clone https:github.comPacktPublishingCloud-Native-Python.git 执行上面的命令将会在本地机器上创建一个名为 Cloud-Native-Python 的目录。

    从系统的当前目录切换到 Cloud-Native-Pythonchapter1 目录。

    安装程序运行所需要的依赖包。在这里,我们只需要安装 Flask 模块:

    cd hello.py

    pip install requirements.txt

    Flask 是用来做 Web 服务器的,在接下来的章节中将会详细讲解它。

    安装完成后,使用下面的命令运行该应用:

    python hello.py

    Running on http:0.0.0.0:5000 (Press CTRL+C to quit)

    看到这样的输出大家应该感到很高兴吧!

    curl http:0.0.0.0:5000

    Hello World!

    如果看到上面的输出,证明你已经成功安装了 Python 环境。

    下面让我们开始愉快的 Python 编程之旅吧!

    本章小结

    在本章中,我们首先了解了云平台和云计算技术栈,然后了解了十二要素应用程序方

    法论以及如何通过它们来进行微服务开发。最后按照步骤说明配置了我们自己的开发环境。

    在下一章中,我们会使用 REST API 构建微服务,使用 Python 框架并测试 API 调用。

    更多免费电子书搜索「雅书」 https:yabook.org 2

    使用 Python 构建微服务

    现在大家已经对微服务的基本概念和微服务的好处有所了解了,你一定迫不及待地想

    去构建微服务!本章就带领大家使用 REST API 构建微服务。

    本章包括如下内容:

    构建 REST API

    测试构建的 API

    Python概念解析

    我们先来了解一下 Python 的一些基础概念。

    模块

    模块与 Python 程序一样,能够让你基于逻辑来组织代码。而且只需要导入几行代码而

    不是引入整个 Python 程序。模块可以是一个或者多个函数类的组合。我们会用到很多

    Python 库中的内置函数,需要的时候也可以编写自己的模块。

    下面是一个模块结构的示例:

    myprogram.py

    EXAMPLE PYTHON MODULE

    Define some variables:

    numberone = 1

    更多免费电子书搜索「雅书」 https:yabook.orgage = 78

    define some functions

    def printhello:

    print hello

    def timesfour(input):

    print input 4

    define a class

    class house:

    def __init__(self):

    self.type = raw_input(What type of house? )

    self.height = raw_input(What height (in feet)? )

    self.price = raw_input(How much did it cost? )

    self.age = raw_input(How old is it (in years)? )

    def print_details(self):

    print This house is aan + self.height + foot,print self.type, house, + self.age, years old and costing + self.price + dollars.

    可以使用下面的命令导入上面定义的模块:

    import myprogram

    函数

    函数是一个经过组织的、独立的程序块,用来执行特定的任务,可以将其嵌入更大的

    程序中来使用。函数的定义如下所示:

    function

    def functionname:

    do something

    return

    需要记住以下几点:

    缩进在 Python 程序中非常重要。 ? 在默认情况下,函数的参数是有顺序的,需要按照顺序定义。

    请看下面的代码片段:

    def display ( name ):

    This prints a passed string into this function

    print (Hello + name)

    return;

    可以这样来调用上面的函数:

    display(Manish)

    display(Mohit)

    下图展示的是上面的程序运行的结果。

    如果你的系统上安装了不止一个版本的 Python,那么默认使用

    Python 2(通常是 2.7.x)。若要使用 Python 3 请使用 python 3

    命令。

    微服务模型

    本书将开发一个可以独立运行的完整的 Web 应用。

    通过前面章节的学习,我们已经对 Python 有了基本的了解,现在我们要开始对微服务

    进行建模,并了解应用程序的工作流程。

    更多免费电子书搜索「雅书」 https:yabook.org下图显示了微服务架构和应用程序的工作流程。

    构建微服务

    在本书中,我们将使用 Flask 作为 Web框架来构建微服务。Flask 是一个十分强大且易

    用的 Web 框架。另外,我们还需要使用一些 Falsk 模板代码来创建一个简单的应用。

    因为我们要根据十二要素应用的概念来构建应用,所以需要先创建一个集中管理的代

    码库。现在你应该已经有一个 GitHub 代码库了。如果没有的话,请参考第 1 章的介绍,创

    建一个 GitHub 账户,并将代码推送上去。

    这里假设你已经创建了GitHub账户,我们将使用该代码库:https:github.com

    PacktPublishingCloud-Native-Python.git。 现在我们设置本地目录用于下载远程代码库。为了确定当前位于 app 目录下,先执行

    下列命令:

    mkdir Cloud-Native-Python Creating the directory

    cd Cloud-Native-Python Changing the path to working directory

    git init . Initialising the local directory

    echo Cloud-Native-Python > README.md Adding description of repository

    git add README.md Adding README.md

    git commit -am Initial commit Committing the changes

    git remote add origin

    https:github.comPacktPublishingCloud-Native-Python.git Adding to

    local repository

    git push -u origin master Pushing changes to remote repository.

    你将会看到如下输出。

    第一次代码提交被成功地推送到了远程仓库。我们将继续按这种方式来构建应用程序,直到完成微服务构建。

    现在我们需要安装一款基于文件的数据库 SQLite V3,用作微服务的数据存储。

    使用下列命令安装 SQLite 3:

    apt-get install sqlite3 libsqlite3-dev -y

    创建和使用(source)virtualenv 环境,将本地应用程序的环境与全局

    site-package 安装隔离开来。如果你的机器还未安装 virtualenv,则可以使用以下

    命令安装:

    pip install virtualenv

    使用下列命令创建 virtualenv:

    更多免费电子书搜索「雅书」 https:yabook.org virtualenv env --no-site-packages --python=python3

    source envbinactivate

    上述命令的运行结果如下图所示。

    安装完 virtualenv 后,还要为虚拟环境安装依赖。使用下列命令在 requirements.

    txt 中添加一条依赖声明:

    echo Flask==0.10.1 >> requirements.txt

    后面还会有更多依赖包的声明被添加到该文件中。

    将依赖声明文件中的依赖包安装到虚拟环境中:

    pip install -r requirements.txt

    依赖安装完成后,创建一个 app.py 文件,包含以下内容:

    from flask import Flask

    app = Flask(__name__)

    if __name__ == '__main__':

    app.run(host='0.0.0.0', port=5000, debug=True)

    上述代码显示了使用 Flask 的应用的基本结构。该代码初始化了 Falsk 变量,运行在

    5000 端口,可以从任何地方(0.0.0.0)访问。

    尝试运行程序,查看程序是否工作正常。执行下面的命令:

    python app.py

    命令输出如下图所示。

    到现在为止,我们在开始构建 RESTful API 之前,需要先确定访问的服务根 URL 是什

    么,才能进一步决定子 URL。如下面的示例:

    http:[hostname]apiv1

    在本示例中我们使用的是本地主机,因此hostname应该是locolhost加端口, Flask

    应用的默认端口是 5000。因此该示例应用的根 URL 应该如下:

    http:localhost:5000apiv1

    再确定需要操作的资源类型,哪些可以作为服务暴露出来。在这个例子中,我们创建

    了两种资源类型:users和 tweets。

    users 和 info类型具有如下表所示的 HTTP 方法。

    HTTP

    方法

    URI 动 作

    GET http:localhost:5000apiv1info 返回版本信息

    GET http:localhost:5000apiv1users 返回用户列表

    GET http:localhost:5000apiv1users[user_id] 返回指定user_id的详细

    用户信息

    POST http:localhost:5000apiv1users 根据传入的对象在后台服

    务器中创建一个新的用户

    DELETE http:localhost:5000apiv1users 删除传入的JSON文件中指

    定用户名的用户信息

    PUT http:localhost:5000apiv1users[user_id] 更新 JSON 对象中指定的

    user_id的用户信息

    更多免费电子书搜索「雅书」 https:yabook.org我们可以使用客户端对资源执行 add、remove、modify 等操作。

    基于本章内容,我们将使用在前面已经安装好的基于文件的数据库 SQLite3。

    现在开始创建第一个资源apiv1info,输出可用版本和发布信息。

    在此之前,我们需要先创建一个apirelease表结构,其中包含API版本和发布信息。

    运行下列命令:

    CREATE TABLE apirelease(

    buildtime date,version varchar(30) primary key,links varchar2(30), methods varchar2(30));

    表创建完成后,使用下列命令向 SQLite3 中增加第一个版本(v1):

    Insert into apirelease values ('2017-01-01 10:00:00', v1,apiv1users, get, post, put, delete);

    在 app.py 中定义函数和路由apiv1info 用于处理对apiv1info 路径的

    RESTful 调用。

    from flask import jsonify

    import json

    import sqlite3

    @app.route(apiv1info)

    def home_index:

    conn = sqlite3.connect('mydb.db')

    print (Opened database successfully);

    api_list=[]

    cursor = conn.execute(SELECT buildtime, version,methods, links from apirelease)

    for row in cursor:

    api = {}

    api['version'] = row[0]

    api['buildtime'] = row[1]

    api['methods'] = row[2]

    api['links'] = row[3]

    api_list.append(api) conn.close

    return jsonify({'api_version': api_list}), 200

    现在我们已经有了一个路由并且添加了处理函数,可访问 http:localhost:

    5000apiv1info 进行 RESTful调用,结果如下图所示。

    如图所示,程序可以成功运行!

    我们再来看apiv1users 资源,通过它可以对用户记录执行多种操作。

    为用户定义如下字段。

    id:用户的唯一标识(数字类型)。

    username:用户身份验证的唯一标识(字符串类型)。

    emailid:用户的邮箱(字符串类型)。

    password:用户的密码(字符串类型)。

    full_name:用户的全名(字符串类型)。

    更多免费电子书搜索「雅书」 https:yabook.org使用下列命令在 SQLite中创建用户表结构:

    CREATE TABLE users(

    username varchar2(30),emailid varchar2(30),password varchar2(30), full_name varchar(30),id integer primary key autoincrement);

    构建 user资源的方法

    为 user 资源定义 GET 方法。

    GET apiv1users

    GETapiv1users 方法获取用户列表。通过在 app.py 中添加如下代码片段来创

    建apiv1users 路由:

    @app.route('apiv1users', methods=['GET'])

    def get_users:

    return list_users

    添加了路由后,定义 list_users函数,连接数据库以获取用户列表。在 app.py

    中添加如下代码:

    def list_users:

    conn = sqlite3.connect('mydb.db')

    print (Opened database successfully);

    api_list=[]

    cursor = conn.execute(SELECT username, full_name,email, password, id from users)

    for row in cursor:

    a_dict = {}

    a_dict['username'] = row[0]

    a_dict['name'] = row[1]

    a_dict['email'] = row[2]

    a_dict['password'] = row[3]

    a_dict['id'] = row[4]

    api_list.append(a_dict) conn.close

    return jsonify({'user_list': api_list})

    添加了路由和处理函数后,可以访问 http:localhost:5000apiv1users

    来进行测试,如下图所示。

    GET apiv1users[user_id]

    GETapiv1users[user_id]获取指定 user_id 用户的详细信息。在 app.py

    中为上述 GET 方法添加路由:

    @app.route('apiv1users', methods=['GET'])

    def get_user(user_id):

    return list_user(user_id)

    从上面的代码我们可以看到,list_user(user_id)被路由到 list_user(user)

    函数,其还没有在 app.py 中定义。在 app.py 中定义获取指定用户详细信息的函数:

    def list_user(user_id):

    conn = sqlite3.connect('mydb.db')

    print (Opened database successfully);

    api_list=[]

    cursor=conn.cursor

    cursor.execute(SELECT from users where id=?,(user_id,))

    data = cursor.fetchall

    if len(data) != 0:

    user = {}

    更多免费电子书搜索「雅书」 https:yabook.org user['username'] = data[0][0]

    user['name'] = data[0][1]

    user['email'] = data[0][2]

    user['password'] = data[0][3]

    user['id'] = data[0][4]

    conn.close

    return jsonify(a_dict)

    在添加了 list_user(user_id)函数后,我们来测试一下,如下图所示。

    不好!ID不存在!通常对于 ID 不存在的情况 Flask 应用会返回 404 错误。因为我们开

    发的是 Web应用,因此需要为 API 请求返回 JSON而不是 HTML。下面这段代码返回 404

    错误:

    from flask import make_response

    @app.errorhandler(404)

    def resource_not_found(error):

    return make_response(jsonify({'error':

    'Resource not found!'}), 404)

    下图所示为运行结果。

    另外,还可以在 Flask 中添加 abort 库用于异常处理。同样,也可以为不同的 HTTP

    错误码创建不同的错误处理方法。 现在GET方法已经成功运行,我们再来写一个POST方法,用于向列表中添加新用户。

    向 POST 方法中传递数据有以下两种方法。

    JSON:使用这种方式,记录直接作为 JSON结构体的一部分。RESTful API 调用

    如下:

    curl -i -H Content-Type: applicationjson -X POST -d

    {field1:value} resource_url

    参数形式:使用这种方式,记录的值通过 URL的参数传递:

    curl -i -H Content-Type: applicationjson -X POST

    resource_url?field1=val1field2=val2

    若使用 JSON,则输入的数据作为 JSON结构体的一部分,同样要使用 JSON的方式来

    读取这些数据。而在参数化的方法中,在 URL中传递的数据(username 等)还要使用同

    样的方式来读取。

    另外请注意,后端的 API 创建将随着 API 调用的类型而变化。

    POST apiv1users

    本书将采用第一种 POST 方式,即 JSON 方式。我们在 app.py 中为 POST 方法配置

    路由,然后调用更新数据库中的用户数据函数,如下:

    @app.route('apiv1users', methods=['POST'])

    def create_user:

    if not request.json or not 'username' in request.json or not

    'email' in request.json or not 'password' in request.json:

    abort(400)

    user = {

    'username': request.json['username'],'email': request.json['email'],'name': request.json.get('name',),'password': request.json['password']

    }

    return jsonify({'status': add_user(user)}), 201

    更多免费电子书搜索「雅书」 https:yabook.org在上面的方法中我们调用了处理 400 错误代码的方法,下面实现这个方法:

    @app.errorhandler(400)

    def invalid_request(error):

    return make_response(jsonify({'error': 'Bad Request'}), 400)

    定义 add_user(user)函数来更新用户记录。在 app.py 中进行如下定义:

    def add_user(new_user):

    conn = sqlite3.connect('mydb.db')

    print (Opened database successfully);

    api_list=[]

    cursor=conn.cursor

    cursor.execute(SELECT from users where username=? or

    emailid=?,(new_user['username'],new_user['email']))

    data = cursor.fetchall

    if len(data) != 0:

    abort(409)

    else:

    cursor.execute(insert into users (username, emailid, password,full_name) values(?,?,?,?),(new_user['username'],new_user['email'],new_user['password'], new_user['name']))

    conn.commit

    return Success

    conn.close

    return jsonify(a_dict)

    添加 handler 和 POST方法的路由后,使用 API 调用来测试:

    curl -i -H Content-Type: applicationjson -X POST -d '{

    username:mahesh@rocks, email: mahesh99@gmail.com,password: mahesh123, name:Mahesh }'

    http:localhost:5000apiv1users

    验证用户列表的 curl 请求,http:localhost:5000apiv1users,如下图所

    示。

    DELETE apiv1users

    delete 方法用于删除指定 username 的用户。需要传递一个 JSON 对象,其中必须

    包含 username 的 JSON对象。

    下面的代码片段在 app.py中为用户创建了一个 DELETE 方法的路由:

    @app.route('apiv1users', methods=['DELETE'])

    def delete_user:

    if not request.json or not 'username' in request.json: abort(400)

    user=request.json['username']

    return jsonify({'status': del_user(user)}), 200

    在下面的代码中,调用 del_user,验证 username 是否存在,若存在则删除

    username 的记录。

    def del_user(del_user):

    conn = sqlite3.connect('mydb.db')

    print (Opened database successfully);

    cursor=conn.cursor

    cursor.execute(SELECT from users where username=? ,(del_user,))

    data = cursor.fetchall

    更多免费电子书搜索「雅书」 https:yabook.org print (Data ,data)

    if len(data) == 0:

    abort(404)

    else:

    cursor.execute(delete from users where username==?,(del_user,))

    conn.commit

    return Success

    我们给 DELETE 方法添加了handler 路由,使用下面的 API 调用来测试:

    curl -i -H Content-Type: applicationjson -X delete -d '{

    username:manish123 }' http:localhost:5000apiv1users

    然后请求列出用户的 API(curl http:localhost:5000apiv1users),看看

    用户列表是否有变化,如下图所示。

    用户已成功被删除!

    PUT apiv1users

    PUT API 用来更新指定 user_id 的用户记录。

    在 app.py 文件中定义一个更新 user 记录的 PUT 方法的路由:

    @app.route('apiv1users', methods=['PUT'])

    def update_user(user_id):

    user = {} if not request.json:

    abort(400)

    user['id']=user_id

    key_list = request.json.keys

    for i in key_list:

    user[i] = request.json[i]

    print (user)

    return jsonify({'status': upd_user(user)}), 200

    定义 udp_user(user)函数,以更新 id 用户的数据:

    def upd_user(user):

    conn = sqlite3.connect('mydb.db')

    print (Opened database successfully);

    cursor=conn.cursor

    cursor.execute(SELECT from users where id=? ,(user['id'],))

    data = cursor.fetchall

    print (data)

    if len(data) == 0:

    abort(404)

    else:

    key_list=user.keys

    for i in key_list:

    if i != id:

    print (user, i)

    cursor.execute(UPDATE users set {0}=? where id=? ,(i, user[i], user['id']))

    cursor.execute(UPDATE users SET {0} = ? WHERE id =

    .format(i), (user[i], user['id']))

    conn.commit

    return Success

    添加了用户资源的 PUT 方法的 API 处理器后,我们来进行测试,如下图所示。

    更多免费电子书搜索「雅书」 https:yabook.org

    我们之前定义的资源都属于 v1 版本,现在我们再定义 v2 版本的资源,向微服务中添

    加 tweet (推文)资源。在users 资源中定义的用户可以对他们的推文进行操作。 apiinfo

    如下图所示。

    推文资源的 HTTP 方法如下表所示。 HTTP方法 URI 动 作

    GET http:localhost:5000apiv2tweets 获取推文列表

    GET http:localhost:5000apiv2users[user_id] 获取指定ID的推文

    POST http:localhost:5000apiv2tweets 发送新的推文并保存到数

    据库中

    推文中包括如下字段。

    id:每条推文的唯一标识(数字类型)。

    username:应该是 users资源中存在的用户(字符串类型)。

    body:推文的内容(字符串类型)。

    Tweet_time:(指定类型)。

    在 SQLite 3中定义推文资源表结构:

    CREATE TABLE tweets(

    id integer primary key autoincrement,username varchar2(30),body varchar2(30),tweet_time date);

    推文资源的表结构创建好后,就可以开始创建获取推文资源的 GET 方法了。

    构建 tweet资源的方法

    下面将创建对数据库中推文执行不同操作的方法和对应的 API。

    GET apiv2tweets

    该方法可以获取所有用户的所有推文。

    在 app.py 中添加如下代码指定 GET 方法的路由:

    @app.route('apiv2tweets', methods=['GET'])

    def get_tweets:

    return list_tweets

    Let's define0020list_tweets function which connects to database and

    get us all the tweets and respond back with tweets list

    def list_tweets:

    更多免费电子书搜索「雅书」 https:yabook.org conn = sqlite3.connect('mydb.db')

    print (Opened database successfully);

    api_list=[]

    cursor = conn.execute(SELECT username, body, tweet_time, id from

    tweets)

    data = cursor.fetchall

    if data != 0:

    for row in cursor:

    tweets = {}

    tweets['Tweet By'] = row[0]

    tweets['Body'] = row[1]

    tweets['Timestamp'] = row[2]

    tweets['id'] = row[3]

    api_list.append(tweets)

    else:

    return api_list

    conn.close

    return jsonify({'tweets_list': api_list})

    在添加了获取所有推文的方法后,通过 RESTful API 调用来测试上述代码,如下图所

    示。

    因为到目前为止我们还没有添加任何推文,所以返回的结果是空的。下面我们来添加

    几条推文试一试。 POST apiv2tweets

    POST 方法为指定用户添加推文。

    下面代码在 app.py 中添加 POST 方法的路由:

    @app.route('apiv2tweets', methods=['POST'])

    def add_tweets:

    user_tweet = {}

    if not request.json or not 'username' in request.json or not

    'body' in request.json:

    abort(400)

    user_tweet['username'] = request.json['username']

    user_tweet['body'] = request.json['body']

    user_tweet['created_at']=strftime(%Y-%m-%dT%H:%M:%SZ, gmtime)

    print (user_tweet)

    return jsonify({'status': add_tweet(user_tweet)}), 200

    定义为指定用户添加推文的 add_tweet(user_tweet)方法:

    def add_tweet(new_tweets):

    conn = sqlite3.connect('mydb.db')

    print (Opened database successfully);

    cursor=conn.cursor

    cursor.execute(SELECT from users where username=? ,(new_tweets['username'],))

    data = cursor.fetchall

    if len(data) == 0:

    abort(404)

    else:

    cursor.execute(INSERT into tweets (username, body, tweet_time)

    values(?,?,?),(new_tweets['username'],new_tweets['body'],new_tweets['created_at']))

    conn.commit

    return Success

    使用 RESTful API 调用测试上面定义的向数据库中添加推文的函数:

    更多免费电子书搜索「雅书」 https:yabook.orgcurl -i -H Content-Type: applicationjson -X POST -d '{

    username:mahesh@rocks,body: It works }'

    http:localhost:5000apiv2tweets

    结果如下图所示。

    检查推文是否真的被成功添加到了数据库中:

    curl http:localhost:5000apiv2tweets –v

    结果如下图所示。

    由上图可知,我们已经添加了第一条推文。那么如果只想看指定 ID 的推文该怎么办

    呢?可以在 GET 方法中指定 user_id。

    GET apiv2tweets[id]

    GET 方法获取指定 ID的推文。

    在 app.py 中添加如下代码,定义获取指定 ID 的 GET 方法的路由:

    @app.route('apiv2tweets', methods=['GET'])

    def get_tweet(id):

    return list_tweet(id)

    定义 list_tweet方法,该方法用来连接数据库,获取指定 ID 的推文,返回 JSON

    数据:

    def list_tweet(user_id):

    print (user_id)

    conn = sqlite3.connect('mydb.db')

    print (Opened database successfully);

    api_list=[]

    cursor=conn.cursor

    cursor.execute(SELECT from tweets where id=?,(user_id,))

    data = cursor.fetchall

    print (data)

    if len(data) == 0:

    abort(404)

    else:

    user = {}

    user['id'] = data[0][0]

    user['username'] = data[0][1]

    user['body'] = data[0][2]

    user['tweet_time'] = data[0][3]

    conn.close

    return jsonify(user)

    更多免费电子书搜索「雅书」 https:yabook.org添加了获取指定 ID 的推文方法后,使用下面的 RESTful API 调用测试:

    curl http:localhost:5000apiv2tweets2

    结果如下图所示。

    至此,我们已经成功构建了 RESTful API,作为访问数据所需的微服务,并对其执行了

    各种操作。

    测试 RESTful API

    到目前为止我们构建的所有RESTful API都是通过访问根URL来确认后端方法是否可

    以正确执行的。每次写了新的代码都要从头执行一遍来确认是否可以在生产环境上正确运

    行。下面,我们将编写可以作为系统单独运行的测试用例,以确保后端服务可以在生产环

    境正确运行。

    有多种不同类型的测试。

    功能性测试:主要用于测试组件或系统的功能。对组件的功能规范执行此测试。

    非功能性测试:这种测试针对组件的质量特性进行测试,其中包括效率测试、可

    靠性测试等。

    结构测试:这种类型的测试用于测试系统的结构。为了编写测试用例,测试人员

    需要了解代码的内部实现。

    在本节中,我们将根据上面的应用编写测试用例,特别是单元测试用例。我们将编写

    自动测试的 Python 代码,测试所有 API 调用,返回测试结果。 单元测试

    单元测试用于测试系统中的工作单元或逻辑单元代码。以下是单元测试用例的特点。

    自动化:可以自动执行。

    独立:不应该有任何依赖。

    持续可重复:保持幂等性。

    可维护:容易理解和更新。

    我们使用名为 nose 的单元测试框架,还可以使用 docstest (https:docs.python.

    org2librarydoctest.html)来测试。

    使用下面的命令安装 nose:

    pip install nose

    也可以把它写到 requirement.txt 文件中,执行下面的命令安装:

    pip install -r requirements.txt

    安装完 nose测试框架后,在另一个名为 flask_test.py 的文件中初始化测试用例。

    from app import app

    import unittest

    class FlaskappTests(unittest.TestCase):

    def setUp(self):

    creates a test client

    self.app = app.test_client

    propagate the exceptions to the test client

    self.app.testing = True

    上述代码可以初始化 slef.app 测试用例。

    在 FlaskappTest 类中添加测试用例,获取 GET apiv1users 的返回码:

    def test_users_status_code(self):

    sends HTTP GET request to the application

    result = self.app.get('apiv1users')

    assert the status code of the response

    更多免费电子书搜索「雅书」 https:yabook.org self.assertEqual(result.status_code, 200)

    上述代码将测试访问apiv1users 是否返回 200;如果没有将返回错误,表示测

    试失败。从代码中可以看到,这段代码没有依赖任何其他代码,这就是所谓的单元测试。

    如何运行这段代码?我们已经安装了 nose 测试框架,只要在测试文件(本例中是

    flask_test.py)所在的当前目录下执行下面的命令即可:

    nosetests

    以此类推,为本章前面创建的不同资源方法的 RESTful API 编写更多的测试用例。

    GETapiv2tweets 的测试用例如下:

    def test_tweets_status_code(self):

    sends HTTP GET request to the application

    result = self.app.get('apiv2tweets')

    assert the status code of the response

    self.assertEqual(result.status_code, 200)

    GETapiv1info 的测试用例如下:

    def test_tweets_status_code(self):

    sends HTTP GET request to the application

    result = self.app.get('apiv1info')

    assert the status code of the response

    self.assertEqual(result.status_code, 200)

    POSTapiv1users 的测试用例如下:

    def test_addusers_status_code(self):

    sends HTTP POST request to the application

    result = self.app.post('apiv1users', data='{username:

    manish21, email:manishtest@gmail.com, password: test123}',content_type='applicationjson')

    print (result)

    assert the status code of the response

    self.assertEquals(result.status_code, 201)

    PUTapiv1users 的测试用例如下:

    def test_updusers_status_code(self):

    sends HTTP PUT request to the application

    on the specified path result = self.app.put('apiv1users4', data='{password:

    testing123}', content_type='applicationjson')

    assert the status code of the response

    self.assertEquals(result.status_code, 200)

    POSTapiv1tweets 的测试用例如下:

    def test_addtweets_status_code(self):

    sends HTTP GET request to the application

    on the specified path

    result = self.app.post('apiv2tweets', data='{username:

    mahesh@rocks, body:Wow! Is it working testing}',content_type='applicationjson')

    assert the status code of the response

    self.assertEqual(result.status_code, 201)

    DELETEapiv1users 的测试用例如下:

    def test_delusers_status_code(self):

    sends HTTP Delete request to the application

    result = self.app.delete('apiv1users', data='{username:

    manish21}', content_type='applicationjson')

    assert the status code of the response

    self.assertEquals(result.status_code, 200)

    同样,你还可以根据自己的想法编写更多的测试用例,使这些 RESTful API 更可靠和

    无 Bug。

    执行上述所有测试用例,看看测试是否可以通过。flask_test.py 脚本的执行结果

    如下图所示。

    更多免费电子书搜索「雅书」 https:yabook.org太棒了!所有的测试都通过了,我们可以进入下一阶段了,即为这些 RESTful API 创

    建 Web 页面。

    本章小结

    本章我们主要通过编程来构建微服务,由此我们对RESTful API的工作原理有所了解,还了解到如何扩展这些 API,并了解了这些 API 的 HTTP 响应。此外,我们还学习了如何

    编写测试用例,这对于确保代码在生产环境正确运行都是很重要的。

    3

    使用 Python 构建 Web 应用

    在上一章中我们主要关注如何构建和测试微服务的后端 RE ......

您现在查看是摘要介绍页, 详见PDF附件(9895KB,325页)