Pular para o conteúdo

Modelo de deployment

O modelo de deployment representa outra camada, o modelo físico, com sua própria estrutura e seus próprios elementos (nós de deployment).
Ele referencia o modelo lógico e herda seus relacionamentos.

Primeiro, seguindo a mesma abordagem, os tipos de nós de deployment devem ser definidos dentro da especificação:

specification {
deploymentNode environment
deploymentNode zone
deploymentNode kubernetes {
// Nodes have same styling options
style {
color blue
icon tech:kubernetes
multiple true
}
}
deploymentNode vm {
// Common properties for the kind
notation 'Virtual Machine'
technology 'VMware'
}
}

Você pode definir o que for necessário para representar seu modelo de deployment e sua linguagem ubíqua.

O modelo de deployment é um conjunto de nós organizados em uma estrutura hierárquica:

deployment {
environment prod {
zone eu {
zone zone1 {
vm vm1
vm vm2
}
// You can also use '=' with the name coming first
zone2 = zone {
vm1 = vm
vm2 = vm
}
}
}
}

Os nomes dos nós devem ser únicos dentro de seu container (nó pai); aplicam-se as mesmas regras usadas para nomes de elementos no modelo lógico.

Os nós podem ter propriedades assim como os elementos lógicos.

deployment {
environment prod 'Production' {
#live #sla-customer
technology 'OpenTofu'
summary 'Production environment'
description '''
## Detailed description
With **Markdown** support
'''
link https://likec4.dev
zone eu {
title 'EU Region'
// ...
}
}
}

Assim como no modelo lógico, você pode usar extend em nós de deployment:

// File: 'deployments/prod.c4'
deployment {
environment prod
}
// File: 'deployments/prod/zone-eu.c4'
deployment {
extend prod {
zone eu
}
}

As mesmas regras se aplicam à extensão de nós:

  • o nó estendido deve ser referenciado por um nome totalmente qualificado;
  • é possível definir propriedades adicionais.

O operador instanceOf “implanta” elementos do modelo lógico em nós de deployment:

deployment {
environment prod {
zone eu {
zone zone1 {
// 'frontend.ui' is a logical element
// by default, instance has same name,
// i.e. it becomes 'prod.eu.zone1.ui'
instanceOf frontend.ui
// this becomes 'prod.eu.zone1.api'
instanceOf backend.api
}
zone zone2 {
// or use '=' with the name coming first
ui = instanceOf frontend.ui
// two instances of same element
api1 = instanceOf backend.api
api2 = instanceOf backend.api
}
// Deploy to any level, not only leaf nodes
// Assume database shared between zones
db = instanceOf database
}
}
}

A instância implantada herda as propriedades e a estilização do elemento.
É possível sobrescrevê-las:

deployment {
environment prod {
zone eu {
db = instanceOf database {
title 'Primary DB'
technology 'PostgreSQL with streaming replication'
icon tech:postgresql
style {
color red
}
}
}
}
}

O modelo de deployment herda os relacionamentos do modelo lógico.
Mas também permite definir relacionamentos específicos:

deployment {
environment prod {
vm vm1 {
db = instanceOf database 'Primary DB'
}
vm vm2 {
db = instanceOf database 'Standby DB'
}
vm2.db -> vm1.db 'replicates'
}
}

Como você pode ver, o relacionamento ocorre entre instâncias diferentes do mesmo elemento lógico.
Podemos assumir que não precisamos desse relacionamento no modelo lógico, mas que ele faz sentido no deployment.

Relacionamentos de deployment podem ter um tipo e possuem as mesmas propriedades dos relacionamentos lógicos:

deployment {
environment prod {
vm2.db -[streaming]-> vm1.db {
#next, #live
title 'replicates'
description 'Streaming replication'
}
}
}

Use <-> (ou -[kind]<->) quando os dois nós se comunicarem ativamente entre si:

deployment {
environment prod {
vm vm1 {
db = instanceOf database 'Primary DB'
}
vm vm2 {
db = instanceOf database 'Standby DB'
}
vm1.db <-> vm2.db 'replicates'
}
}

Assim como no modelo lógico, relacionamentos bidirecionais são renderizados com setas nas duas extremidades por padrão e podem ser incluídos ou excluídos a partir de qualquer endpoint nos predicados da visão.