Preface What this book covers What you need for this book Who this book is for Conventions Reader feedback Customer support Downloading the example code Errata Piracy Questions Understanding Microservices Origins of Service-Oriented Architecture The monolithic approach The microservice approach Microservice benefits Separation of concerns Smaller projects Scaling and deployment Microservices pitfalls Illogical splitting More network interactions Data storing and sharing Compatibility issues Testing Implementing microservices with Python The WSGI standard Greenlet and Gevent Twisted and Tornado asyncio Language performances Summary Discovering Flask Which Python? How Flask handles requests Routing Variables and converters The url_for function Request Response Flask built-in features The session object Globals Signals Extensions and middlewares Templates Configuration Blueprints Error handling and debugging Custom error handler The debug mode A microservice skeleton Summary Coding, Testing, and Documenting - the Virtuous Cycle Different kinds of tests Unit tests Functional tests Integration tests Load tests End-to-end tests Using WebTest Using pytest and Tox Developer documentation Continuous Integration Travis-CI ReadTheDocs Coveralls Summary Designing Runnerly The Runnerly application User stories Monolithic design Model View and Template Background tasks Strava token Authentication and authorization Putting together the monolithic design Splitting the monolith Data Service Using Open API 2.0 More splitting Summary Interacting with Other Services Synchronous calls Using Session in a Flask app Connection pooling HTTP cache headers Improving data transfer GZIP compression Binary payloads Putting it together Asynchronous calls Task queues Topic queues Publish/subscribe RPC over AMQP Putting it together Testing Mocking synchronous calls Mocking asynchronous calls Mocking Celery Mocking other asynchronous calls Summary Monitoring Your Services Centralizing logs Setting up Graylog Sending logs to Graylog Adding extra fields Performance metrics System metrics Code metrics Web server metrics Summary Securing Your Services The OAuth2 protocol Token-based authentication The JWT standard PyJWT X.509 certificate-based authentication The TokenDealer microservice The POST/oauth/token implementation Using TokenDealer Web application firewall OpenResty - Lua and nginx Rate and concurrency limiting Other OpenResty features Securing your code Asserting incoming data Limiting your application scope Using Bandit linter Bringing It All Together Building a ReactJS dashboard The JSX syntax React components ReactJS and Flask Using Bower, npm, and Babel Cross-origin resource sharing Authentication and authorization Interacting with Data Service Getting the Strava token JavaScript authentication Packaging and Running Runnerly The packaging toolchain A few definitions Packaging The setup.py file The requirements.txt file The MANIFEST.in file Versioning Releasing Distributing Running all microservices Process management Summary Containerized Services What is Docker? Docker 101 Running Flask in Docker The full stack - OpenResty, Circus and Flask OpenResty Circus Docker-based deployments Docker Compose Introduction to Clustering and Provisioning Summary Deploying on AWS AWS overview Routing - Route53, ELB, and AutoScaling Execution - EC2 and Lambda Storage - EBS, S3, RDS, ElasticCache, and CloudFront Messaging - SES, SQS, and SNS Simple Email Service (SES) Simple Queue Service (SQS) Simple Notification Service (SNS) Provisioning and deployment - CloudFormation and ECS Deploying on AWS - the basics Setting up your AWS account Deploying on EC2 with CoreOS Deploying with ECS Route53 Summary What Next? Iterators and generators Coroutines The asyncio library The aiohttp framework Sanic Asynchronous versus synchronous