├── .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 --------------------------------------------------------------------------------