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

app运营策划/佛山做优化的公司

app运营策划,佛山做优化的公司,做网站含备案费么,常用的小程序开发【云原生|Kubernetes】14-DaemonSet资源控制器详解 文章目录 【云原生|Kubernetes】14-DaemonSet资源控制器详解简介典型用法DaemonSet语法规则Pod模板Pod 选择算符在选定的节点上运行 Pod DaemonSet的 Pods 是如何被调度的污点和容忍度DaemonSet更新和回滚DaemonSet更新策略执…

【云原生|Kubernetes】14-DaemonSet资源控制器详解

文章目录

  • 【云原生|Kubernetes】14-DaemonSet资源控制器详解
    • 简介
    • 典型用法
    • DaemonSet语法规则
      • Pod模板
      • Pod 选择算符
      • 在选定的节点上运行 Pod
    • DaemonSet的 Pods 是如何被调度的
    • 污点和容忍度
    • DaemonSet更新和回滚
      • DaemonSet更新策略
      • 执行滚动更新
      • 对DaemonSet执行回滚

简介

​ 在 Kubernetes 中,DaemonSet 是一种用于在节点上运行指定的 Pod 的控制器(Controller)。与 ReplicaSet 或 Deployment 不同,DaemonSet 不是为了扩展 Pod 数量而创建的,而是为了在每个节点上运行一个实例或多个实例的 Pod。

​ DaemonSet 通常用于在 Kubernetes 集群中运行一些系统级别的服务或者网络代理,例如日志收集器、监控代理、网络插件等。通过使用 DaemonSet,可以确保每个节点上都运行了指定的 Pod,从而保证了这些服务或者代理的高可用性和稳定性。

​ 与其他控制器类似,DaemonSet 也会监视 Pod 的状态,并在 Pod 出现故障或者被删除时自动进行替换。当一个新的节点加入到 Kubernetes 集群中时,DaemonSet 也会自动在该节点上创建所需的 Pod。如果需要更新 DaemonSet 中的 Pod 版本或者配置,可以通过更新 DaemonSet 的 YAML 配置文件来实现。

​ 需要注意的是,DaemonSet 中的 Pod 通常会创建在 kube-system 命名空间下,因为这些服务或者代理通常是与 Kubernetes 集群本身相关联的。在创建 DaemonSet 时,可以使用 nodeSelector、tolerations 和 affinity 等方式来控制 DaemonSet 在哪些节点上运行、不在哪些节点上运行以及如何分配 Pod 到节点上。

典型用法

DaemonSet 的一些典型用法:

  • 在每个节点上运行集群守护进程
  • 在每个节点上运行日志收集守护进程
  • 在每个节点上运行监控守护进程

一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。

DaemonSet语法规则

apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentd-elasticsearchnamespace: kube-systemlabels:k8s-app: fluentd-logging
spec:selector:matchLabels:name: fluentd-elasticsearchtemplate:metadata:labels:name: fluentd-elasticsearchspec:tolerations:# 这些容忍度设置是为了让该守护进程集在控制平面节点上运行# 如果你不希望自己的控制平面节点运行 Pod,可以删除它们- key: node-role.kubernetes.io/control-planeoperator: Existseffect: NoSchedule- key: node-role.kubernetes.io/masteroperator: Existseffect: NoSchedulecontainers:- name: fluentd-elasticsearchimage: quay.io/fluentd_elasticsearch/fluentd:v2.5.2resources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MivolumeMounts:- name: varlogmountPath: /var/logterminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log

与所有其他 Kubernetes 配置一样,DaemonSet 也需要 apiVersionkindmetadata 字段。DaemonSet 对象的名称必须是一个合法的 DNS 子域名;DaemonSet 也需要 .spec 节区。

Pod模板

.spec 中唯一必需的字段是 .spec.template

.spec.template 是一个 Pod 模板。 除了它是嵌套的,因而不具有 apiVersionkind 字段之外,它与 Pod 具有相同的 schema。

除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必须指定合理的标签。

在 DaemonSet 中的 Pod 模板必须具有一个值为 AlwaysRestartPolicy。 当该值未指定时,默认是 Always

Pod 选择算符

.spec.selector 字段表示 Pod 选择算符,它与 Job的 .spec.selector 的作用是相同的。

你必须指定与 .spec.template 的标签匹配的 Pod 选择算符。 此外,一旦创建了 DaemonSet,它的 .spec.selector 就不能修改。 修改 Pod 选择算符可能导致 Pod 意外悬浮,并且这对用户来说是费解的。

spec.selector 是一个对象,如下两个字段组成:

  • matchLabels - 与 ReplicationController 的 .spec.selector 的作用相同。
  • matchExpressions - 允许构建更加复杂的选择器,可以通过指定 key、value 列表以及将 key 和 value 列表关联起来的 Operator。

当上述两个字段都指定时,结果会按逻辑与(AND)操作处理。.spec.selector 必须与 .spec.template.metadata.labels 相匹配。 如果配置中这两个字段不匹配,则会被 API 拒绝。

在选定的节点上运行 Pod

​ 如果指定了 .spec.template.spec.nodeSelector,DaemonSet 控制器将在能够与 Node 选择算符匹配的节点上创建 Pod。 类似这种情况,可以指定 .spec.template.spec.affinity,之后 DaemonSet 控制器将在能够与节点亲和性匹配的节点上创建 Pod。 如果根本就没有指定,则 DaemonSet Controller 将在所有节点上创建 Pod。

DaemonSet的 Pods 是如何被调度的

DaemonSet 确保所有符合条件的节点都运行该 Pod 的一个副本。 DaemonSet 控制器为每个符合条件的节点创建一个 Pod,并添加 Pod 的 spec.affinity.nodeAffinity 字段以匹配目标主机。Pod 被创建之后,默认的调度程序通常通过设置 .spec.nodeName 字段来接管 Pod 并将 Pod 绑定到目标主机。如果新的 Pod 无法放在节点上,则默认的调度程序可能会根据新 Pod 的优先级抢占 (驱逐)某些现存的 Pod。

用户通过设置 DaemonSet 的 .spec.template.spec.schedulerName 字段,可以为 DaemonSet 的 Pod 指定不同的调度程序。

当评估符合条件的节点时,原本在 .spec.template.spec.affinity.nodeAffinity 字段上指定的节点亲和性将由 DaemonSet 控制器进行考量,但在创建的 Pod 上会被替换为与符合条件的节点名称匹配的节点亲和性。

ScheduleDaemonSetPods 允许你使用默认调度器而不是 DaemonSet 控制器来调度这些 DaemonSet, 方法是将 NodeAffinity 条件而不是 .spec.nodeName 条件添加到这些 DaemonSet Pod。 默认调度器接下来将 Pod 绑定到目标主机。 如果 DaemonSet Pod 的节点亲和性配置已存在,则被替换 (原始的节点亲和性配置在选择目标主机之前被考虑)。 DaemonSet 控制器仅在创建或修改 DaemonSet Pod 时执行这些操作, 并且不会更改 DaemonSet 的 spec.template

nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchFields:- key: metadata.nameoperator: Invalues:- target-host-name

在这个例子中,Pod 指定了一个 requiredDuringSchedulingIgnoredDuringExecution 的调度限制条件,要求 Pod 只能被调度到带有标签 example-label 并且值为 example-value 的节点上运行。如果没有符合条件的节点,Pod 就无法被调度到节点上运行。

  • requiredDuringSchedulingIgnoredDuringExecution 的调度限制条件,它可以用于指定必须满足的调度要求。具体来说,requiredDuringSchedulingIgnoredDuringExecution 是一个 PodSpec 的字段,它包含一组要求,如果这些要求不能满足,Pod 就无法被调度到节点上运行。

  • 与其他调度限制条件不同,requiredDuringSchedulingIgnoredDuringExecution 是一个硬性要求,即如果不能满足,Pod 就无法被调度到节点上运行。同时,该限制条件在 Pod 运行过程中仍然会被忽略,因此在节点上的运行状态不会受到该限制条件的影响。

污点和容忍度

DaemonSet 控制器会自动将一组容忍度添加到 DaemonSet Pod。

容忍度键名效果描述
node.kubernetes.io/not-readyNoExecuteDaemonSet Pod 可以被调度到不健康或还不准备接受 Pod 的节点上。在这些节点上运行的所有 DaemonSet Pod 将不会被驱逐。
node.kubernetes.io/unreachableNoExecuteDaemonSet Pod 可以被调度到从节点控制器不可达的节点上。在这些节点上运行的所有 DaemonSet Pod 将不会被驱逐。
node.kubernetes.io/disk-pressureNoScheduleDaemonSet Pod 可以被调度到具有磁盘压力问题的节点上。
node.kubernetes.io/memory-pressureNoScheduleDaemonSet Pod 可以被调度到具有内存压力问题的节点上。
node.kubernetes.io/memory-pressureNoScheduleDaemonSet Pod 可以被调度到具有内存压力问题的节点上。
node.kubernetes.io/pid-pressureNoScheduleDaemonSet Pod 可以被调度到具有进程压力问题的节点上。
node.kubernetes.io/unschedulableNoScheduleDaemonSet Pod 可以被调度到不可调度的节点上。
node.kubernetes.io/network-unavailableNoSchedule仅针对请求主机联网的 DaemonSet Pod 添加此容忍度,即 Pod 具有 spec.hostNetwork: true。这些 DaemonSet Pod 可以被调度到网络不可用的节点上。

你也可以在 DaemonSet 的 Pod 模板中定义自己的容忍度并将其添加到 DaemonSet Pod。

因为 DaemonSet 控制器自动设置 node.kubernetes.io/unschedulable:NoSchedule 容忍度, 所以 Kubernetes 可以在标记为不可调度的节点上运行 DaemonSet Pod。

如果你使用 DaemonSet 提供重要的节点级别功能, 例如集群联网, Kubernetes 在节点就绪之前将 DaemonSet Pod 放到节点上会很有帮助。 例如,如果没有这种特殊的容忍度,因为网络插件未在节点上运行,所以你可能会在未标记为就绪的节点上陷入死锁状态, 同时因为该节点还未就绪,所以网络插件不会在该节点上运行。

DaemonSet更新和回滚

DaemonSet更新策略

DaemonSet 有两种更新策略:

  • OnDelete: 使用 OnDelete 更新策略时,在更新 DaemonSet 模板后,只有当你手动删除老的 DaemonSet pods 之后,新的 DaemonSet Pod 才会被自动创建。跟 Kubernetes 1.6 以前的版本类似。
  • RollingUpdate: 这是默认的更新策略。使用 RollingUpdate 更新策略时,在更新 DaemonSet 模板后, 老的 DaemonSet Pod 将被终止,并且将以受控方式自动创建新的 DaemonSet Pod。 更新期间,最多只能有 DaemonSet 的一个 Pod 运行于每个节点上。

执行滚动更新

要启用 DaemonSet 的滚动更新功能,必须设置 .spec.updateStrategy.typeRollingUpdate

  • updateStrategy.type (string)

    守护进程集更新的类型。可以是 “RollingUpdate” 或 “OnDelete”。默认为 RollingUpdate。

  • updateStrategy.rollingUpdate (RollingUpdateDaemonSet)

    滚动更新配置参数。仅在 type 值为 “RollingUpdate” 时出现。

    用于控制守护进程集滚动更新的预期行为的规约。

    • updateStrategy.rollingUpdate.maxSurge (IntOrString)

      对于拥有可用 DaemonSet Pod 的节点而言,在更新期间可以拥有更新后的 DaemonSet Pod 的最大节点数。 属性值可以是绝对数量(例如:5)或所需 Pod 的百分比(例如:10%)。 如果 maxUnavailable 为 0,则该值不能为 0。绝对数是通过四舍五入从百分比计算得出的,最小值为 1。 默认值为 0。示例:当设置为 30% 时,最多为节点总数的 30% 节点上应该运行守护进程 Pod (即 status.desiredNumberScheduled) 可以在旧 Pod 标记为已删除之前创建一个新 Pod。更新首先在 30% 的节点上启动新的 Pod。 一旦更新的 Pod 可用(就绪时长至少 minReadySeconds 秒),该节点上的旧 DaemonSet pod 就会被标记为已删除。 如果旧 Pod 因任何原因变得不可用(Ready 转换为 false、被驱逐或节点被腾空), 则会立即在该节点上创建更新的 Pod,而不考虑激增限制。 允许激增意味着如果就绪检查失败,任何给定节点上的守护进程集消耗的资源可能会翻倍, 因此资源密集型守护进程集应该考虑到它们可能会在中断期间导致驱逐。

      IntOrString 是一种可以容纳 int32 或字符串的类型。在 JSON 或 YAML 编组和解组中使用时,它会生成或使用内部类型。 例如,这允许你拥有一个可以接受名称或数字的 JSON 字段。

    • updateStrategy.rollingUpdate.maxUnavailable (IntOrString)

      更新期间不可用的 DaemonSet Pod 的最大数量。值可以是绝对数(例如:5)或更新开始时 DaemonSet Pod 总数的百分比(例如:10%)。 绝对数是通过四舍五入的百分比计算得出的。如果 maxSurge 为 0,则此值不能为 0 默认值为 1。 例如:当设置为 30% 时,最多节点总数 30% 的、应该运行守护进程的节点总数(即 status.desiredNumberScheduled) 可以在任何给定时间停止更新。更新首先停止最多 30% 的 DaemonSet Pod, 然后在它们的位置启动新的 DaemonSet Pod。 一旦新的 Pod 可用,它就会继续处理其他 DaemonSet Pod,从而确保在更新期间至少 70% 的原始 DaemonSet Pod 数量始终可用。

      IntOrString 是一种可以保存 int32 或字符串的类型。在 JSON 或 YAML 编组和解组中使用时,它会生成或使用内部类型。例如,这允许你拥有一个可以接受名称或数字的 JSON 字段。

  • revisionHistoryLimit (int32)

    用来允许回滚而保留的旧历史记录的数量。此字段是个指针,用来区分明确的零值和未指定的指针。默认值是 10。

  1. 下面的 YAML 包含一个 DaemonSet,其更新策略为 ‘RollingUpdate’:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentd-elasticsearchannotations: kubernetes.io/change-cause: "fluentd version is latest"namespace: kube-systemlabels:k8s-app: fluentd-logging
spec:selector:matchLabels:name: fluentd-elasticsearchupdateStrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1template:metadata:labels:name: fluentd-elasticsearchspec:tolerations:# 这些容忍度设置是为了让该守护进程集在控制平面节点上运行# 如果你不希望自己的控制平面节点运行 Pod,可以删除它们- key: node-role.kubernetes.io/mastereffect: NoSchedulecontainers:- name: fluentd-elasticsearchimage: quay.io/fluentd_elasticsearch/fluentd:v2.5.2volumeMounts:- name: varlogmountPath: /var/log- name: varlibdockercontainersmountPath: /var/lib/docker/containersreadOnly: true## 用于指定 Pod 被删除后等待多长时间再强制终止。terminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log- name: varlibdockercontainershostPath:path: /var/lib/docker/containers
  • 创建DaemonSet的Pod
[root@master daemonset]# kubectl apply  -f fluentd-daemonset.yaml
daemonset.apps/fluentd-elasticsearch configured
[root@master daemonset]#
  • 查看daemonset和pod
[root@master daemonset]# kubectl get daemonset -n kube-system
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
fluentd-elasticsearch   3         3         3       3            3           <none>                   14m
[root@master daemonset]#
[root@master daemonset]# kubectl get pod -n kube-system -o wide
NAME                                      READY   STATUS             RESTARTS   AGE     IP                NODE              NOMINATED NODE   READINESS GATES
fluentd-elasticsearch-bjh69               1/1     Running            0          2m35s   10.244.0.51       192.168.194.128   <none>           <none>
fluentd-elasticsearch-j59h8               1/1     Running            0          2m33s   10.244.1.112      192.168.194.130   <none>           <none>
fluentd-elasticsearch-jnvfk               1/1     Running            0          2m26s   10.244.2.162      192.168.194.131   <none>           <none>
[root@master daemonset]#
  • 检查 DaemonSet 的滚动更新策略
[root@master daemonset]# kubectl get ds/fluentd-elasticsearch -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}' -n kube-system
RollingUpdate
[root@master daemonset]#
  • 更新DaemonSet
[root@master daemonset]# kubectl edit -n kube-system ds fluentd-elasticsearch
daemonset.apps/fluentd-elasticsearch edited
[root@master daemonset]#

对DaemonSet执行回滚

在创建Daploymen,DaemonSet等等可以回滚的资源类型的时候,一定要添加 annotations信息,该信息是你定义资源简介的,便于你分辨该资源是做什么的,用的镜像版本,等等。

metadata:name: fluentd-elasticsearchannotations:kubernetes.io/change-cause: "fluentd version is latest"
  • 查看DaemonSet使用的镜像版本
[root@master daemonset]# kubectl -n kube-system get ds fluentd-elasticsearch -o wide
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE     CONTAINERS              IMAGES                                         SELECTOR
fluentd-elasticsearch   3         3         2       1            2           <none>          2m23s   fluentd-elasticsearch   quay.io/fluentd_elasticsearch/fluentd:v2.5.2   name=fluentd-elasticsearch
[root@master daemonset]#
  • 查看DaemonSet的历史版本
[root@master daemonset]# kubectl -n kube-system rollout history ds fluentd-elasticsearch
daemonset.apps/fluentd-elasticsearch
REVISION  CHANGE-CAUSE
1         fluentd version is latest
2         fluentd version is 2.6.0
3         fluentd version is 2.5.2
[root@master daemonset]#

说明: 注意 DaemonSet 修订版本只会正向变化。也就是说,回滚完成后,所回滚到的 ControllerRevision 版本号 (.revision 字段) 会增加。 例如,如果用户在系统中有版本 1 和版本 2,并从版本 2 回滚到版本 1, 带有 .revision: 1ControllerRevision 将变为 .revision: 3

  • –to-revision指导回滚到指定版本

说明: 如果 --to-revision 参数未指定,将选中最近的版本。

[root@master daemonset]# kubectl -n kube-system rollout undo --to-revision=1 ds fluentd-elasticsearch
daemonset.apps/fluentd-elasticsearch rolled back
[root@master daemonset]#
  • 再次确认版本(回滚正常)
[root@master daemonset]# kubectl -n kube-system get ds fluentd-elasticsearch -o wide
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE     CONTAINERS              IMAGES                                  SELECTOR
fluentd-elasticsearch   3         3         3       3            3           <none>          5m31s   fluentd-elasticsearch   quay.io/fluentd_elasticsearch/fluentd   name=fluentd-elasticsearch
[root@master daemonset]#

相关文章:

【云原生|Kubernetes】14-DaemonSet资源控制器详解

【云原生|Kubernetes】14-DaemonSet资源控制器详解 文章目录 【云原生|Kubernetes】14-DaemonSet资源控制器详解简介典型用法DaemonSet语法规则Pod模板Pod 选择算符在选定的节点上运行 Pod DaemonSet的 Pods 是如何被调度的污点和容忍度DaemonSet更新和回滚DaemonSet更新策略执…...

基于 Guava Retry 在Spring封装一个重试功能

pom依赖 <dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>2.0.0</version> </dependency> <dependency><groupId>org.springframework.boot</groupId>…...

适用HarmonyOS 3.1版本及以上的应用及服务开发工具 DevEco Studio 3.1.1 Release 安装

文章目录 安装步骤1.下载安装包2.安装成功后&#xff0c;初次运行studio2.1 配置node与ohpm的环境2.2安装sdk2.3等待安装结束 3.创建项目3.1 点击Create Project3.2 选择一个空项目3.3 项目配置3.4 Finish、等待依赖下载完毕3.5 项目创建完成 tip 提示4.配置运行环境4.1 真机运…...

[信号与系统系列] 正弦振幅调制之差拍信号

当将具有不同频率的两个正弦曲线相乘时&#xff0c;可以创建一个有趣的音频效果&#xff0c;称为差拍音符。这种现象听起来像颤音&#xff0c;最好通过选择一个频率非常小的信号与和另一个频率大约1KHz的信号&#xff0c;把二者混合从而听到。一些乐器能够自然产生差拍音符。使…...

vb+SQL航空公司管理系统设计与实现

航空公司管理信息系统 一个正常营运的航空公司需要管理所拥有的飞机、航线的设置、客户的信息等,更重要的还要提供票务管理。面对各种不同种类的信息,需要合理的数据库结构来保存数据信息以及有效的程序结构支持各种数据操作的执行。 本设计讲述如何建立一个航空公司管理信…...

python爬取网页视频

Python是一种功能强大的编程语言&#xff0c;被广泛应用于网络爬虫、数据分析和人工智能等领域。在网络爬虫中&#xff0c;常常需要从网页中获取视频或者录制网页视频。下面将介绍如何使用Python来录制网页视频。 import time from selenium import webdriver # 创建驱动程序 d…...

数据挖掘具体步骤

数据挖掘具体步骤 1、理解业务与数据 2、准备数据 数据清洗&#xff1a; 缺失值处理&#xff1a; 异常值: 数据标准化&#xff1a; 特征选择&#xff1a; 数据采样处理&#xff1a; 3、数据建模 分类问题&#xff1a; 聚类问题&#xff1a; 回归问题 关联分析 集成学习 image B…...

react class与hooks区别

在React中&#xff0c;有两种主要的方式来管理组件的状态和生命周期&#xff1a;Class 组件和 Hooks。 Class 组件&#xff1a; Class 组件是 React 最早引入的方式&#xff0c;它是基于 ES6 class 的语法来创建的。Class 组件包含了生命周期方法&#xff0c;可以用来处理组件…...

Python爬虫思维:异常处理与日志记录

作为一名专业的爬虫代理供应商&#xff0c;我们经常会看见各种各样的爬虫异常情况。网络请求超时、页面结构变化、反爬虫机制拦截等问题时常出现在客户的工作中。 在这篇文章中&#xff0c;我将和大家分享一些关于异常处理与日志记录的思维方法。通过合理的异常处理和有效的日志…...

(十六)大数据实战——安装使用mysql版的hive服务

前言 hive默认使用的是内嵌据库derby&#xff0c;Derby 是一个嵌入式数据库&#xff0c;可以轻松地以库的形式集成到应用程序中。它不需要独立的服务器进程&#xff0c;所有的数据存储在应用程序所在的文件系统中。为了支持hive服务更方便的使用&#xff0c;我们使用mysql数据…...

【信号生成器】从 Excel 数据文件创建 Simulink 信号生成器块研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【UE4 RTS】01-Camera SetUp

UE版本&#xff1a;4.24.3 前言 本篇主要完成游戏模式、玩家控制器和玩家控制的Pawn的设置&#xff0c;下一篇介绍如何实现Pawn的移动 步骤 1. 首先创建一个俯视角游戏模板 2. 首先删除“TopDownCharacter”&#xff0c; 3. 新建一个文件夹命名为“RTS_Toturial” 在文件夹…...

Mirror网络库 | 说明

此篇为上文&#xff0c;下篇&#xff1a;Mirror网络库 | 实战 一、介绍 基于UNET&#xff0c;从2014年经过9年实战测试&#xff1b;服务器和客户端是一个项目&#xff1b;使用NetworkBehaviour而不是MonoBehaviour&#xff0c;还有NetworkServer和NetworkClient&#xff1b;Mi…...

分布式异步任务处理组件(九)

最近完成了网络通信模块的一些基本代码实现&#xff0c;这里记录一些关于类和接口设计的问题和思考&#xff1b;另外进度可能会受阻&#xff0c;之前不知道猴年马月投的简历现在开始邀约面试了&#xff0c;包括今天在内的三天都有一场面试--主要是今天中午的面试过后两分钟HR就…...

[excel]vlookup函数对相同的ip进行关联

一、需求&#xff08;由于ip不可泄漏所以简化如下&#xff09; 有两个sheet: 找到sheet1在sheet2中存在的ip&#xff0c;也就是找到有漏洞的ip 二、实现 vlookup函数有4个参数 第一个:当前表要匹配的列&#xff0c;选择第一个sheet当前行需要处理的ip即可 第二个:第二个shee…...

两个状态的马尔可夫链

手动推导如下公式。 证明&#xff1a; 首先将如下矩阵对角化&#xff1a; { 1 − a a b 1 − b } \begin {Bmatrix} 1-a & a \\ b & 1-b \end {Bmatrix} {1−ab​a1−b​} (1)求如下矩阵的特征值&#xff1a; { 1 − a a b 1 − b } { x 1 x 2 } λ { x 1 x 2 }…...

SpringBoot 依赖管理

Spring Boot 依赖管理 1. 父项目做依赖管理 无需关注版本号&#xff0c;自动版本仲裁机制 <!-- 依赖管理 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version&g…...

重试框架入门:Spring-RetryGuava-Retry

前言 在日常工作中&#xff0c;随着业务日渐庞大&#xff0c;不可避免的涉及到调用远程服务&#xff0c;但是远程服务的健壮性和网络稳定性都是不可控因素&#xff0c;因此&#xff0c;我们需要考虑合适的重试机制去处理这些问题&#xff0c;最基础的方式就是手动重试&#xf…...

[QCM6125][Android13] 修复PRODUCT_COPY_FILES无法拷贝so

文章目录 开发平台基本信息问题描述解决方法 开发平台基本信息 芯片: QCM6125 版本: Android 13 kernel: msm-4.14 问题描述 在进行系统移植时&#xff0c;经常会把一些自己开发的c或者c程序编译成so库&#xff0c;然后在系统服务中去调用这些库。所以在进行新代码开发时&am…...

微服务Eureka注册中心

目录 一、Eureka的结构和作用 二、搭建eureka-server 三、服务注册 四、服务发现 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 存在的问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址…...

Java:企业级java后端开发,需要掌握哪些内容

一、什么是后端开发 后端开发是指开发基于服务器端的软件应用程序&#xff0c;也称为系统的后台或服务器端编程。 后端程序员负责处理网站或应用程序后台的逻辑和功能&#xff0c;包括数据库管理、服务器端脚本编写、API设计、数据安全性、网站性能优化等。 后端开发技术通常包…...

使用Go语言生成Excel任务表依赖图(Markdown文件mermaid图)

一、前言 在游戏中&#xff0c;任务是非常常见的玩法&#xff0c;可能会有主线任务&#xff0c;支线任务以及其它一些类型的任务&#xff0c;各任务可能还会有前置任务&#xff0c;即需要完成某个任务之后&#xff0c;才能做当前任务。在游戏开发中&#xff0c;配置表可以使用…...

C语言和C++的区别在哪?如何自学C++?

C语言和C是两种不同的编程语言&#xff0c;它们在语法、特性和用途上有一些区别。以下是C语言和C的一些主要区别&#xff1a; 面向对象编程&#xff1a;C是一种支持面向对象编程的语言&#xff0c;它在C语言的基础上添加了类、对象、继承、多态等面向对象的特性。而C语言是一种…...

功能强大的开源数据中台系统 DataCap 1.13.0 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与 OpenAI 的 API 进行交互组件&#xff1a;https://github.com/devlive-community/openai…...

JTS Self-intersection异常TopologyException: side location conflict解决办法

JTS Self-intersection异常TopologyException: side location conflict解决办法 举例&#xff1a;问题围栏 MULTIPOLYGON (((114.0905685 32.1120567, 114.0905685 32.112957, 114.0905685 32.1138535, 114.0905685 32.1147537, 114.0905685 32.115654, 114.0905685 32.11655…...

Maven: No compiler is provided in this environment.

在Eclipse中运行Maven项目&#xff0c;报错&#xff1a; No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 解决方法&#xff1a; Windows > Preferences > Java > Installed JREs > Add > Standard VM,…...

.NET-10. 其他-VSTO+VBA

VSTOVBA 前言VSTO 外接程序介绍&#xff1a;VSTO参考链接&#xff1a;VSTO 例子&#xff1a; VBA:参考链接&#xff1a; 前言 主要用于Excel插件。 VSTO 外接程序介绍&#xff1a; Excel、Word、PowerPoint、Project、Visio等等Office应用程序 相对简单 VSTO参考链接&#x…...

相机传感器格式与镜头光圈参数

相机靶面大小 CCD/CMOS图像传感器尺寸&#xff08;sensor format&#xff09;1/2’‘、1/3’‘、1/4’实际是多大 1英寸——靶面尺寸为宽12.7mm*高9.6mm&#xff0c;对角线16mm。 2/3英寸——靶面尺寸为宽8.8mm*高6.6mm&#xff0c;对角线11mm。 1/2英寸——靶面尺寸为宽6.…...

Android 设置头像(拍照获取、相册获取、裁剪照片)

在Android原生态开发过程中&#xff0c;往往会设计到用户头像的设置问题&#xff0c;一般来讲设置头像需要用到拍照、获取照片、存储照片、裁剪照片、显示照片等问题&#xff0c;本文将一步一步的进行说明讲解。 首先需要强调几点我在开发过程中遇到的问题。 权限问题&#xf…...

android开发之Android 自定义滑动解锁View

自定义滑动解锁View 需求如下&#xff1a; 近期需要做一个类似屏幕滑动解锁的功能&#xff0c;右划开始&#xff0c;左划暂停。 需求效果图如下 实现效果展示 自定义view如下 /** Desc 自定义滑动解锁View Author ZY Mail sunnyfor98gmail.com Date 2021/5/17 11:52 *…...