diff --git a/content/posts/2024/06/mach.adoc b/content/posts/2024/06/mach.adoc new file mode 100644 index 00000000..4ae2c91e --- /dev/null +++ b/content/posts/2024/06/mach.adoc @@ -0,0 +1,111 @@ +--- +title: MACH (micro service based, API first, cloud native, headless) +date: 2024-06-12T20:10:00+08:00 +categories: +- tech +tags: +- architecture +- javascript +--- + +Just an architecture style MACH got me attention. It is short for micro service based, API first, cloud native, headless. There are two of projects I involved one are in this architecture style. One is sitecore based, another one is developed. Kubernetes, nodejs, npm, strapi tsoa are used. Their mapping is as following. + + +* micro services based: multiple services based on expressjs +* api first: tsao +* cloud native: more advanced than cloud native, kubernate native is used. +* headless: strapi + +Here I have a diagram for the developed one. + +[plantuml, format="svg",opts="inline"] +---- +@startuml kubernetes + +footer Kubernetes Plant-UML +scale max 1024 width + +skinparam nodesep 10 +skinparam ranksep 10 + +' Azure +!define AzurePuml https://raw.githubusercontent.com/RicardoNiepel/Azure-PlantUML/release/2-1/dist + +!includeurl AzurePuml/AzureCommon.puml +!includeurl AzurePuml/AzureSimplified.puml + +!includeurl AzurePuml/Containers/AzureContainerRegistry.puml +!includeurl AzurePuml/Databases/AzureCosmosDb.puml +!includeurl AzurePuml/Databases/AzureSqlDatabase.puml +!includeurl AzurePuml/DevOps/AzurePipelines.puml +!includeurl AzurePuml/Identity/AzureActiveDirectory.puml +!includeurl AzurePuml/Networking/AzureLoadBalancer.puml +!includeurl AzurePuml/Security/AzureKeyVault.puml + +' Kubernetes +!define KubernetesPuml https://raw.githubusercontent.com/dcasati/kubernetes-PlantUML/master/dist + +!includeurl KubernetesPuml/kubernetes_Common.puml +!includeurl KubernetesPuml/kubernetes_Context.puml +!includeurl KubernetesPuml/kubernetes_Simplified.puml + +!includeurl KubernetesPuml/OSS/KubernetesApi.puml +!includeurl KubernetesPuml/OSS/KubernetesIng.puml +!includeurl KubernetesPuml/OSS/KubernetesPod.puml + +actor "DevOps" as devopsAlias +collections "Client Apps" as clientalias +collections "Helm Charts" as helmalias + +left to right direction + +' Azure Components +AzureActiveDirectory(aad, "\nAzure\nActive Directory", "Global") +AzureContainerRegistry(acr, "ACR", "Canada Central") +AzureCosmosDb(cosmos, "\nCosmos DB", "Global") +AzureKeyVault(keyvault, "\nAzure\nKey Vault", "Global") +AzureLoadBalancer(alb, "\nLoad\nBalancer", "Canada Central") +AzureSqlDatabase(sql, "\nExternal\ndata stores", "Canada Central") +AzurePipelines(ado, "CI/CD\nAzure Pipelines", "Global") + +' Kubernetes Components +Cluster_Boundary(cluster, "Kubernetes Cluster") { + KubernetesApi(KubernetesApi, "Kubernetes API", "") + + Namespace_Boundary(nsFrontEnd, "Front End") { + KubernetesIng(ingress, "API Gateway", "") + } + + Namespace_Boundary(nsBackEnd, "Back End") { + KubernetesPod(KubernetesBE1, "", "") + KubernetesPod(KubernetesBE2, "", "") + KubernetesPod(KubernetesBE3, "", "") + } + + Namespace_Boundary(nsUtil, "Utiliy Services") { + KubernetesPod(KubernetesUtil1, "", "") + KubernetesPod(KubernetesUtil2, "","") + } +} + +Rel(devopsAlias, aad, "AUTH") +Rel(helmalias, KubernetesApi, "helm upgrade") + +Rel(aad, keyvault, " ") +Rel(KubernetesApi, aad, "RBAC", "ASYNC") + +Rel(clientalias, alb, "HTTP", "ASYNC") +Rel(alb, ingress, "HTTP", "ASYNC") + +Rel(ingress, KubernetesBE1, " ") +Rel(KubernetesBE1, KubernetesBE2, " ") +Rel(KubernetesBE1, KubernetesBE3, " ") + +Rel(KubernetesBE2, sql, " ") +Rel(KubernetesBE3, keyvault, "Pod Identity") +Rel(KubernetesBE3, cosmos, " ") + +Rel(ado, acr, "docker push") +Rel_U(KubernetesApi, acr, "docker pull") +@enduml +---- \ No newline at end of file