一  命令式和声明式 

命令式(可以理解为 面向过程)编程:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。
·声明式(可以理解为 面向对象)编程:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。

命令式

命令式框架的特点是关注过程。以jQuery为例,若我们使用jQuery实现将div中的文字设置为hello word,并添加点击事件,代码为:

$("#div1") //获取标签元素节点
.text("hello world") //设置文字内容
.click(()=>{alert("我被点击了!")}) //添加点击事件

以上代码可以看出,代码的逻辑过程和我们的想法一一对应。

声明式

声明式框架得特点是关注结果。使用vue实现上面得代码为:

<div @click="()=>alert('ok')">hello world</div>

至于如何实现这个“结果”,我们并不关心,它由vue内容搞定,也就是说vue内部是命令式的,它帮我们封装了“过程”,而暴漏给使用者得是声明式的用法。

性能

先给出结论:声明式的代码性能不优于命令式代码性能。

若我们将上面例子中div的文字内容改为“hello vue3”,命令式代码如下:

$("div1").text("hello vue3");

以上代码可以看出,我们明确知道哪个元素的哪里发生了变更,但是声明式代码不一定能做到这一点,因为它需要找到变更前后的差异,并只更新变化的地方,也就是说声明式代码比命令式代码多出找差异的性能消耗,

可维护性
问题来了,在性能上命令式要优于声明式,为什么vue还要做声明式呢?原因在于声明式代码的可维护性更强。我们可以看出声明式代码只关注结果,不用再去写DOM元素的获取、更新、删除等操作,代码看上去更直观。
————————————————
版权声明:本文为CSDN博主「慕迅前端」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39245942/article/details/128887576

二 Kubernetes 声明式 API 的工作原理

声明式API和命令式API的区别 - ZhanLi - 博客园声明式API 声明式和命令式的对比 Kubernetes 声明式 API 的工作原理 参考 声明式API 声明式和命令式的对比 命令式 命令式有时也称为指令式,命令式的场景下,计算机只会机械的完成指定https://www.cnblogs.com/ricklz/p/16960244.html

在 Kubernetes 项目中,一个 API 对象在 Etcd 里的完整资源路径,是由:Group(API 组)、Version(API 版本)和 Resource(API 资源类型)三个部分组成的。

apiVersion: batch/v2alpha1
kind: CronJob
...

在这个 YAML 文件中,“CronJob”就是这个 API 对象的资源类型(Resource),“batch”就是它的组(Group),v2alpha1 就是它的版本(Version)。

这个 YAML 会被 Kubernetes 转化成一个 CronJob 对象,这里来看下是如何转化的。

1、首先匹配 API 对象的组;

Kubernetes 中的核心 API 对象,例如 Pod、Node。不需要 Group,(Group 为 ""),这些 API 对象会在 /api 这个层级进行匹配;

非核心的 Api 对象类似 CronJob 会在 /apis 这个层级进行匹配,上面 CronJob 的 Group 是 batch,所以就会找到 /apis/batch

2、匹配 API 的版本号;

上面栗子 CronJob 的版本号是 v2alpha1,所以当前匹配的路径就是 /apis/batch/v2alpha1;

和我们 API 中的设计原则一样,Kubernetes 中的版本号也是用来进行 API 版本管理的。

3、匹配 API 对象的资源类型;

在匹配好版本之后,Kubernetes 根据路径和资源类型,就能确定创建的是 /apis/batch/v2alpha1 下的 CronJob 对象。

当发起创建 CronJob 的 POST 请求之后,编写的 YAML 的信息就被提交给 APIServer 处理。

APIServer 如何处理 API 请求

1、请求过滤请求,进行一些前置性的工作,比如授权、超时处理、审计等;

2、API 路由匹配;

进入 MUX 和 Routes 流程,MUX 和 Routes 的主要作用是完成 APIServer 的 URL 和 Handler 绑定,Handler 找到对应的 CronJob 类型定义。

3、根据提交的 YAML 文件创建资源;

上面的栗子,根据这个 CronJob 类型定义,使用提交的 YAML 文件里的字段,创建一个 CronJob 对象。

4、使用准入控制器,进行变更操作或验证操作;

准入控制器(Admission Controller)位于 API Server 中,在对象被持久化之前,准入控制器拦截对 API Server 的请求,一般用来做身份验证和授权。

准入控制器包括以下两种:

  • 1、变更(Mutating)准入控制:修改请求的对象;

  • 2、验证(Validating)准入控制:验证请求的对象。

5、序列化,保存到 Etcd 中。

APIServer 会把验证过的 API 对象转换成用户最初提交的版本,进行序列化操作,并调用 Etcd 的 API 把它保存起来。

参考

【深入剖析 Kubernetes】深入剖析Kubernetes_容器_K8s-极客时间
【k8s 声明式 API】Kubernetes声明式API-51CTO.COM
【声明式对比命令式】命令式和声明式,哪个才是你的菜 - 腾讯云开发者社区-腾讯云
【Kubernetes 对象管理】Kubernetes 对象管理 | Kubernetes
【声明式API和命令式API】https://boilingfrog.github.io/2022/12/06/声明式API/

三 扩展

k8s control 源码函数解读

Kubernetes 控制器的工作原理解读

Kubernetes 控制器的工作原理解读 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang|云原生 (icloudnative.io) 

Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望状态保持一致,它们就是 Kubernetes 的大脑。例如,ReplicaSet 控制器负责维护集群中运行的 Pod 数量;Node 控制器负责监控节点的状态,并在节点出现故障时及时做出响应。总而言之,在 Kubernetes 中,每个控制器只负责某种类型的特定资源。对于集群管理员来说,了解每个控制器的角色分工至关重要,如有必要,你还需要深入了解控制器的工作原理。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐