【模块一】kubernetes容器编排进阶实战之pod生命周期、探针简介、类型及示例

kubernetes pod生命周期、探针简介、类型及示例

kubernetes pod生命周期

  • pod的生命周期(pod lifecycle),从pod start时候可以配置postStart检测,运行过程中可以配置livenessProbe和 readinessProbe,最后在 stop前可以配置preStop操作

探针简介

  • 探针是由 kubelet 对容器执行的定期诊断,以保证Pod的状态始终处于运行状态,要执行诊断,kubelet 调用由容器实现的Handler(处理程序),也成为Hook(钩子),有三种类型的处理程序:

    • ExecAction #在容器内执行指定命令,如果命令退出时返回码为0则认为诊断成功。

    • TCPSocketAction #对指定端口上的容器的IP地址进行TCP检查,如果端口打开,则诊断被认为是成功的。

    • HTTPGetAction:#对指定的端口和路径上的容器的IP地址执行HTTPGet请求,如果响应的状态码大于等于200且小于 400,则诊断被认为是成功的。

  • 每次探测都将获得以下三种结果之一:

    • 成功:容器通过了诊断。

    • 失败:容器未通过诊断。

    • 未知:诊断失败,因此不会采取任何行动。

 

Pod重启策略与镜像拉取策略

Pod重启策略:Pod一旦配置探针,在检测失败时候,会基于restartPolicy对Pod进行下一步操作:

  • restartPolicy (容器重启策略):

    • Always:当容器异常时,k8s自动重启该容器,ReplicationController/Replicaset/Deployment,默认为Always。

    • OnFailure:当容器失败时(容器停止运行且退出码不为0),k8s自动重启该容器。

    • Never:不论容器运行状态如何都不会重启该容器,Job或CronJob。

  • imagePullPolicy (镜像拉取策略):

    • IfNotPresent:node节点没有此镜像就去指定的镜像仓库拉取,node有就使用node本地镜像。

    • Always:每次重建pod都会重新拉取镜像

    • Never:从不到镜像中心拉取镜像,只使用本地镜像

探针类型

  • startupProbe: #启动探针,kubernetes v1.16引入

    • 判断容器内的应用程序是否已启动完成,如果配置了启动探测,则会先禁用所有其它的探测,直到startupProbe检测成功为止,如果startupProbe探测失败,则kubelet将杀死容器,容器将按照重启策略进行下一步操作,如果容器没有提供启动探测,则默认状态为成功

  • livenessProbe: #存活探针

    • 检测容器容器是否正在运行,如果存活探测失败,则kubelet会杀死容器,并且容器将受到其重启策略的影响,如果容器不提供存活探针,则默认状态为 Success,livenessProbe用于控制是否重启pod。

  • readinessProbe: #就绪探针

    • 如果就绪探测失败,端点控制器将从与Pod匹配的所有Service的端点中删除该Pod的IP地址,初始延迟之前的就绪状态默认为Failure(失败),如果容器不提供就绪探针,则默认状态为 Success,readinessProbe用于控制pod是否添加至service。

探针配置参数

  • 探针有很多配置字段,可以使用这些字段精确的控制存活和就绪检测的行为:

    配置存活、就绪和启动探针 | Kubernetes

  • initialDelaySeconds: 120 #初始化延迟时间,告诉kubelet在执行第一次探测前应该等待多少秒,默认是0秒,最小值是0

  • periodSeconds: 60 #探测周期间隔时间,指定了kubelet应该每多少秒秒执行一次存活探测,默认是 10 秒。最小值是 1

  • timeoutSeconds: 5 #单次探测超时时间,探测的超时后等待多少秒,默认值是1秒,最小值是1。

  • successThreshold: 1 #从失败转为成功的重试次数,探测器在失败后,被视为成功的最小连续成功数,默认值是1,存活探测的这个值必须是1,最小值是

    1。

  • failureThreshold: 3 #从成功转为失败的重试次数,当Pod启动了并且探测到失败,Kubernetes的重试次数,存活探测情况下的放弃就意味着重新启动容器,就绪探测情况下的放弃Pod 会被打上未就绪的标签,默认值是3,最小值是1。

探针http配置参数:

HTTP 探测器可以在 httpGet 上配置额外的字段:

  • host: #连接使用的主机名,默认是Pod的 IP,也可以在HTTP头中设置 “Host” 来代替。

  • scheme: http #用于设置连接主机的方式(HTTP 还是 HTTPS),默认是 HTTP。

  • path: /monitor/index.html #访问 HTTP 服务的路径。

  • httpHeaders: #请求中自定义的 HTTP 头,HTTP 头字段允许重复。

  • port: 80 #访问容器的端口号或者端口名,如果数字必须在 1 ~ 65535 之间。

[root@k8s-master1 case3-Probe]#cat 1-http-Probe.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myserver-myapp-frontend-deploymentnamespace: myserver
spec:replicas: 1selector:matchLabels: #rs or deploymentapp: myserver-myapp-frontend-label#matchExpressions:#  - {key: app, operator: In, values: [myserver-myapp-frontend,ng-rs-81]}template:metadata:labels:app: myserver-myapp-frontend-labelspec:containers:- name: myserver-myapp-frontend-labelimage: nginx:1.20.2-alpineports:- containerPort: 80#readinessProbe:livenessProbe:httpGet:path: /monitor/monitor.html#path: /index.htmlport: 80initialDelaySeconds: 5periodSeconds: 3timeoutSeconds: 1successThreshold: 1failureThreshold: 3---
apiVersion: v1
kind: Service
metadata:name: myserver-myapp-frontend-servicenamespace: myserver
spec:ports:- name: httpport: 81targetPort: 80nodePort: 30070protocol: TCPtype: NodePortselector:app: myserver-myapp-frontend-label  
探针http演示
[root@k8s-master1 case3-Probe]#kubectl apply -f 1-http-Probe.yaml 
[root@k8s-master1 case3-Probe]#kubectl get -n myserver pod,svc,ep
NAME                                                      READY   STATUS    RESTARTS   AGE
pod/myserver-myapp-frontend-deployment-5b559886c9-74bjh   1/1     Running   0          9sNAME                                      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/myserver-myapp-frontend-service   NodePort   10.100.47.85   <none>        81:30070/TCP   13mNAME                                        ENDPOINTS           AGE
endpoints/myserver-myapp-frontend-service   10.200.107.240:80   13m#如果将配置文件改成不存在的路径,livenessProbe会不断的重启#readinessProbe:livenessProbe:httpGet:path: /monitor/monitor.html#path: /index.htmlport: 80
[root@k8s-master1 case3-Probe]#kubectl get -n myserver pod,svc,ep
NAME                                                    READY   STATUS    RESTARTS     AGE
pod/myserver-myapp-frontend-deployment-d8d99c64-bzmcj   1/1     Running   3 (6s ago)   46sNAME                                      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/myserver-myapp-frontend-service   NodePort   10.100.193.54   <none>        81:30070/TCP   46sNAME                                        ENDPOINTS           AGE
endpoints/myserver-myapp-frontend-service   10.200.107.247:80   45s[root@k8s-master1 case3-Probe]#kubectl get -n myserver pod,svc,ep
NAME                                                     READY   STATUS             RESTARTS      AGE
pod/myserver-myapp-frontend-deployment-d8d99c64-qhq8d    0/1     CrashLoopBackOff   6 (12s ago)   3m40sNAME                                      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/myserver-myapp-frontend-service   NodePort   10.100.47.85   <none>        81:30070/TCP   18mNAME                                        ENDPOINTS   AGE
endpoints/myserver-myapp-frontend-service               18m#如果将配置文件改成不存在的路径,readinessProbe#readinessProbe:livenessProbe:httpGet:path: /monitor/monitor.html#path: /index.htmlport: 80[root@k8s-master1 case3-Probe]#kubectl get -n myserver pod,svc,ep
NAME                                                      READY   STATUS    RESTARTS   AGE
pod/myserver-myapp-frontend-deployment-7dcb656667-wj9kd   0/1     Running   0          4sNAME                                      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/myserver-myapp-frontend-service   NodePort   10.100.232.31   <none>        81:30070/TCP   4sNAME                                        ENDPOINTS   AGE
endpoints/myserver-myapp-frontend-service               4s

探针tcp配置参数

[root@k8s-master1 case3-Probe]#cat 2-tcp-Probe.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myserver-myapp-frontend-deploymentnamespace: myserver
spec:replicas: 1selector:matchLabels: #rs or deploymentapp: myserver-myapp-frontend-label#matchExpressions:#  - {key: app, operator: In, values: [myserver-myapp-frontend,ng-rs-81]}template:metadata:labels:app: myserver-myapp-frontend-labelspec:containers:- name: myserver-myapp-frontend-labelimage: nginx:1.20.2-alpineports:- containerPort: 80livenessProbe:#readinessProbe:tcpSocket:port: 80#port: 8080initialDelaySeconds: 5periodSeconds: 3timeoutSeconds: 5successThreshold: 1failureThreshold: 3---
apiVersion: v1
kind: Service
metadata:name: myserver-myapp-frontend-servicenamespace: myserver
spec:ports:- name: httpport: 81targetPort: 80nodePort: 30070protocol: TCPtype: NodePortselector:app: myserver-myapp-frontend-label

 

探针exec配置参数(执行命令)

[root@k8s-master1 case3-Probe]#cat 3-exec-Probe.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myserver-myapp-redis-deploymentnamespace: myserver
spec:replicas: 1selector:matchLabels: #rs or deploymentapp: myserver-myapp-redis-label#matchExpressions:#  - {key: app, operator: In, values: [myserver-myapp-redis,ng-rs-81]}template:metadata:labels:app: myserver-myapp-redis-labelspec:containers:- name: myserver-myapp-redis-containerimage: redisports:- containerPort: 6379livenessProbe:#readinessProbe:exec:command:#- /apps/redis/bin/redis-cli- /usr/local/bin/redis-cli - quitinitialDelaySeconds: 5periodSeconds: 3timeoutSeconds: 5successThreshold: 1failureThreshold: 3---
apiVersion: v1
kind: Service
metadata:name: myserver-myapp-redis-servicenamespace: myserver
spec:ports:- name: httpport: 6379targetPort: 6379nodePort: 40016protocol: TCPtype: NodePortselector:app: myserver-myapp-redis-label

 

startupProbe: #启动探针

[root@k8s-master1 case3-Probe]#cat 5-startupProbe-livenessProbe-readinessProbe.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myserver-myapp-frontend-deploymentnamespace: myserver
spec:replicas: 3selector:matchLabels: #rs or deploymentapp: myserver-myapp-frontend-label#matchExpressions:#  - {key: app, operator: In, values: [myserver-myapp-frontend,ng-rs-81]}template:metadata:labels:app: myserver-myapp-frontend-labelspec:terminationGracePeriodSeconds: 60containers:- name: myserver-myapp-frontend-labelimage: nginx:1.20.2ports:- containerPort: 80startupProbe:httpGet:path: /index.htmlport: 80initialDelaySeconds: 5 #首次检测延迟5sfailureThreshold: 3  #从成功转为失败的次数periodSeconds: 3 #探测间隔周期readinessProbe:httpGet:#path: /monitor/monitor.htmlpath: /index.htmlport: 80initialDelaySeconds: 5periodSeconds: 3timeoutSeconds: 5successThreshold: 1failureThreshold: 3livenessProbe:httpGet:#path: /monitor/monitor.htmlpath: /index.htmlport: 80initialDelaySeconds: 5periodSeconds: 3timeoutSeconds: 5successThreshold: 1failureThreshold: 3---
apiVersion: v1
kind: Service
metadata:name: myserver-myapp-frontend-servicenamespace: myserver
spec:ports:- name: httpport: 81targetPort: 80nodePort: 40012protocol: TCPtype: NodePortselector:app: myserver-myapp-frontend-label

 

postStart and preStop handlers-简介

为容器的生命周期事件设置处理函数 | Kubernetes这个页面将演示如何为容器的生命周期事件挂接处理函数。Kubernetes 支持 postStart 和 preStop 事件。 当一个容器启动后,Kubernetes 将立即发送 postStart 事件;在容器被终结之前, Kubernetes 将发送一个 preStop 事件。容器可以为每个事件指定一个处理程序。准备开始 你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:Killercoda 玩转 Kubernetes 要获知版本信息,请输入 kubectl version. 定义 postStart 和 preStop 处理函数 在本练习中,你将创建一个包含一个容器的 Pod,该容器为 postStart 和 preStop 事件提供对应的处理函数。下面是对应 Pod 的配置文件:pods/lifecycle-events.yaml apiVersion: v1 kind: Pod metadata: name: lifecycle-demo spec: containers: - name: lifecycle-demo-container image: nginx lifecycle: postStart: exec: command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"] preStop: exec: command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"] 在上述配置文件中,你可以看到 postStart 命令在容器的 /usr/share 目录下写入文件 message。 命令 preStop 负责优雅地终止 nginx 服务。当因为失效而导致容器终止时,这一处理方式很有用。icon-default.png?t=O83Ahttps://kubernetes.io/zh/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/

 

postStart 和 preStop handlers 处理函数:

  • postStart-Pod启动后立即执行指定的擦操作:

    • Pod被创建后立即执行,即不等待pod中的服务启动。

    • 如果postStart执行失败pod不会继续创建

  • preStop:

    • 在pod被停止之前执行

    • 如果preStop一直执行不完成,则最后宽限2秒后强制删除

[root@k8s-master1 case4-postStart-preStop]#cat 1-myserver-myapp1-postStart-preStop.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myserver-myapp1-lifecyclelabels:app: myserver-myapp1-lifecyclenamespace: myserver
spec:replicas: 1selector:matchLabels:app: myserver-myapp1-lifecycle-labeltemplate:metadata:labels:app: myserver-myapp1-lifecycle-labelspec:terminationGracePeriodSeconds: 60containers:- name: myserver-myapp1-lifecycle-labelimage: tomcat:7.0.94-alpine lifecycle:postStart:exec:#command: 把自己注册到注册在中心command: ["/bin/sh", "-c", "echo 'Hello from the postStart handler' >> /usr/local/tomcat/webapps/ROOT/index.html"]#httpGet:#  #path: /monitor/monitor.html#  host: www.magedu.com#  port: 80#  scheme: HTTP#  path: index.htmlpreStop:exec:#command: 把自己从注册中心移除command:- /bin/bash- -c- 'sleep 10000000'#command: ["/usr/local/tomcat/bin/catalina.sh","stop"]#command: ['/bin/sh','-c','/path/preStop.sh']ports:- name: httpcontainerPort: 8080---
apiVersion: v1
kind: Service
metadata:name: myserver-myapp1-lifecycle-servicenamespace: myserver
spec:ports:- name: httpport: 80targetPort: 8080nodePort: 30012protocol: TCPtype: NodePortselector:app: myserver-myapp1-lifecycle-label

Pod的终止流程

https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-graceicon-default.png?t=O83Ahttps://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace

 

1.创建pod

  • 向API-Server提交创建请求、API-Server完成鉴权和准入并将事件写入etcd

  • kube-scheduler完成调度流程

  • kubelet创建并启动pod、然后执行postStart

  • 周期进行livenessProbe

  • 进入running状态

  • readinessProbe检测通过后,service关联pod

  • 接受客户端请求

2.删除pod

  • 向API-Server提交删除请求、API-Server完成鉴权和准入并将事件写入etcd

  • Pod被设置为”Terminating”状态、从service的Endpoints列表中删除并不再接受客户端请求。

  • pod执行PreStop

  • kubelet向pod中的容器发送SIGTERM信号(正常终止信号)终止pod里面的主进程,这个信号让容器知道自己很快将会被关闭 terminationGracePeriodSeconds: 60 #可选终止等待期(pod删除宽限期),如果有设置删除宽限时间,则等待宽限时间到期,否则最多等待30s,Kubernetes等待指定的时间称为优雅终止宽限期,默认情况下是30秒,值得注意的是等待期与preStop Hook和SIGTERM信号并行执行,即Kubernetes可能不会等待preStop Hook完成(最长30秒之后主进程还没有结束就就强制终止pod)。

  • SIGKILL信号被发送到Pod,并删除Pod

root@k8s-master1:~# kubectl  explain  Deployment.spec.template.spec 


 terminationGracePeriodSeconds    <integer>
     Optional duration in seconds the pod needs to terminate gracefully. May be
     decreased in delete request. Value must be non-negative integer. The value
     zero indicates stop immediately via the kill signal (no opportunity to shut
     down). If this value is nil, the default grace period will be used instead.
     The grace period is the duration in seconds after the processes running in
     the pod are sent a termination signal and the time when the processes are
     forcibly halted with a kill signal. Set this value longer than the expected
     cleanup time for your process. Defaults to 30 seconds.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477345.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医学AI公开课·第一期|Machine LearningTransformers in Med AI

小罗碎碎念 从这周开始&#xff0c;我计划每个周末录一个视频&#xff0c;分享一些医学人工智能领域的进展。 作为第一期视频&#xff0c;我打算介绍一下机器学习和Transformer在医学AI领域中的应用。 为了准备这期视频&#xff0c;总共做了24页PPT&#xff08;三部分内容&…

[代码随想录Day21打卡] 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

669. 修剪二叉搜索树 给定一个二叉搜索树root&#xff0c;给定一个范围[low, high]&#xff0c;修剪二叉搜索树&#xff0c;使修建后的二叉搜索树的值的范围在[low, high]内。 思想&#xff1a;当前节点的值和给定的范围之间的关系&#xff0c;如果当前节点的值大于high那么就…

apr共享内存

下载&#xff1a; Download - The Apache Portable Runtime Project 编译&#xff1a; 使用cmake-gui生成库&#xff1a; apr-1.lib aprapp-1.lib libapr-1.lib libaprapp-1.lib libapr-1.dll 在Developer PowerShell for VS 2019中&#xff1a; 执行nmake -f Makefile.win来…

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…

聚水潭与MySQL数据集成案例分享

聚水潭数据集成到MySQL的技术案例分享 在现代数据驱动的业务环境中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接成为企业关注的焦点。本次案例将详细介绍如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据无缝集成到MySQL数据库中&#xff0c;实现从“聚水谭…

C语言中const char *字符进行切割实现

将127.0.0.1以“”“.”来进行切割&#xff0c;实现如下&#xff1a; const char * ip "127.0.0.1";char *test new char[100];strcpy(test, ip);const char *split ".";char *final;final strtok(test, split);while (final){printf("%s\n"…

java基础知识(常用类)

一、包装类&#xff08;Wrapper) &#xff08;1&#xff09;包装类与基本数据的转换 装箱&#xff1a;基本类型->包装类型 拆箱&#xff1a;包装类型->基本类型 java5以后是自动装箱和拆箱的方式&#xff0c;自动装箱底层调用的是valueOf方法&#xff0c;比如Integer.…

【Python系列】字典灵活的数据存储与操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

neo4j图数据库community-5.50创建多个数据库————————————————

1.找到neo4J中的conf文件&#xff0c;我的路径是&#xff1a;D:\Program Files\neo4j-community-5.5.0-windows\neo4j-community-5.5.0\conf 这里找自己的安装路径&#xff0c; 2.用管理员模式打开conf文件&#xff0c;右键管理员&#xff0c;记事本或者not 3.选中的一行新建一…

AVL树实现

1. AVL的概念 AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的⼆叉搜索树&#xff1a;它的 左右⼦树都是AV树&#xff0c;且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树&#xff0c; 通过控制⾼度差去控制平…

jvm发展历程介绍

初始阶段&#xff1a;JDK 1.0 - JDK 1.1 • 经典JVM&#xff1a;这是JVM的早期实现&#xff0c;主要特点是使用解释器&#xff08;Interpreter&#xff09;来逐行解释执行Java字节码。这种方式虽然简单直接&#xff0c;但执行效率相对较低。 • JIT编译器&#xff08;Just-In-T…

准备阶段 Profiler性能分析工具的使用(一)

Unity 性能分析器 (Unity Profiler) 性能分析器记录应用程序性能的多个方面并显示相关信息。使用此信息可以做出有关应用程序中可能需要优化的事项的明智决策&#xff0c;并确认所做的优化是否产生预期结果。 默认情况下&#xff0c;性能分析器记录并保留游戏的最后 300 帧&a…

初学 flutter 环境变量配置

一、jdk&#xff08;jdk11&#xff09; 1&#xff09;配置环境变量 新增&#xff1a;JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增&#xff1a;%JAVA_HOME%\bin2&#xff09;验证是否配置成功&#xff08;cmd运行命令&#xff09; java java -version …

HTML 元素类型介绍

目录 1. 块级元素&#xff08;Block-level Elements&#xff09; 2. 行级元素&#xff08;Inline Elements&#xff09; 3. 行内块级元素&#xff08;Inline-block Elements&#xff09; 4. 表格相关元素 5. 列表相关元素 6. 表单相关元素 示例代码 示例效果 ​编辑 …

高危,Laravel参数注入漏洞安全风险通告

今日&#xff0c;亚信安全CERT监控到安全社区研究人员发布安全通告&#xff0c;披露了Laravel 参数注入漏洞(CVE-2024-52301)。在受影响的版本中&#xff0c;Application.php 文件的 detectEnvironment 函数直接使用了 $_SERVER[argv]&#xff0c;但没有检查运行环境是否为 CLI…

表格数据处理中大语言模型的微调优化策略研究

论文地址 Research on Fine-Tuning Optimization Strategies for Large Language Models in Tabular Data Processing 论文主要内容 这篇论文的主要内容是研究大型语言模型&#xff08;LLMs&#xff09;在处理表格数据时的微调优化策略。具体来说&#xff0c;论文探讨了以下…

如何搭建C++环境--1.下载安装并调试Microsoft Visual Studio Previerw(Windows)

1.首先&#xff0c;打开浏览器 首先&#xff0c;搜索“Microsoft Visual Studio Previerw” 安装 1.运行VisualStudioSetup (1).exe 无脑一直点继续 然后就到 选择需要的语言 我一般python用pycharm Java&#xff0c;HTML用vscode&#xff08;Microsoft Visual Studio cod…

数字化工厂 MES试点方案全解析(二)

生产过程监控与数据采集 在生产线上部署各类传感器、数据采集终端等设备&#xff0c;与 MES 系统相连&#xff0c;实时采集生产数据&#xff0c;如设备运行参数&#xff08;温度、压力、转速等&#xff09;、产品加工数据&#xff08;尺寸、重量、加工时间等&#xff09;、物料…

TCP vs UDP:如何选择适合的网络传输协议?

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种非常重要的传输层协议。它们各有特点&#xff0c;适用于不同类型的应用场景。本文将详细探讨TCP和UDP协议的结构、优缺点及应用&…

Redis最终篇分布式锁以及数据一致性

在前三篇我们几乎说完了Redis的所有的基础知识以及Redis怎么实现高可用性,那么在这一篇文章中的话我们主要就是说明如果我们使用Redis出现什么问题以及解决方案是什么,这个如果在未来的工作中也有可能会遇到,希望对看这篇博客的人有帮助,话不多说直接开干 一.Hotkey以及BigKey…