过程式与声明式的区别
在设计 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 中各种资源都是用声明式去描述的。