Preface |
|
xi | |
|
1 Toward a Microservices Architecture |
|
|
1 | (14) |
|
|
2 | (2) |
|
Reducing Coordination Costs |
|
|
4 | (1) |
|
The Coordination Cost Problem |
|
|
4 | (2) |
|
|
6 | (1) |
|
|
7 | (1) |
|
The "Up and Running" Microservices Model |
|
|
8 | (2) |
|
|
10 | (1) |
|
Writing a Lightweight Architectural Decision Record |
|
|
11 | (2) |
|
|
13 | (2) |
|
2 Designing a Microservices Operating Model |
|
|
15 | (20) |
|
Why Teams and People Matter |
|
|
16 | (1) |
|
|
17 | (1) |
|
|
18 | (1) |
|
|
19 | (2) |
|
Introducing Team Topologies |
|
|
21 | (1) |
|
|
21 | (2) |
|
|
23 | (1) |
|
Designing a Microservices Team Topology |
|
|
24 | (1) |
|
Establish a System Design Team |
|
|
24 | (2) |
|
Building a Microservices Team Template |
|
|
26 | (3) |
|
|
29 | (2) |
|
Enabling and Complicated-Subsystem Teams |
|
|
31 | (1) |
|
|
32 | (2) |
|
|
34 | (1) |
|
3 Designing Microservices: The Seed(s) Process |
|
|
35 | (22) |
|
Introducing the Seven Essential Evolutions of Design for Services: The Seed(s) Method |
|
|
36 | (1) |
|
|
37 | (2) |
|
Example Actors in Our Sample Project |
|
|
39 | (1) |
|
Identifying Jobs That Actors Have to Do |
|
|
39 | (2) |
|
Using Job Story Format to Capture JTBDs |
|
|
41 | (1) |
|
Example JTBDs in Our Sample Project |
|
|
42 | (1) |
|
Discovering Interaction Patterns with Sequence Diagrams |
|
|
43 | (2) |
|
Deriving Actions and Queries from JTBDs |
|
|
45 | (2) |
|
Example Queries and Actions for Our Sample Project |
|
|
47 | (1) |
|
Describing Each Query and Action as a Specification with an Open Standard |
|
|
48 | (1) |
|
Example OAS for an Action in Our Sample Project |
|
|
49 | (4) |
|
Getting Feedback on the API Specification |
|
|
53 | (1) |
|
Implementing Microservices |
|
|
53 | (1) |
|
Microservices Versus APIs |
|
|
54 | (2) |
|
|
56 | (1) |
|
4 Rightsizing Your Microservices: Finding Service Boundaries |
|
|
57 | (18) |
|
Why Boundaries Matter, When They Matter, and How to Find Them |
|
|
57 | (2) |
|
Domain-Driven Design and Microservice Boundaries |
|
|
59 | (3) |
|
|
62 | (3) |
|
Synchronous Versus Asynchronous Integrations |
|
|
65 | (1) |
|
|
66 | (1) |
|
Introduction to Event Storming |
|
|
66 | (2) |
|
The Event-Storming Process |
|
|
68 | (5) |
|
Introducing the Universal Sizing Formula |
|
|
73 | (1) |
|
The Universal Sizing Formula |
|
|
74 | (1) |
|
|
74 | (1) |
|
|
75 | (22) |
|
Independent Deployability and Data Sharing |
|
|
75 | (2) |
|
Microservices Embed Their Data |
|
|
77 | (1) |
|
Embedding Data Should Not Lead to an Explosion in the Number of Database Clusters |
|
|
78 | (1) |
|
Data Embedding and the Data Delegate Pattern |
|
|
79 | (2) |
|
Using Data Duplication to Solve for Independence |
|
|
81 | (1) |
|
Distributed Transactions and Surviving Failures |
|
|
82 | (3) |
|
|
85 | (1) |
|
|
85 | (6) |
|
Improving Performance with Rolling Snapshots |
|
|
91 | (1) |
|
|
92 | (1) |
|
Command Query Responsibility Segregation |
|
|
93 | (1) |
|
Event Sourcing and CQRS Beyond Microservices |
|
|
94 | (1) |
|
|
95 | (2) |
|
6 Building an Infrastructure Pipeline |
|
|
97 | (40) |
|
DevOps Principles and Practices |
|
|
98 | (1) |
|
|
99 | (1) |
|
|
100 | (2) |
|
Continuous Integration and Continuous Delivery |
|
|
102 | (2) |
|
Setting Up the IaC Environment |
|
|
104 | (1) |
|
|
104 | (1) |
|
|
105 | (1) |
|
Configuring Amazon Web Services |
|
|
106 | (1) |
|
Setting Up an AWS Operations Account |
|
|
106 | (4) |
|
|
110 | (2) |
|
Setting Up AWS Permissions |
|
|
112 | (3) |
|
Creating an S3 Backend for Terraform |
|
|
115 | (1) |
|
|
116 | (1) |
|
Creating the Sandbox Repository |
|
|
117 | (2) |
|
|
119 | (1) |
|
Writing the Code for the Sandbox Environment |
|
|
120 | (3) |
|
|
123 | (10) |
|
|
133 | (2) |
|
|
135 | (2) |
|
7 Building a Microservices Infrastructure |
|
|
137 | (42) |
|
Infrastructure Components |
|
|
137 | (1) |
|
|
138 | (1) |
|
|
139 | (1) |
|
The GitOps Deployment Server |
|
|
140 | (2) |
|
Implementing the Infrastructure |
|
|
142 | (1) |
|
|
142 | (1) |
|
Setting Up the Module Repositories |
|
|
142 | (3) |
|
|
145 | (15) |
|
|
160 | (11) |
|
|
171 | (4) |
|
|
175 | (2) |
|
Cleaning Up the Infrastructure |
|
|
177 | (1) |
|
|
178 | (1) |
|
|
179 | (18) |
|
Coding Standards and the Developer's Setup |
|
|
180 | (1) |
|
10 Workspace Guidelines for a Superior Developer Experience |
|
|
181 | (6) |
|
Setting Up a Containerized Environment Locally |
|
|
187 | (1) |
|
|
188 | (1) |
|
Entering the Container and Mapping Folders |
|
|
189 | (1) |
|
|
190 | (1) |
|
|
191 | (1) |
|
Advanced Local Docker Usage: Installing Cassandra |
|
|
192 | (1) |
|
|
193 | (2) |
|
|
195 | (2) |
|
9 Developing Microservices |
|
|
197 | (34) |
|
Designing Microservice Endpoints |
|
|
197 | (4) |
|
|
201 | (1) |
|
Reservations Microservice |
|
|
201 | (1) |
|
Designing an Open API Specification |
|
|
202 | (6) |
|
Implementing the Data for a Microservice |
|
|
208 | (1) |
|
Redis for the Reservations Data Model |
|
|
209 | (2) |
|
MySQL Data Model for the Flights Microservice |
|
|
211 | (1) |
|
Implementing Code for a Microservice |
|
|
212 | (1) |
|
The Code Behind the Flights Microservice |
|
|
213 | (5) |
|
|
218 | (2) |
|
Introducing a Second Microservice to the Project |
|
|
220 | (6) |
|
Hooking Services Up with an Umbrella Project |
|
|
226 | (3) |
|
|
229 | (2) |
|
10 Releasing Microservices |
|
|
231 | (32) |
|
Setting Up the Staging Environment |
|
|
232 | (1) |
|
|
233 | (1) |
|
|
234 | (1) |
|
Forking the Staging Infrastructure Project |
|
|
234 | (1) |
|
Configuring the Staging Workflow |
|
|
235 | (2) |
|
Editing the Staging Infrastructure Code |
|
|
237 | (4) |
|
Shipping the Flight Information Container |
|
|
241 | (1) |
|
|
241 | (1) |
|
|
242 | (1) |
|
|
242 | (4) |
|
Deploying the Flights Service Container |
|
|
246 | (1) |
|
Understanding Kubernetes Deployments |
|
|
247 | (1) |
|
|
248 | (1) |
|
Creating the Microservices Deployment Repository |
|
|
249 | (6) |
|
Argo CD for GitOps Deployment |
|
|
255 | (5) |
|
|
260 | (1) |
|
|
261 | (2) |
|
|
263 | (18) |
|
Changes in a Microservices System |
|
|
263 | (1) |
|
|
264 | (1) |
|
|
265 | (1) |
|
Three Deployment Patterns |
|
|
266 | (2) |
|
Considerations for Our Architecture |
|
|
268 | (1) |
|
|
269 | (4) |
|
|
273 | (4) |
|
|
277 | (2) |
|
|
279 | (2) |
|
12 A Journey's End (and a New Beginning) |
|
|
281 | (10) |
|
On Complexity and Simplification Using Microservices |
|
|
282 | (1) |
|
|
283 | (2) |
|
Measuring the Progress of a Microservices Transformation |
|
|
285 | (3) |
|
|
288 | (3) |
Index |
|
291 | |