当前位置: 首页 > news >正文

k8s学习之路 | Day19 k8s 工作负载 Deployment(上)

文章目录

  • 1. Deployment 基础
    • 1.1 什么是 Deployment
    • 1.2 简单体验 Deployment
    • 1.3 Deployment 信息描述
    • 1.4 如何编写 Deployment
  • 2. Deployment 简单特性
    • 2.1 赋予 Pod 故障转移和自愈能力
    • 2.2 更新 Deployment
    • 2.3 回滚 Deployment
    • 2.4 暂停、恢复 Deployment 的上线过程
    • 2.5 Deployment 规约描述

官网参考地址:

https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/

1. Deployment 基础

1.1 什么是 Deployment

Deployment 属于 k8s 中的一种工作负载资源,一个 DeploymentPodReplicaSet (副本控制器)提供声明式的更细能力:

  • 我们只需要描述 Deployment 中的目标状态
  • Deployment 控制器以受控的速率(不间断)更改实际状态,使其变成我们所描述的目标期望状态(控制循环
  • Deployment 使 Pod 有自愈能力
  • 我们部署应用一般不会直接写 Pod,而是部署一个 Deployment

1.2 简单体验 Deployment

来自官网的一个示例文件

####deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2

我们尝试启动一下:kubectl apply -f deploy-demo.yaml

image-20230303144416122

image-20230303144601951

  1. 创建了一个名字为 nginx-deploymentDeployment,这个名称成为后续创建 ReplicaSetPod 的命名基础

  2. Deployment 创建了一个 ReplicaSet,由它创建了三个 Pod 副本

  3. .spec.selector 字段定义所创建的 ReplicaSet 如何查找要管理的 Pod。 在这里,选择在 Pod 模板中定义的标签(app: nginx),建议就保持一致即可

  4. template 字段里面其实就是一个 Pod的模板,和之前学习 Pod 写法是一样的

  5. 一次 Deployment,产生了如下资源

    • Deployment 资源
    • ReplicaSet资源
    • Pod 资源

1.3 Deployment 信息描述

检查 Deployment 信息

kubectl get deploy

image-20230303145059439

  • NAME 列出了名字空间中 Deployment 的名称
  • READY 显示应用程序的可用的“副本”数。显示的模式是“就绪个数/期望个数”
  • UP-TO-DATE 显示为了达到期望状态已经更新的副本数
  • AVAILABLE 显示应用可供用户使用的副本数
  • AGE 显示应用程序运行的时间

检查 Deployment 上线状态

kubectl rollout status deploy nginx-deployment

image-20230303145318742

检查 Deployment 创建出来的 ReplicaSet 信息

kubectl get replicaset

image-20230303145442405

  • NAME 列出名字空间中 ReplicaSet 的名称
  • DESIRED 显示应用的期望副本个数,即在创建 Deployment 时所定义的值。 此为期望状态
  • CURRENT 显示当前运行状态中的副本个数
  • READY 显示应用中有多少副本可以为用户提供服务
  • AGE 显示应用已经运行的时间长度

检查 Pod 自动生成的标签信息

kubectl get pod --show-labels

image-20230303145625914

1.4 如何编写 Deployment

官网参考:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/deployment-v1/

  • 老办法,官网加命令参考如何编写一个资源 yaml 文件:kubectl explain deploy
KIND:     Deployment
VERSION:  apps/v1DESCRIPTION:Deployment enables declarative updates for Pods and ReplicaSets.FIELDS:apiVersion   <string>APIVersion defines the versioned schema of this representation of anobject. Servers should convert recognized schemas to the latest internalvalue, and may reject unrecognized values. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resourceskind <string>Kind is a string value representing the REST resource this objectrepresents. Servers may infer this from the endpoint the client submitsrequests to. Cannot be updated. In CamelCase. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsmetadata     <Object>  ## 标准的元数据信息Standard object's metadata. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataspec <Object>  ## 需要我们手动描述的行为规约Specification of the desired behavior of the Deployment.status       <Object>  ## 最近观测到的状态,k8s自动更新,不需要我们描述Most recently observed status of the Deployment.
  • 注意再看一下 spec 规约如何描述:kubectl explain deploy.spec
FIELDS:minReadySeconds      <integer> ##Pod就绪后被视为可用的时间,默认为0Minimum number of seconds for which a newly created pod should be readywithout any of its container crashing, for it to be considered available.Defaults to 0 (pod will be considered available as soon as it is ready)paused       <boolean> ## 暂停部署Indicates that the deployment is paused.progressDeadlineSeconds      <integer> ## deployment部署的最大秒数,默认600s,超过就报错误了The maximum time in seconds for a deployment to make progress before it isconsidered to be failed. The deployment controller will continue to processfailed deployments and a condition with a ProgressDeadlineExceeded reasonwill be surfaced in the deployment status. Note that progress will not beestimated during the time a deployment is paused. Defaults to 600s.replicas     <integer>  ##pod数量(副本数),默认是1 `RS`控制器实现的Number of desired pods. This is a pointer to distinguish between explicitzero and not specified. Defaults to 1.revisionHistoryLimit <integer>  ##保留允许回滚的旧 ReplicaSet 的数量。默认10The number of old ReplicaSets to retain to allow rollback. This is apointer to distinguish between explicit zero and not specified. Defaults to10.selector     <Object> -required- ##指定要控制的pod的标签Label selector for pods. Existing ReplicaSets whose pods are selected bythis will be the ones affected by this deployment. It must match the podtemplate's labels.strategy     <Object>  ## 更新策略The deployment strategy to use to replace existing pods with new ones.rollingUpdate	<Object> ## 指定滚动更新策略maxSurge	<string> ## 【最大增量】一次最多新建几个Pod。 百分比和数字都可以MaxUnavailable:为0 的时候, maxSurge不能为0maxUnavailable ## 【最大不可用量】最大不可用的Pod数量,最多杀几个podtype	<string>: Recreate/RollingUpdate(默认)template     <Object> -required- ## 必须描述项,描述将要创建的Pod,这个里面的写法就是我们之前学过的pod的写法Template describes the pods that will be created.
  • 小小的验证几下:
##我有这么一个deployment
##deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5  ## 5个副本selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2

image-20230303163157266

2. Deployment 简单特性

2.1 赋予 Pod 故障转移和自愈能力

Deployment 赋予了 Pod 故障转移和自愈能力

  • 我们部署一个测试 yaml
##deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5  ## 5个副本selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2

image-20230303214742582

  • 尝试删除一些 Pod,并在另一个控制台观察一下状态:会自愈
kubectl get pod -owide -w

image-20230303220738194

image-20230303220838151

image-20230303220854345

  • 我们直接将k8s-03关机,看一下状态:在特定的时间内,会在其他节点启动故障的 Pod

image-20230303223157612

image-20230303223234449

2.2 更新 Deployment

什么时候才会触发更新 Deployment 呢?仅当 Deployment Pod 模板(即 .spec.template)发生改变时,例如模板的标签或容器镜像被更新, 才会触发 Deployment 上线。其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作

更新上线动作原理: 创建新的 rs,准备就绪后,替换旧的 rs(此时不会删除,因为revisionHistoryLimit 指定了保留几个版本)

更新 Pod 镜像

  • 现在我们有一个示例文件在运行
##我有这么一个deployment
##deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5  ## 5个副本selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2

image-20230303170726092

  • 我们先来更新一下 Pod 的镜像为:nginx
##可以直接改yaml文件进行更新
##我有这么一个deployment
##deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5  ## 5个副本selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx  ##修改镜像
  • 再执行一次:kubectl apply -f deploy-demo.yaml

image-20230303170954505

  • 查看一下上线状态:kubectl rollout status deploy nginx-deployment

image-20230303171339188

  • 查看一下 ReplicaSet 的信息:kubectl get rs

通过创建新的 ReplicaSet 并将其扩容到 3 个副本并将旧 ReplicaSet 缩容到 0 个副本完成了 Pod 的更新操作

image-20230303214211872

  1. 更新时会关闭一定数量的 Pod,默认情况下确保至少所需 Pod 的75%处于运行状态(最大比例为25%)
  2. 还确保仅所创建 Pod 数量只可能比期望 Pod 数高一点点。 默认情况下,它可确保启动的 Pod 个数比期望个数最多多出 125%(最大峰值 25%)。

再观测一下更新状态

  • 启动一个测试
##deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5  ## 5个副本selector:matchLabels:app: nginxstrategy: ## 更新策略type: RollingUpdaterollingUpdate: ## 指定滚动更新策略maxSurge: 2 ### 更新期间任何时间运行的Pod总数最多为预期Pod数量7个maxUnavailable: 2 ##更新期间可能不可用的最大Pod数量2个template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2

image-20230304182940591

  • 更新它
##deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5  ## 5个副本selector:matchLabels:app: nginxstrategy: ## 更新策略type: RollingUpdaterollingUpdate: ## 指定滚动更新策略maxSurge: 2 ### 更新期间任何时间运行的Pod总数最多为预期Pod数量7个maxUnavailable: 2 ##更新期间可能不可用的最大Pod数量2个template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.21.6-alpine
  • 追踪状态

停止2个,启动4个

image-20230304183430242

最终更新到一个期待状态

image-20230304183710113

  • 获取一下 Deployment 的信息
kubectl describe deploy nginx-deployment

image-20230304183818866

最开始创建的时候,`Deployment`创建了 `RS`并将直接扩容到5个副本
更新的时候,创建一个新的 `RS`,并将其扩容为2,等待其就绪
旧的 `RS` 缩容到3
新的 `RS` 扩容到4
继续对 `RS` 扩缩容
最终5个可用的副本在新的 `RS` 中
旧的 `RS` 缩容为0

加深一下这个地方的理解

      maxSurge: 3 ### 更新期间任何时间运行的Pod总数最多为预期Pod数量8个maxUnavailable: 4 ##更新期间可能不可用的最大Pod数量4个

image-20230304185122412

创建了一个新的 `RS`扩容到3,就绪准备
旧的 `RS` 缩容到1,以便最大不可用数量有4个
将新的 `RS` 扩容到5
将旧的 `RS` 缩容到0

Kubernetes 在计算 availableReplicas 数值时不考虑终止过程中的 Pod, availableReplicas 的值一定介于 replicas - maxUnavailablereplicas + maxSurge 之间。 因此,你可能在上线期间看到 Pod 个数比预期的多,Deployment 所消耗的总的资源也大于 replicas + maxSurge 个 Pod 所用的资源,直到被终止的 Pod 所设置的 terminationGracePeriodSeconds 到期为止。

比例缩放图示

在这里插入图片描述

2.3 回滚 Deployment

有时,你可能想要回滚 Deployment;例如,当 Deployment 不稳定时(例如进入反复崩溃状态)。 默认情况下,Deployment 的所有上线记录都保留在系统中,以便可以随时回滚 (你可以通过修改修订历史记录限制来更改这一约束)。

Deployment 被触发上线时,系统就会创建 Deployment 的新的修订版本。 这意味着仅当 Deployment 的 Pod 模板(.spec.template)发生更改时,才会创建新修订版本 – 例如,模板的标签或容器镜像发生变化。 其他更新,如 Deployment 的扩缩容操作不会创建 Deployment 修订版本。 这是为了方便同时执行手动缩放或自动缩放。 换言之,当你回滚到较早的修订版本时,只有 Deployment 的 Pod 模板部分会被回滚。

模拟一下错误滚动升级

  • 准备一个测试 yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5  ## 5个副本selector:matchLabels:app: nginxstrategy: ## 更新策略type: RollingUpdaterollingUpdate: ## 指定滚动更新策略maxSurge: 1maxUnavailable: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16.1
  • 模拟一下错误升级
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5  ## 5个副本selector:matchLabels:app: nginxstrategy: ## 更新策略type: RollingUpdaterollingUpdate: ## 指定滚动更新策略maxSurge: 1maxUnavailable: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.1555
  • 查看一下状态

image-20230304193555979

  • 查看一下上线状态
kubectl rollout status deployment/nginx-deployment
###上线处于一个停滞状态
[root@k8s-01 k8s-yaml]# kubectl rollout status deployment/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 5 new replicas have been updated...

Deployment 控制器自动停止有问题的上线过程,并停止对新的 ReplicaSet 扩容。 这行为取决于所指定的 rollingUpdate 参数(具体为 maxUnavailable)。 默认情况下,Kubernetes 将此值设置为 25%。

回滚操作

  • 检查 Deployment 修订历史:kubectl rollout history deployment/nginx-deployment

image-20230304193903516

CHANGE-CAUSE 的内容是从 Deployment 的 kubernetes.io/change-cause 注解复制过来的。 复制动作发生在修订版本创建时。你可以通过以下方式设置 CHANGE-CAUSE 消息:

  • 使用 kubectl annotate deployment/nginx-deployment kubernetes.io/change-cause="image updated to 1.16.1" 为 Deployment 添加注解。
  • 手动编辑资源的清单。
  • 查看修订历史的详细信息:kubectl rollout history deployment/nginx-deployment --revision=2

image-20230304194012820

  • 回滚到之前的修订版本:我们要回滚到版本1:kubectl rollout undo deployment/nginx-deployment --to-revision=1

撤消当前上线回滚到以前的修订版本:

kubectl rollout undo deployment/nginx-deployment

image-20230304194147104

2.4 暂停、恢复 Deployment 的上线过程

在你更新一个 Deployment 的时候,或者计划更新它的时候, 你可以在触发一个或多个更新之前暂停 Deployment 的上线过程。 当你准备应用这些变更时,你可以重新恢复 Deployment 上线过程。 这样做使得你能够在暂停和恢复执行之间应用多个修补程序,而不会触发不必要的上线操作。

  • 一个测试
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 5  ## 5个副本selector:matchLabels:app: nginxstrategy: ## 更新策略type: RollingUpdaterollingUpdate: ## 指定滚动更新策略maxSurge: 1maxUnavailable: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16.1

image-20230304204613168

  • 修改 yaml 文件暂停上线
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:paused: true ##true表示暂停上线,默认falsereplicas: 5  ## 5个副本selector:matchLabels:app: nginxstrategy: ## 更新策略type: RollingUpdaterollingUpdate: ## 指定滚动更新策略maxSurge: 1maxUnavailable: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16.1
  • 修改 yaml 更新镜像
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:paused: true ##true表示暂停上线,默认falsereplicas: 5  ## 5个副本selector:matchLabels:app: nginxstrategy: ## 更新策略type: RollingUpdaterollingUpdate: ## 指定滚动更新策略maxSurge: 1maxUnavailable: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx

image-20230304205328490

  • 从可观测的状态来看,这次更新并没有产生新的上线动作,也不会产生新的 RS

  • 我们再次修改更新一下镜像

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:paused: true ##true表示暂停上线,默认falsereplicas: 5  ## 5个副本selector:matchLabels:app: nginxstrategy: ## 更新策略type: RollingUpdaterollingUpdate: ## 指定滚动更新策略maxSurge: 1maxUnavailable: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.21.6-alpine
  • 修改 .spec.paused ,恢复上线
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:paused: false ##true表示暂停上线,默认falsereplicas: 5  ## 5个副本selector:matchLabels:app: nginxstrategy: ## 更新策略type: RollingUpdaterollingUpdate: ## 指定滚动更新策略maxSurge: 1maxUnavailable: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.21.6-alpine
  • 看一下状态:正常上线

image-20230304210114934

不可以回滚处于暂停状态的 Deployment,除非先恢复其执行状态。

2.5 Deployment 规约描述

Pod 模板

.spec.template 是一个 Pod 模板。 它和 Pod 的语法规则完全相同。 只是这里它是嵌套的,因此不需要 apiVersionkind

副本数

.spec.replicas 是指定所需 Pod 的可选字段。它的默认值是1。

选择算符

.spec.selector 是指定本 Deployment 的 Pod 标签选择算符的必需字段。

策略

.spec.strategy 策略指定用于用新 Pod 替换旧 Pod 的策略。 .spec.strategy.type 可以是 “Recreate” 或 “RollingUpdate”。“RollingUpdate” 是默认值

  • 重新创建:如果 .spec.strategy.type==Recreate,在创建新 Pod 之前,所有现有的 Pod 会被杀死。

  • 滚动更新:Deployment 会在 .spec.strategy.type==RollingUpdate时,采取 滚动更新的方式更新 Pod。你可以指定 maxUnavailablemaxSurge 来控制滚动更新 过程。

最大不可用

.spec.strategy.rollingUpdate.maxUnavailable 是一个可选字段,用来指定更新过程中不可用的 Pod 的个数上限。该值可以是绝对数字(例如,5),也可以是所需 Pod 的百分比(例如,10%)。百分比值会转换成绝对数并去除小数部分。 如果 .spec.strategy.rollingUpdate.maxSurge 为 0,则此值不能为 0。 默认值为 25%。

例如,当此值设置为 30% 时,滚动更新开始时会立即将旧 ReplicaSet 缩容到期望 Pod 个数的70%。 新 Pod 准备就绪后,可以继续缩容旧有的 ReplicaSet,然后对新的 ReplicaSet 扩容, 确保在更新期间可用的 Pod 总数在任何时候都至少为所需的 Pod 个数的 70%。

最大峰值

.spec.strategy.rollingUpdate.maxSurge 是一个可选字段,用来指定可以创建的超出期望 Pod 个数的 Pod 数量。此值可以是绝对数(例如,5)或所需 Pod 的百分比(例如,10%)。 如果 MaxUnavailable 为 0,则此值不能为 0。百分比值会通过向上取整转换为绝对数。 此字段的默认值为 25%。

例如,当此值为 30% 时,启动滚动更新后,会立即对新的 ReplicaSet 扩容,同时保证新旧 Pod 的总数不超过所需 Pod 总数的 130%。一旦旧 Pod 被杀死,新的 ReplicaSet 可以进一步扩容, 同时确保更新期间的任何时候运行中的 Pod 总数最多为所需 Pod 总数的 130%。

进度期限秒数

.spec.progressDeadlineSeconds 是一个可选字段,用于指定系统在报告 Deployment 进展失败 之前等待 Deployment 取得进展的秒数。 这类报告会在资源状态中体现为 type: Progressingstatus: Falsereason: ProgressDeadlineExceeded。Deployment 控制器将在默认 600 毫秒内持续重试 Deployment。 将来,一旦实现了自动回滚,Deployment 控制器将在探测到这样的条件时立即回滚 Deployment。

如果指定,则此字段值需要大于 .spec.minReadySeconds 取值。

最短就绪时间

.spec.minReadySeconds 是一个可选字段,用于指定新创建的 Pod 在没有任意容器崩溃情况下的最小就绪时间, 只有超出这个时间 Pod 才被视为可用。默认值为 0(Pod 在准备就绪后立即将被视为可用)

修订历史版本限制

Deployment 的修订历史记录存储在它所控制的 ReplicaSets 中。

.spec.revisionHistoryLimit 是一个可选字段,用来设定出于回滚目的所要保留的旧 ReplicaSet 数量。 这些旧 ReplicaSet 会消耗 etcd 中的资源,并占用 kubectl get rs 的输出。 每个 Deployment 修订版本的配置都存储在其 ReplicaSets 中;因此,一旦删除了旧的 ReplicaSet, 将失去回滚到 Deployment 的对应修订版本的能力。 默认情况下,系统保留 10 个旧 ReplicaSet,但其理想值取决于新 Deployment 的频率和稳定性。

更具体地说,将此字段设置为 0 意味着将清理所有具有 0 个副本的旧 ReplicaSet。 在这种情况下,无法撤消新的 Deployment 上线,因为它的修订历史被清除了。

暂停

.spec.paused 是用于暂停和恢复 Deployment 的可选布尔字段。 暂停的 Deployment 和未暂停的 Deployment 的唯一区别是,Deployment 处于暂停状态时, PodTemplateSpec 的任何修改都不会触发新的上线。 Deployment 在创建时是默认不会处于暂停状态

相关文章:

k8s学习之路 | Day19 k8s 工作负载 Deployment(上)

文章目录1. Deployment 基础1.1 什么是 Deployment1.2 简单体验 Deployment1.3 Deployment 信息描述1.4 如何编写 Deployment2. Deployment 简单特性2.1 赋予 Pod 故障转移和自愈能力2.2 更新 Deployment2.3 回滚 Deployment2.4 暂停、恢复 Deployment 的上线过程2.5 Deploymen…...

php宝塔搭建部署实战六零导航页LyLme_Spage源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的六零导航页LyLme_Spage源码。感兴趣的朋友可以自行下载学习。 技术架构 PHP7.0 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#xff0c;宝塔添…...

SpringBoot (三) 整合数据库访问 jdbcTemplate、MyBatis

哈喽&#xff0c;大家好&#xff0c;我是有勇气的牛排&#xff08;全网同名&#xff09;&#x1f42e;&#x1f42e;&#x1f42e; 有问题的小伙伴欢迎在文末评论&#xff0c;点赞、收藏是对我最大的支持&#xff01;&#xff01;&#xff01;。 Spring Data了解下&#xff1…...

机器学习、数据挖掘和统计模式识别学习(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 机器学习是让计算机在没有明确编程的情况下采取行动的科学。在过去的十年中&#xff0c;机器学习为我们提供了自动驾驶汽车&…...

Java修饰符-ai生成

Java修饰符 Java的修饰符有哪几种 Java的修饰符有以下几种&#xff1a; 访问修饰符&#xff1a;public、protected、private和默认访问修饰符。 非访问修饰符&#xff1a;final、abstract、static、synchronized、volatile、transient、native、strictfp和Deprecated。 什么…...

kafka部署安装

kafka介绍 kafka是一个分布式的消息队列系统&#xff0c;适合离线和在线消费&#xff0c;扩展性好 kafka部署 安装包获取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1y32yvZU-CAHBtbEfnHkJzQ 提取码&#xff1a;y9vb –来自百度网盘超级会员V5的分享 安装目录为…...

使用asio实现一个单线程异步的socket服务程序

文章目录前言代码前言 之前&#xff0c;我使用epoll实现过一个C的后端服务程序&#xff0c;见&#xff1a;从头开始实现一个留言板-README_c做一个留言板_大1234草的博客-CSDN博客 但是它不够简便&#xff0c;无法轻松的合并到其他代码中。并且&#xff0c;由于程序中使用epo…...

大型JAVA版云HIS医院管理系统源码 Saas应用+前后端分离+B/S架构

SaaS运维平台多集团多医院入驻强大的电子病历完整文档 有源码&#xff0c;有演示&#xff01; 云HIS系统技术栈&#xff1a; 1、前端框架&#xff1a;AngularNginx 2、后台框架&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&…...

1 网关介绍

网关介绍 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话会产生很多问题&#xff0c;例如&a…...

Java中Scanner用法

Java中Scanner用法 Scanner可以实现程序和人的交互&#xff0c;用户可以利用键盘进行输入。 不同类型的输入&#xff1a; String ssc.next(); //接受字符串数据 System.out.println(s);int s1 sc.nextInt();//接受整型数据 System.out.println(s1);double s2 sc.nextDouble…...

malloc实现原理探究

2021年末面试蔚来汽车&#xff0c;面试官考察了malloc/free的实现机制。当时看过相关的文章&#xff0c;有一点印象&#xff0c;稍微说了一点东西&#xff0c;不过自己感到不满意。今天尝试研究malloc的实现细节&#xff0c;看了几篇博文&#xff0c;发现众说纷纭&#xff0c;且…...

Spring——整合junit4、junit5使用方法

spring需要创建spring容器&#xff0c;每次创建容器单元测试是测试单元代码junit4依赖<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…...

计算机网络的一些思考(待完善)

文章目录概念1. 缓存2. 备份&#xff08;副本&#xff09;3. 硬件和软件&#xff1a;4.端口5. 二进制协议vs文本协议6. 虚拟7.分布式8.广播域和冲突域的区别9本地地址协议1.CSMA/CD协议2.IP协议3.路由算法协议&#xff08;RIP&#xff0c;OSPF&#xff0c;BGP&#xff09;4.ARP…...

【第一章】谭浩强C语言课后习题答案

1.什么是程序?什么是程序设计? 程序:就是一组能识别和执行的指令,每一条指令使计算机执行特定的操作 程序设计:是指从确定任务到得到结果、写出文档的全过程 2.为什么需要计算机语言?高级语言有哪些特点? 为什么需要计算机语言:计算机语言解决了人和计算机交流是的…...

最新版本vue3+vite重构尚品汇(解决接口问题)第21-50集

第21集&#xff0c;第22集&#xff1a;照敲就行&#xff0c;引入概念。 第23集&#xff1a;防抖概念&#xff1a;前面所有的触发被取消&#xff0c;最后一次执行在规定的时间之后才会触发&#xff0c;只会执行一次。Lodash插件里面封装了函数的防抖和节流的业务。用到lodash确实…...

【超级猜图案例上半部分的实现 Objective-C语言】

一、超级猜图这么一个案例: 1.实现之后的效果是这样的: 1)中间有一个图片,点一下,能放大,背景变半透明的黑色: 2)再点一下图片,或者点周围黑色的阴影,图片回归原状, 3)右边有一个“大图”按钮,点一下,实现跟点图片一样的效果, 4)左边有一个“提示”按钮,点…...

刷题笔记4 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 输入&#xff1a;head [1,2,3,4] 输出&#xff1a…...

15、正则表达式

目录 一、元字符 二、限定修饰符 一、元字符 正则表达式通常被用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串&#xff0c;这些特殊字符称为正则表达式的元字符。例如&#xff0c;“\\d”表示数字0~9中的任何…...

javaWeb核心01-HTTPTomcatServlet

文章目录HTTP&Tomcat&Servlet1&#xff0c;Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器1.3 Web核心课程安排2, HTTP2.1 简介2.2 请求数据格式2.2.1 格式介绍2.2.2 实例演示2.…...

深圳大学计软《面向对象的程序设计》实验16 期末复习

A. 一、会员积分&#xff08;期末模拟&#xff09; 题目描述 某电商网站的会员分为&#xff1a;普通、贵宾两个级别 普通会员类Member&#xff0c;包含编号、姓名、积分三个属性&#xff0c;编号和积分是整数&#xff0c;姓名是字符串 操作包括构造、打印、积分累加、积分兑…...

Linux基础命令(一)

文章目录1、时间命令&#xff1a;date2、日历命令&#xff1a;cal3、计算器程序&#xff1a;bc4、基础组合键5、正确的关机指令使用5.1 将数据同步写入硬盘中的指令&#xff1a; sync5.2 惯用的关机指令&#xff1a; shutdown5.3 重新开机&#xff0c;关机&#xff1a; reboot,…...

RocketMQ Broker消息处理流程剩余源码解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年3月4日 &#x1…...

JQuery入门基础

目录 1.初识 下载 使用 JQuery&#xff08;核心&#xff09;对象 2.选择器 基础选择器 层次选择器 后代选择器 子代选择器 兄弟选择器 相邻选择器 3.JQuery DOM操作 创建元素 插入元素 删除元素 遍历元素 属性操作 获取属性 设置属性 删除属性 样式操作 …...

kafka 构建双向SSL认证

kafka 安装 以下内容均已完成测试&#xff0c;按照教程搭建你会得到一个双向ssl认证的kafka broker&#xff0c;并能通过ip以及域名访问&#xff0c;笔者能力有限如果文章内容存在问题烦请各位指出。 搭建单机Kafka 需求 centos 7kafka_2.12-2.6.0jdk8&#xff08;文档中统…...

推荐一个.Net Core开发的Websocket群聊、私聊的开源项目

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 今天给大家推荐一个使用Websocket协议实现的、高性能即时聊天组件&#xff0c;可用于群聊、好友聊天、游戏直播等场景。 项目简介 这是一个基于.Net Core开发的、简单、高性能的通讯组件&#xff0c;支持点对点…...

华为OD机试Golang解题 - 事件推送 | 含思路

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典文章目录 华为Od必看系列使用说明本期题目…...

将微信小程序页面转为图片

最近做项目遇到一个需求,那就是要将某个页面转为图片然后传给后端,我仔细找了一圈,发现官方那个Api也就是wx.canvasToTempFilePath生成的图片很有可能为空,太坑了,于是我放弃用它了,选择了用wxml2canvas。 安装wxml2canvas npm init npm install wxml2canvas --save --…...

LINE、SDNE和struc2vec图嵌入算法学习笔记

引言 在cs224w课程中&#xff0c;我先后总结了deepwalk、node2vec&#xff0c;这两种算是最经典也是最主流的做法&#xff0c;而在 图节点嵌入相关算法学习笔记 中&#xff0c;从头至尾&#xff0c;将一些经典算法用wiki的数据集复现了一下&#xff0c;所以本篇博文&#xff0…...

Buuctf Younger-drive 题解

目录 一.查壳 二.运行缺少dll 三.主函数 四.hObject线程 五.Thread线程 六.judge函数 七.解题脚本 这题的关键在于了解一定的线程相关知识 一.查壳 32位带壳,用upx脱壳 二.运行缺少dll 后续尝试了各种方法修复dll但是还是运行不了 值得一提的是脱壳后的程序不能动态调试…...

数据结构与算法:二叉树专题

数据结构与算法&#xff1a;二叉树专题前言前提条件基础知识二叉树链式存储结构二叉树中序遍历二叉树层序遍历常见编程题把一个有序整数数组放到二叉树中逐层打印二叉树结点数据求一棵二叉树的最大子树和判断两棵二叉树是否相等把二叉树转换为双向链表判断一个数组是否是二元查…...