├── .idea
├── .gitignore
├── vcs.xml
├── misc.xml
└── modules.xml
├── README.md
├── kafka-client.yml
├── food-ordering-system-infra.iml
├── postgres-deployment.yml
├── create-topics.sh
├── tag-and-push-images.sh
├── application-deployment-local.yml
└── application-deployment.yml
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Food ordering system infrastructure repo in Udemy course: Microservices: Clean Architecture, DDD, SAGA, Outbox & Kafka
2 |
3 | Implement SAGA, Outbox and CQRS patterns using the 4 Spring boot Java microservices that you will develop using Clean and Hexagonal architecture principles and with DDD.
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/kafka-client.yml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Pod
3 | metadata:
4 | name: kafka-client
5 | namespace: default
6 | spec:
7 | containers:
8 | - name: kafka-client
9 | image: confluentinc/cp-enterprise-kafka:6.1.0
10 | volumeMounts:
11 | - name: kafka-client-storage
12 | mountPath: /kafka-client-storage
13 | command:
14 | - sh
15 | - -c
16 | - "exec tail -f /dev/null"
17 | volumes:
18 | - name: kafka-client-storage
19 |
--------------------------------------------------------------------------------
/food-ordering-system-infra.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/postgres-deployment.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: apps/v1
3 | kind: Deployment
4 | metadata:
5 | name: postgres-deployment
6 | namespace: default
7 | labels:
8 | app: postgres-deployment
9 | spec:
10 | selector:
11 | matchLabels:
12 | app: postgres-deployment
13 | template:
14 | metadata:
15 | labels:
16 | app: postgres-deployment
17 | spec:
18 | containers:
19 | - name: postgres
20 | image: postgres:latest
21 | env:
22 | - name: POSTGRES_PASSWORD
23 | value: "admin"
24 | ---
25 | apiVersion: v1
26 | kind: Service
27 | metadata:
28 | name: postgres-service
29 | namespace: default
30 | labels:
31 | app: postgres-deployment
32 | spec:
33 | selector:
34 | app: postgres-deployment
35 | ports:
36 | - name: postgres-service-port
37 | protocol: TCP
38 | port: 5432
39 | type: LoadBalancer
40 | loadBalancerIP: ""
--------------------------------------------------------------------------------
/create-topics.sh:
--------------------------------------------------------------------------------
1 | #local-confluent-kafka-cp-zookeeper-headless
2 | kafka-topics --zookeeper $1:2181 --topic payment-request --delete --if-exists
3 | kafka-topics --zookeeper $1:2181 --topic payment-response --delete --if-exists
4 | kafka-topics --zookeeper $1:2181 --topic restaurant-approval-request --delete --if-exists
5 | kafka-topics --zookeeper $1:2181 --topic restaurant-approval-response --delete --if-exists
6 | kafka-topics --zookeeper $1:2181 --topic customer --delete --if-exists
7 |
8 | kafka-topics --zookeeper $1:2181 --topic payment-request --create --partitions 3 --replication-factor 3 --if-not-exists
9 | kafka-topics --zookeeper $1:2181 --topic payment-response --create --partitions 3 --replication-factor 3 --if-not-exists
10 | kafka-topics --zookeeper $1:2181 --topic restaurant-approval-request --create --partitions 3 --replication-factor 3 --if-not-exists
11 | kafka-topics --zookeeper $1:2181 --topic restaurant-approval-response --create --partitions 3 --replication-factor 3 --if-not-exists
12 | kafka-topics --zookeeper $1:2181 --topic customer --create --partitions 3 --replication-factor 3 --if-not-exists
13 |
--------------------------------------------------------------------------------
/tag-and-push-images.sh:
--------------------------------------------------------------------------------
1 | gcloud auth login
2 |
3 | docker tag com.food.ordering.system/order.service:$1 europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/order.service:$1
4 | docker tag com.food.ordering.system/payment.service:$1 europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/payment.service:$1
5 | docker tag com.food.ordering.system/restaurant.service:$1 europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/restaurant.service:$1
6 | docker tag com.food.ordering.system/customer.service:$1 europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/customer.service:$1
7 |
8 | docker push europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/order.service:$1
9 | docker push europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/payment.service:$1
10 | docker push europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/restaurant.service:$1
11 | docker push europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/customer.service:$1
12 |
13 |
--------------------------------------------------------------------------------
/application-deployment-local.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: apps/v1
3 | kind: Deployment
4 | metadata:
5 | name: order-deployment
6 | namespace: default
7 | labels:
8 | app: order-deployment
9 | spec:
10 | selector:
11 | matchLabels:
12 | app: order-deployment
13 | template:
14 | metadata:
15 | labels:
16 | app: order-deployment
17 | spec:
18 | containers:
19 | - name: order-service
20 | image: com.food.ordering.system/order.service:1.0-SNAPSHOT
21 | env:
22 | - name: SPRING_DATASOURCE_URL
23 | value: "jdbc:postgresql://postgres-service:5432/postgres?currentSchema=order&binaryTransfer=true&reWriteBatchedInserts=true&stringtype=unspecified"
24 | - name: KAFKA-CONFIG_BOOTSTRAP-SERVERS
25 | value: "local-confluent-kafka-cp-kafka-headless:9092"
26 | - name: KAFKA-CONFIG_SCHEMA-REGISTRY-URL
27 | value: "http://local-confluent-kafka-cp-schema-registry:8081"
28 | resources:
29 | limits:
30 | cpu: "500m"
31 | memory: "1024Mi"
32 | requests:
33 | cpu: "200m"
34 | memory: "256Mi"
35 | ---
36 | apiVersion: v1
37 | kind: Service
38 | metadata:
39 | name: order-service
40 | namespace: default
41 | labels:
42 | app: order-service
43 | spec:
44 | selector:
45 | app: order-deployment
46 | ports:
47 | - name: order-service-port
48 | protocol: TCP
49 | port: 8181
50 | type: LoadBalancer
51 | loadBalancerIP: ""
52 |
53 | ---
54 | apiVersion: apps/v1
55 | kind: Deployment
56 | metadata:
57 | name: payment-deployment
58 | namespace: default
59 | labels:
60 | app: payment-deployment
61 | spec:
62 | selector:
63 | matchLabels:
64 | app: payment-deployment
65 | template:
66 | metadata:
67 | labels:
68 | app: payment-deployment
69 | spec:
70 | containers:
71 | - name: payment-service
72 | image: com.food.ordering.system/payment.service:1.0-SNAPSHOT
73 | env:
74 | - name: SPRING_DATASOURCE_URL
75 | value: "jdbc:postgresql://postgres-service:5432/postgres?currentSchema=payment&binaryTransfer=true&reWriteBatchedInserts=true&stringtype=unspecified"
76 | - name: KAFKA-CONFIG_BOOTSTRAP-SERVERS
77 | value: "local-confluent-kafka-cp-kafka-headless:9092"
78 | - name: KAFKA-CONFIG_SCHEMA-REGISTRY-URL
79 | value: "http://local-confluent-kafka-cp-schema-registry:8081"
80 | resources:
81 | limits:
82 | cpu: "500m"
83 | memory: "1024Mi"
84 | requests:
85 | cpu: "200m"
86 | memory: "256Mi"
87 | ---
88 | apiVersion: v1
89 | kind: Service
90 | metadata:
91 | name: payment-service
92 | namespace: default
93 | labels:
94 | app: payment-service
95 | spec:
96 | selector:
97 | app: payment-deployment
98 | ports:
99 | - name: payment-service-port
100 | protocol: TCP
101 | port: 8182
102 | type: LoadBalancer
103 | loadBalancerIP: ""
104 |
105 | ---
106 | apiVersion: apps/v1
107 | kind: Deployment
108 | metadata:
109 | name: restaurant-deployment
110 | namespace: default
111 | labels:
112 | app: restaurant-deployment
113 | spec:
114 | selector:
115 | matchLabels:
116 | app: restaurant-deployment
117 | template:
118 | metadata:
119 | labels:
120 | app: restaurant-deployment
121 | spec:
122 | containers:
123 | - name: restaurant-service
124 | image: com.food.ordering.system/restaurant.service:1.0-SNAPSHOT
125 | env:
126 | - name: SPRING_DATASOURCE_URL
127 | value: "jdbc:postgresql://postgres-service:5432/postgres?currentSchema=restaurant&binaryTransfer=true&reWriteBatchedInserts=true&stringtype=unspecified"
128 | - name: KAFKA-CONFIG_BOOTSTRAP-SERVERS
129 | value: "local-confluent-kafka-cp-kafka-headless:9092"
130 | - name: KAFKA-CONFIG_SCHEMA-REGISTRY-URL
131 | value: "http://local-confluent-kafka-cp-schema-registry:8081"
132 | resources:
133 | limits:
134 | cpu: "500m"
135 | memory: "1024Mi"
136 | requests:
137 | cpu: "200m"
138 | memory: "256Mi"
139 | ---
140 | apiVersion: v1
141 | kind: Service
142 | metadata:
143 | name: restaurant-service
144 | namespace: default
145 | labels:
146 | app: restaurant-service
147 | spec:
148 | selector:
149 | app: restaurant-deployment
150 | ports:
151 | - name: restaurant-service-port
152 | protocol: TCP
153 | port: 8183
154 | type: LoadBalancer
155 | loadBalancerIP: ""
156 |
157 | ---
158 | apiVersion: apps/v1
159 | kind: Deployment
160 | metadata:
161 | name: customer-deployment
162 | labels:
163 | app: customer-deployment
164 | spec:
165 | selector:
166 | matchLabels:
167 | app: customer-deployment
168 | template:
169 | metadata:
170 | labels:
171 | app: customer-deployment
172 | spec:
173 | containers:
174 | - name: customer-service
175 | image: com.food.ordering.system/customer.service:1.0-SNAPSHOT
176 | env:
177 | - name: SPRING_DATASOURCE_URL
178 | value: "jdbc:postgresql://postgres-service:5432/postgres?currentSchema=customer&binaryTransfer=true&reWriteBatchedInserts=true&stringtype=unspecified"
179 | - name: KAFKA-CONFIG_BOOTSTRAP-SERVERS
180 | value: "local-confluent-kafka-cp-kafka-headless:9092"
181 | - name: KAFKA-CONFIG_SCHEMA-REGISTRY-URL
182 | value: "http://local-confluent-kafka-cp-schema-registry:8081"
183 | resources:
184 | limits:
185 | cpu: "500m"
186 | memory: "1024Mi"
187 | requests:
188 | cpu: "200m"
189 | memory: "256Mi"
190 | ---
191 | apiVersion: v1
192 | kind: Service
193 | metadata:
194 | name: customer-service
195 | namespace: default
196 | labels:
197 | app: customer-service
198 | spec:
199 | selector:
200 | app: customer-deployment
201 | ports:
202 | - name: customer-service-port
203 | protocol: TCP
204 | port: 8184
205 | type: LoadBalancer
206 | loadBalancerIP: ""
--------------------------------------------------------------------------------
/application-deployment.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: apps/v1
3 | kind: Deployment
4 | metadata:
5 | name: order-deployment
6 | namespace: default
7 | labels:
8 | app: order-deployment
9 | spec:
10 | selector:
11 | matchLabels:
12 | app: order-deployment
13 | template:
14 | metadata:
15 | labels:
16 | app: order-deployment
17 | spec:
18 | containers:
19 | - name: order-service
20 | image: europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/order.service:1.0-SNAPSHOT
21 | env:
22 | - name: SPRING_DATASOURCE_URL
23 | value: "jdbc:postgresql://postgres-service:5432/postgres?currentSchema=order&binaryTransfer=true&reWriteBatchedInserts=true&stringtype=unspecified"
24 | - name: SPRING_DATASOURCE_INITIALIZATION-MODE
25 | value: "never"
26 | - name: KAFKA-CONFIG_BOOTSTRAP-SERVERS
27 | value: "gke-confluent-kafka-cp-kafka-headless:9092"
28 | - name: KAFKA-CONFIG_SCHEMA-REGISTRY-URL
29 | value: "http://gke-confluent-kafka-cp-schema-registry:8081"
30 | resources:
31 | limits:
32 | cpu: "500m"
33 | memory: "1024Mi"
34 | requests:
35 | cpu: "200m"
36 | memory: "256Mi"
37 | ---
38 | apiVersion: v1
39 | kind: Service
40 | metadata:
41 | name: order-service
42 | namespace: default
43 | labels:
44 | app: order-service
45 | spec:
46 | selector:
47 | app: order-deployment
48 | ports:
49 | - name: order-service-port
50 | protocol: TCP
51 | port: 8181
52 | type: LoadBalancer
53 | loadBalancerIP: ""
54 | ---
55 | apiVersion: autoscaling/v2beta1
56 | kind: HorizontalPodAutoscaler
57 | metadata:
58 | name: order-deployment-hpa
59 | namespace: default
60 | labels:
61 | app: order-deployment
62 | spec:
63 | scaleTargetRef:
64 | kind: Deployment
65 | name: order-deployment
66 | apiVersion: apps/v1
67 | minReplicas: 2
68 | maxReplicas: 4
69 | metrics:
70 | - type: Resource
71 | resource:
72 | name: cpu
73 | targetAverageUtilization: 85
74 | ---
75 | apiVersion: apps/v1
76 | kind: Deployment
77 | metadata:
78 | name: payment-deployment
79 | namespace: default
80 | labels:
81 | app: payment-deployment
82 | spec:
83 | selector:
84 | matchLabels:
85 | app: payment-deployment
86 | template:
87 | metadata:
88 | labels:
89 | app: payment-deployment
90 | spec:
91 | containers:
92 | - name: payment-service
93 | image: europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/payment.service:1.0-SNAPSHOT
94 | env:
95 | - name: SPRING_DATASOURCE_URL
96 | value: "jdbc:postgresql://postgres-service:5432/postgres?currentSchema=payment&binaryTransfer=true&reWriteBatchedInserts=true&stringtype=unspecified"
97 | - name: SPRING_DATASOURCE_INITIALIZATION-MODE
98 | value: "never"
99 | - name: KAFKA-CONFIG_BOOTSTRAP-SERVERS
100 | value: "gke-confluent-kafka-cp-kafka-headless:9092"
101 | - name: KAFKA-CONFIG_SCHEMA-REGISTRY-URL
102 | value: "http://gke-confluent-kafka-cp-schema-registry:8081"
103 | resources:
104 | limits:
105 | cpu: "500m"
106 | memory: "1024Mi"
107 | requests:
108 | cpu: "200m"
109 | memory: "256Mi"
110 | ---
111 | apiVersion: v1
112 | kind: Service
113 | metadata:
114 | name: payment-service
115 | namespace: default
116 | labels:
117 | app: payment-service
118 | spec:
119 | selector:
120 | app: payment-deployment
121 | ports:
122 | - name: payment-service-port
123 | protocol: TCP
124 | port: 8182
125 | type: LoadBalancer
126 | loadBalancerIP: ""
127 | ---
128 | apiVersion: autoscaling/v2beta1
129 | kind: HorizontalPodAutoscaler
130 | metadata:
131 | name: payment-deployment-hpa
132 | namespace: default
133 | labels:
134 | app: payment-deployment
135 | spec:
136 | scaleTargetRef:
137 | kind: Deployment
138 | name: payment-deployment
139 | apiVersion: apps/v1
140 | minReplicas: 2
141 | maxReplicas: 4
142 | metrics:
143 | - type: Resource
144 | resource:
145 | name: cpu
146 | targetAverageUtilization: 85
147 | ---
148 | apiVersion: apps/v1
149 | kind: Deployment
150 | metadata:
151 | name: restaurant-deployment
152 | namespace: default
153 | labels:
154 | app: restaurant-deployment
155 | spec:
156 | selector:
157 | matchLabels:
158 | app: restaurant-deployment
159 | template:
160 | metadata:
161 | labels:
162 | app: restaurant-deployment
163 | spec:
164 | containers:
165 | - name: restaurant-service
166 | image: europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/restaurant.service:1.0-SNAPSHOT
167 | env:
168 | - name: SPRING_DATASOURCE_URL
169 | value: "jdbc:postgresql://postgres-service:5432/postgres?currentSchema=restaurant&binaryTransfer=true&reWriteBatchedInserts=true&stringtype=unspecified"
170 | - name: SPRING_DATASOURCE_INITIALIZATION-MODE
171 | value: "never"
172 | - name: KAFKA-CONFIG_BOOTSTRAP-SERVERS
173 | value: "gke-confluent-kafka-cp-kafka-headless:9092"
174 | - name: KAFKA-CONFIG_SCHEMA-REGISTRY-URL
175 | value: "http://gke-confluent-kafka-cp-schema-registry:8081"
176 | resources:
177 | limits:
178 | cpu: "500m"
179 | memory: "1024Mi"
180 | requests:
181 | cpu: "200m"
182 | memory: "256Mi"
183 | ---
184 | apiVersion: v1
185 | kind: Service
186 | metadata:
187 | name: restaurant-service
188 | namespace: default
189 | labels:
190 | app: restaurant-service
191 | spec:
192 | selector:
193 | app: restaurant-deployment
194 | ports:
195 | - name: restaurant-service-port
196 | protocol: TCP
197 | port: 8183
198 | type: LoadBalancer
199 | loadBalancerIP: ""
200 | ---
201 | apiVersion: autoscaling/v2beta1
202 | kind: HorizontalPodAutoscaler
203 | metadata:
204 | name: restaurant-deployment-hpa
205 | namespace: default
206 | labels:
207 | app: restaurant-deployment
208 | spec:
209 | scaleTargetRef:
210 | kind: Deployment
211 | name: restaurant-deployment
212 | apiVersion: apps/v1
213 | minReplicas: 2
214 | maxReplicas: 4
215 | metrics:
216 | - type: Resource
217 | resource:
218 | name: cpu
219 | targetAverageUtilization: 85
220 | ---
221 | apiVersion: apps/v1
222 | kind: Deployment
223 | metadata:
224 | name: customer-deployment
225 | labels:
226 | app: customer-deployment
227 | spec:
228 | selector:
229 | matchLabels:
230 | app: customer-deployment
231 | template:
232 | metadata:
233 | labels:
234 | app: customer-deployment
235 | spec:
236 | containers:
237 | - name: customer-service
238 | image: europe-west4-docker.pkg.dev/food-ordering-system-346904/food-ordering-system-repository/customer.service:1.0-SNAPSHOT
239 | env:
240 | - name: SPRING_DATASOURCE_URL
241 | value: "jdbc:postgresql://postgres-service:5432/postgres?currentSchema=customer&binaryTransfer=true&reWriteBatchedInserts=true&stringtype=unspecified"
242 | - name: SPRING_DATASOURCE_INITIALIZATION-MODE
243 | value: "never"
244 | - name: KAFKA-CONFIG_BOOTSTRAP-SERVERS
245 | value: "gke-confluent-kafka-cp-kafka-headless:9092"
246 | - name: KAFKA-CONFIG_SCHEMA-REGISTRY-URL
247 | value: "http://gke-confluent-kafka-cp-schema-registry:8081"
248 | resources:
249 | limits:
250 | cpu: "500m"
251 | memory: "1024Mi"
252 | requests:
253 | cpu: "200m"
254 | memory: "256Mi"
255 | ---
256 | apiVersion: v1
257 | kind: Service
258 | metadata:
259 | name: customer-service
260 | namespace: default
261 | labels:
262 | app: customer-service
263 | spec:
264 | selector:
265 | app: customer-deployment
266 | ports:
267 | - name: customer-service-port
268 | protocol: TCP
269 | port: 8184
270 | type: LoadBalancer
271 | loadBalancerIP: ""
272 | ---
273 | apiVersion: autoscaling/v2beta1
274 | kind: HorizontalPodAutoscaler
275 | metadata:
276 | name: customer-deployment-hpa
277 | namespace: default
278 | labels:
279 | app: customer-deployment
280 | spec:
281 | scaleTargetRef:
282 | kind: Deployment
283 | name: customer-deployment
284 | apiVersion: apps/v1
285 | minReplicas: 2
286 | maxReplicas: 4
287 | metrics:
288 | - type: Resource
289 | resource:
290 | name: cpu
291 | targetAverageUtilization: 85
--------------------------------------------------------------------------------