过程式与声明式的区别

在设计 DSL 的时候,会有过程式和声明式两种形式的区别。

过程式与声明式的区别#

在过程式中,你需要描述一步一步的操作,以到达最终的状态。

在声明式中,你只需要描述最终状态是什么,系统会帮你达到这个状态。

在参考资料的文章中举了一个例子:

假如需要在 AWS 中部署10台 EC2#

Ansible 的过程式语言像下面这样编写

- ec2:
  count: 10
  image: ami-v1
  instance_type: t2.micro

Terraform 的声明式语言像下面这样:

resource "aws_instance" "example" {
  count         = 10
  ami           = "ami-v1"
  instance_type = "t2.micro"
}

在这个版本中二者看不出太多区别,现在假如因为系统流量增加,需要将服务器数量增加到15台。

将服务器数量增加到15台#

Ansible 中如果简单的将 count 增加到15,运行后会部署新的15台服务器,加上之前的10台,会导致部署出25台服务器!所以在 Ansible 中,需要了解当前部署了多少台服务器,然后只在代码中写新加5台服务器。

- ec2:
  count: 5
  image: ami-v1
  instance_type: t2.micro

Terraform 的声明式就简单很多,你不需要知道当前部署了多少台服务器,只需要描述最终的状态即可,Terraform 会自己根据当前已有的服务器去决定部署数量。

resource "aws_instance" "example" {
  count         = 15
  ami           = "ami-v1"
  instance_type = "t2.micro"
}

相应的工具系统#

文章中说 Chef 和 Ansible 用的是过程式的语言。

Terraform, CloudFormation, SaltStack, and Puppet 用的是声明式的语言

而我认为声明式最好的例子就是 Kubernetes 了,K8S 中各种资源都是用声明式去描述的。

参考资料#

https://blog.gruntwork.io/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c

comments powered by Disqus