kubernetes pod調度基礎

目錄

Replication Controller 和 ReplicaSet

標簽與標簽選擇器

無狀態應用管理Deployment

有狀態應用管理StatefulSet

守護進程集DaemonSet


Replication Controller 和 ReplicaSet

RC用來確保Pod副本數達到期望值,這樣可以確保一個或多七個同類Pod總是可用的
如果存在的Pod數量大于設定的值,Replication Controller將終止額外的Pod,如果太少,
Replication Controller將會啟動更多的Pod用于保證達到期望值,與手動創建Pod不同的是,用Replication Controller維護的Pod在失敗、刪除或終止時會自動替換。因此,即使應用程序只需要一個Pod,也應該使用Replication Controller或其他方式管管理。Replication Controller類似于進程管理程序,但是Replication Controller不是監視單個節點上的各個進程,而是監視多個節點上的多個Pod。

創建名為replication.yaml的文件,內容如下:

apiVersion: v1
kind: ReplicationController
metadata:name: nginx
spec:replicas: 3selector:app: nginxtemplate:metadata:name: nginxlabels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80

?

  • 創建 Replication Controller:執行命令kubectl apply -f replication.yaml,創建名為nginx的 Replication Controller。
  • 查看狀態:使用命令kubectl describe replicationcontrollers nginx查看其狀態,初始可能顯示pods status: 0 running / 3 waiting / 0 succeeded / 0 failed,稍后會變為pods status: 3 running / 0 waiting / 0 succeeded / 0 failed
  • 列出相關 Pod:通過命令pods=$(kubectl get pods --selector=app=nginx --output=jsonpath={.items[*].metadata.name}) && echo $pods,可列出該 Replication Controller 管理的 Pod 名稱。
  • ReplicaSet 實驗案例1

  • 案例目的:創建一個 ReplicaSet,同樣用于管理 Nginx 應用的 Pod 副本,維持 3 個副本,并展示其標簽選擇器的靈活性。
  • 操作步驟
    • 創建配置文件:創建replicaset.yaml文件,內容如下:
    • apiVersion: apps/v1
      kind: ReplicaSet
      metadata:name: nginx - replicaset
      spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80
    • 創建 ReplicaSet:執行命令kubectl apply -f replicaset.yaml,創建名為nginx - replicaset的 ReplicaSet。
    • 查看狀態:使用kubectl describe replicaset nginx - replicaset查看狀態,確認其是否成功創建并維持 3 個 Pod 副本。
    • 測試標簽選擇器:可以嘗試修改matchLabels中的標簽,或者添加更多標簽選擇條件,如matchExpressions,然后重新應用配置文件,觀察 Pod 的創建和管理情況。例如,若添加一個tier in (front - end)的標簽選擇條件,只有符合該條件的 Pod 才會被該 ReplicaSet 管理。

標簽與標簽選擇器

標簽

標簽是用來標識K8S對象的一組附加在其上的鍵值對,通過標簽我我們可以方便地篩選或排除一組對象借鑒資料中的話來講,集群中的應用部署或是批處理的程序部署通常都是多維度的,為了實現對這些對象的管理,往往需要對某一特定維度的對象進行操作,而標簽可可以通過用戶的意愿組織集群中的對象之間的結構,而不需要對集群進行修改在同一個對象之下標簽的Key值必須唯一的。名稱方面,標簽名不得多于63個字符且必須由字母或數字開頭或結尾,可以包含字母、數字、-、、、等字符;標簽前繳是可選的,必須以DNS子域名的方式指定,例如:kubernetes.io,后用/將其與標簽名分隔。通常情請況下,若不使用標簽前綴,那么該標簽的Key將被視為專屬于用戶的,在K8S的系統組件向對象添加標:簽時,必須指定前綴。在標簽值方面,若標簽值不為空,則其長度不得多于63個字符且必須由字母或數字開頭或結尾,可以包含字母、數字、-、等字符。

標簽選擇器

標簽選擇器可以用來選擇一組對象(標簽并不能唯一標識一個對象),APIServer支持兩種標簽選擇器:基于等式的標簽選擇器與基于集合的標簽選器:
基于等式的標簽選擇方式:在這種選擇方式下可以使用=、==、!=三種操作符來進行選擇,前兩個的含義是一樣的,都代表相等,第三種代表不等。選擇條件可以通過,疊加,例如date=day1,name!=build代表選擇date值為day1且name值不為build的對象。
基于集合的標簽選擇方式:這種選擇器可以同時選擇一組對象只。支持的操作符有:in、notin、exists具體的使用方法為:選擇date包含有值為day1、day2、day3的標簽:date in(dayy1,day2,day3選擇name值不為build、pipline的標簽:name notin(build, pipline)
選擇所有包含test的標簽:test基于集合的標簽選擇器也支持使用","分隔以同時疊加選擇,相同意義上的選擇條件在這兩種選擇方式之間是等價的。

標簽等式的標簽選擇器

matchlabels是{key,value}對的映射。matchlabels 映射中中的單個{key,value}等價于
matchexpressions的元素,其鍵字段為"key",運算符為"in",值數組僅包含"value"
matchexpressions是pod選擇器需求的列表。有效的運算符包括in、notin、exists 和doesnotexist.對于in和notin,設置的值必須為非空。matchlabels和mattchexpressions中的所有要求都被放在一起,必須滿足所有這些要求才能匹配。

ReplicaSet

Replicaset(復制集,RS)是支持基于集合的標簽選擇器的下一代Replication Controller,它
主要用于Deployment協調創建、刪除和更新Pod,和Repliication Controller唯一的區別是,ReplicaSet支持標簽選擇器。在實際應用中,雖然Replicasset可以單獨使用,但是一般建議使用Deployment來自動管理Replicaset,除非自定義的Pod不需要更新或有其他編排等

?Pod 標簽示例
apiVersion: v1
kind: Pod
metadata:name: nginx-weblabels:# 應用標識app: nginx          # 應用版本version: v1        # 服務層級tier: frontend      # 環境類型environment: prod  
spec:# 容器配置...

?Service 標簽示例

apiVersion: v1
kind: Service
metadata:name: nginx-servicelabels:# 關聯應用app: nginx          # 服務類型service: web        
spec:# 服務配置...

創建帶標簽的 Pod

# pod-with-labels.yaml
apiVersion: v1
kind: Pod
metadata:name: frontend-podlabels:app: myapptier: frontendenv: test
spec:containers:- name: nginximage: nginx

無狀態應用管理Deployment

無狀態服務(stateless service)對單次請求的處理,不依賴其他請求,也就是說,處理一次請求所需的全部信息,要么都包含在這個請求里,要么可以從外部獲取到(比如說數據庫),服務器本身不存儲任何信息。這種服務叫做無狀態服務。
無狀態服務:就是沒有特殊狀態的服務,各個請求對于服務器來說統無差別處理,請求自身攜帶了所有服務端所需要的所有參數(服務端自身不存儲跟請求相關的任何數據,不包括數據庫存儲信息)

無狀態服務的優點

數據方面:無狀態服務不會在本地存儲持久化數據.多個實例可以共享享相同的持久化數據
結果方面:多個服務實例對于同一個用戶請求的響應結果是完全一致的
關系方面:這種多服務實例之間是沒有依賴關系
影響方面:在k8s控制器中動態啟停無狀態服務的pod并不會對其它的pod產生影響
示例方面:nginx實例,tomcat實例,web應用
資源方面:相關的k8s資源有:ReplicaSet、ReplicationCointroller、Deployment
創建方式:Deployment被設計用來管理無狀態服務的pod
每個pod完全一致,原因如下:
無狀態服務內的多個Pod創建的順序是沒有順序的

無狀態服務內的多個Pod的名稱是隨機的
pod被重新啟動調度后,它的名稱與IP都會發生變化
無狀態服務內的多個Pod背后是共享存儲的

(8)擴縮容方式:隨機縮容
由于是無狀態服務,所以這些控制器創建的pod序號都是阿隨機值。并且在縮容也是隨機,并不會明縮容某一個pod。因為所有實例得到的返回值都是一樣,所以縮容任何一個pod都可以。無狀態服務不會在本地存儲持久化數據。多個服務實例對于同同一個用戶請求的響應結果是完全一致的。這種多服務實例之間是沒有依賴關系,比如web應用,在k8s控制器中動態啟停無狀態服務的pod并不會對其它的pod產生影響。
Deployment被設計用來管理無狀態服務的pod,每個pod完全一致
無狀態服務內的多個Pod創建的順序是沒有順序的。
無狀態服務內的多個Pod的名稱是隨機的.pod被重新啟動調度后,它的名稱與IP都會發生變化無狀態服務內的多個Pod背后是共享存儲的。

編寫一個名為nginx - deployment.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.2ports:- containerPort: 80

此 YAML 文件定義了一個名為nginx - deployment的 Deployment,它將創建 3 個 Pod 副本,每個 Pod 運行nginx:1.14.2鏡像,并暴露 80 端口。

部署 Nginx Deployment

使用以下命令在 Kubernetes 集群中創建 Deployment:

kubectl apply -f nginx - deployment.yaml

3. 查看 Deployment 狀態

使用以下命令查看 Deployment 的詳細信息:

kubectl describe deployment nginx - deployment

也可使用以下命令查看 Deployment 創建的 Pod:

kubectl get pods - l app = nginx

4. 更新 Nginx Deployment

假設要將 Nginx 鏡像更新到新版本nginx:1.20.0,編輯nginx - deployment.yaml文件,將image字段的值修改為nginx:1.20.0,然后再次應用配置:

kubectl apply -f nginx - deployment.yaml

Kubernetes 會自動執行滾動更新,逐步用新版本的 Pod 替換舊版本的 Pod。

5. 回滾 Deployment

如果更新后出現問題,可使用以下命令回滾到上一個版本:

kubectl rollout undo deployment nginx - deployment

若要回滾到指定版本,先查看 Deployment 的歷史版本:

kubectl rollout history deployment nginx - deployment

然后根據版本號回滾,例如回滾到版本 3:

kubectl rollout undo deployment nginx - deployment --to - revision = 3

6. 擴展和縮減 Deployment

可根據負載情況調整 Pod 的副本數量。例如,將副本數量擴展到 5:

kubectl scale deployment nginx - deployment --replicas = 5

查看 Deployment 狀態,確認副本數已更新:

kubectl get deployment nginx - deployment

若要縮減副本數,如減至 2 個,執行:

kubectl scale deployment nginx - deployment --replicas = 2

7. 刪除 Deployment

當不再需要該 Deployment 時,可使用以下命令將其刪除:

kubectl delete deployment nginx - deployment

這會刪除 Deployment 及其管理的所有 Pod。

有狀態應用管理StatefulSet

StatefulSet(有狀態集,縮寫為sts)常用于部署有狀態的且需要有序啟動的應用程序。比如在生產環境中,可以部署Elasticsearch集群、MongoDB集群或者需要持久化的RabbitMQ集群、Redis集
群、Kafka集群和Zookeeper集群等。
一個StatefulSet管理著基于相同容器規范的Pod。與Deployment不同的是,Statefulset為每個Pod維護了一個標識。這些Pod是根據相同規范創建的,但是不可互換,每個Pod都有一個持久的標識符,在重新調度時也會被保留。

有狀態服務的特征

數據方面:有狀態服務需要在本地存儲持久化數據,典型的應用是分布式數據庫
結果方面:實例之間,請求結果可能存在不一致
關系方面:分布式節點實例之間有依賴的拓撲關系,比如主從關關系。
影響方面:如果K8S停止分布式集群中任一實例pod,就可能會導致數據丟失或者集群的crash(崩
示例方面:mysql數據庫、kafka、zookeeper、Redis主從架構
資源方面:statefulSet
創建方式:statefulSet管理Stateful管理有狀態的應用,Pod有如下特征:
唯一性:每個Pod會被分配一個唯一序號.
順序性:Pod啟動,更新,銷毀是按順序進行.
穩定的網絡標識:Pod主機名,DNS地址不會隨著Pod被重新調度而發生變化
穩定的持久化存儲:Pod被重新調度后,仍然能掛載原有的PV,從而保證了數據的完整性和一致性

有狀態服務的應用場景

數據方面:有狀態服務需要在本地存儲持久化數據,典型的應用是分布式數據庫
結果方面:實例之間,請求結果可能存在不一致
關系方面:分布式節點實例之間有依賴的拓撲關系,比如主生從關系
影響方面:如果K8S停止分布式集群中任一實例pod,就可能會導致數據丟失或者集群的crash(崩潰
示例方面:mysql數據庫、kafka、zookeeper、Redis主從架構
資源方面:statefulSet
創建方式:statefulSet管理
Stateful管理有狀態的應用,Pod有如下特征:
唯一性:每個Pod會被分配一個唯一序號.
順序性:Pod啟動,更新,銷毀是按順序進行.
穩定的網絡標識:Pod主機名,DNS地址不會隨著Pod被重新調度而發生變化
穩定的持久化存儲:Pod被重新調度后,仍然能掛載原有的PV,從而保證了數據的完整性和一致性

有狀態服務的應用場景

有狀態的pod是用來運行有狀態應用的,所以其在數據卷上不存儲的數據非常重要,在Statefulset縮容時刪除這個聲明將是災難性的,特別是對于Statefulset來說,縮容就像減少其replicas數值一樣簡單。基于這個原因,當需要釋放特定的持久卷時,需要手動刪除對應的持久卷聲明。有狀態服務需要在本地存儲持久化數據,典型的是分布式數據庫的應用,分布式節點實例之間有依賴
的拓撲關系.比如,主從關系。如果K8S停止分布式集群中任一實例pod,就可能會導致數據丟失或者集群的crash(崩潰)有狀態服務可以說是需要數據存儲功能的服務、或者指多線程類型的服務,隊列等。(mysql數據
庫、kafka、zookeeper等)有狀態服務常常用于實現事務(并不是唯一辦法,下文有另外的方案)。舉一個常見的例子,在商城里購買一件商品。需要經過放入購物車、確認訂單、付款等多個步驟。由于HTTP協議本身是無狀態的,所以為了實現有狀態服務,就需要通過一些額外的方案。比如最常見的session,將用戶挑選的商品(購物車),保存到session中,當付款的時候,再從購物車里取收出商品信息

無狀態服務和有狀態服務的比較無狀態服務

服務不依賴自身的狀態,實例的狀態數據可以維護在內存中。
任何一個請求都可以被任意一個實例處理。
不存儲狀態數據,實例可以水平拓展,通過負載均衡將請求分發到各個節點。
在一個封閉的系統中,只存在一個數據閉環。
通常存在于單體架構的集群中。

有狀態服務

服務本身依賴或者存在局部的狀態數據,這些數據需要自身持久化或者可以通過其他節點恢復。一個請求只能被某個節點(或者同等狀態下的節點)處理。
存儲狀態數據,實例的拓展需要整個系統參與狀態的遷移。
在一個封閉的系統中,存在多個數據閉環,需要考慮這些閉環的數據一致性問題
通常存在于分布式架構中。

首先需要創建一個 StorageClass,為 StatefulSet 提供動態存儲:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: mysql - storage
provisioner: kubernetes.io/aws - ebs  # 根據你的集群環境選擇合適的存儲插件
parameters:type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:- debug

將上述內容保存為mysql - storageclass.yaml,然后執行:

kubectl apply -f mysql - storageclass.yaml

2. 創建 Headless Service

為 StatefulSet 創建一個 Headless Service,為 Pod 提供穩定的網絡標識:

apiVersion: v1
kind: Service
metadata:name: mysql - servicelabels:app: mysql
spec:ports:- port: 3306name: mysqlclusterIP: None  # 指定為Headless Serviceselector:app: mysql

保存為mysql - service.yaml并執行:

kubectl apply -f mysql - service.yaml

3. 創建 StatefulSet

創建一個 StatefulSet 來管理 MySQL 實例:

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql - statefulset
spec:serviceName: "mysql - service"replicas: 3selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0ports:- containerPort: 3306name: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql - secretkey: root - passwordvolumeMounts:- name: mysql - datamountPath: /var/lib/mysqlvolumeClaimTemplates:- metadata:name: mysql - dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "mysql - storage"resources:requests:storage: 10Gi

注意,這里引用了一個名為mysql - secret的 Secret,需要提前創建:

kubectl create secret generic mysql - secret --from - literal = root - password = your - password

將 StatefulSet 配置保存為mysql - statefulset.yaml并執行:

kubectl apply -f mysql - statefulset.yaml

4. 驗證 StatefulSet

查看 StatefulSet 狀態:

kubectl get statefulset mysql - statefulset

查看創建的 Pod:

kubectl get pods - l app = mysql

你會看到類似以下格式的 Pod 名稱:mysql - statefulset - 0mysql - statefulset - 1mysql - statefulset - 2

查看 PVC 和 PV:

kubectl get pvc
kubectl get pv

5. 連接到 MySQL 實例

可以通過 Pod 名稱連接到特定的 MySQL 實例。例如,連接到mysql - statefulset - 0

kubectl exec - it mysql - statefulset - 0 -- mysql - uroot - p

輸入之前設置的密碼your - password即可登錄。

6. 擴展和縮減 StatefulSet

擴展 MySQL 實例到 5 個:

kubectl scale statefulset mysql - statefulset --replicas = 5

縮減回 3 個:

kubectl scale statefulset mysql - statefulset --replicas = 3

注意,StatefulSet 的縮容是有序的,會從最大索引的 Pod 開始刪除。

7. 更新 StatefulSet

如果需要更新 MySQL 版本,編輯mysql - statefulset.yaml文件,修改image字段,然后應用更改:

kubectl apply -f mysql - statefulset.yaml

默認情況下,StatefulSet 使用OnDelete更新策略,需要手動刪除 Pod 才能觸發更新。也可以將更新策略改為RollingUpdate

updateStrategy:type: RollingUpdate

8. 刪除 StatefulSet

刪除 StatefulSet 時,PVC 不會自動刪除,以保護數據:

kubectl delete statefulset mysql - statefulset

如果需要刪除 PVC 和 PV,可執行:

kubectl delete pvc - l app = mysql

守護進程集DaemonSet

什么是Daemonset

有時候我們需要在每個Kubernetes節點或符合條件的節點點上都部署某個應用,那么就可以使用Kubernetes的DaemonSet調度 Pod。DaemonSet確保全部(或符合條件)的節點上運行一個Pod副本。
當有新的節點加入集群時,也會為他們新增一個Pod,當節點從集群中移除時,這些Pod會被回收,刪除DaemonSet將會刪除它創建的所有的Pod。

創建 DaemonSet YAML 文件

編寫一個名為fluentd - daemonset.yaml的文件,內容如下

apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentd - loggingnamespace: kube - systemlabels:k8s - app: fluentd - log - collector
spec:selector:matchLabels:name: fluentd - loggingtemplate:metadata:labels:name: fluentd - loggingspec:tolerations:- key: node - role.kubernetes.io/control - planeeffect: NoSchedule- key: node - role.kubernetes.io/mastereffect: NoSchedulecontainers:- name: fluentdimage: fluent/fluentd:v1.14 - debianslimresources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MivolumeMounts:- name: varlogmountPath: /var/log- name: varlibdockercontainersmountPath: /var/lib/docker/containersreadOnly: trueterminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log- name: varlibdockercontainershostPath:path: /var/lib/docker/containers

此 YAML 文件定義了一個名為fluentd - logging的 DaemonSet,它會在每個節點上運行一個 Fluentd 容器,用于收集容器日志

部署 DaemonSet

使用以下命令在 Kubernetes 集群中創建 DaemonSet:

kubectl apply -f fluentd - daemonset.yaml

3. 查看 DaemonSet 狀態

使用以下命令查看 DaemonSet 的詳細信息:

kubectl describe daemonset fluentd - logging - n kube - system

查看已調度的 Pod 數量:

kubectl get daemonset fluentd - logging - n kube - system

輸出類似于:

NAME               DESIRED   CURRENT   READY   UP - TO - DATE   AVAILABLE   NODE SELECTOR   AGE
fluentd - logging   3         3         3       3              3           <none>          10m

這里的DESIRED表示集群中的節點數,CURRENTREADY表示實際運行的 Pod 數。

4. 查看運行的 Pod

使用以下命令查看 DaemonSet 創建的 Pod:

kubectl get pods - n kube - system - l name = fluentd - logging

每個 Pod 會在不同的節點上運行,名稱類似于:fluentd - logging - xyz12

5. 節點選擇器和容忍度

如果需要將 DaemonSet 限制在特定節點上運行,可以添加nodeSelector字段。例如,只在標記為storage - node = true的節點上運行:

spec:template:spec:nodeSelector:storage - node: "true"

DaemonSet 默認會調度到所有節點,包括 master 節點。如果不想在 master 節點上運行,可以添加容忍度(tolerations),如示例中所示。

6. 更新 DaemonSet

如果需要更新 Fluentd 版本,編輯fluentd - daemonset.yaml文件,修改image字段,然后再次應用配置:

kubectl apply -f fluentd - daemonset.yaml

Kubernetes 會自動執行滾動更新,逐個替換舊版本的 Pod。

7. 回滾 DaemonSet

如果更新后出現問題,可使用以下命令回滾到上一個版本:

kubectl rollout undo daemonset fluentd - logging - n kube - system

8. 刪除 DaemonSet

當不再需要該 DaemonSet 時,可使用以下命令將其刪除:

kubectl delete daemonset fluentd - logging - n kube - system

這會刪除 DaemonSet 及其管理的所有 Pod。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912601.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912601.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue 3 響應式核心源碼詳解(基于 @vue/reactivity)

&#x1f9ec; Vue 3 響應式核心源碼詳解&#xff08;基于 vue/reactivity&#xff09; ?? 整理不易&#xff0c;記得點贊、收藏、關注&#xff0c;揭開 Vue 響應式的神秘面紗&#xff01; &#x1f9ed; 一、源碼結構總覽&#xff08;relevant files&#xff09; Vue 的響應…

編寫shell腳本掃描工具,掃描服務器開放了哪些端口(再嘗試用python編寫一個)

先將需要掃描的服務器的端口顯示出來&#xff0c;然后再顯示哪些ip地址對應的服務器的哪些端口已開放或未開放 下面這個shell腳本可以同時掃描多個ip對應的多個服務器的多個端口是否開放&#xff1a; 以下是運行結果&#xff1a; nc 和 nmap 掃描別人的機器開放了哪些端口 ne…

java JNDI高版本繞過 工具介紹 自動化bypass

JNDI高版本rce失效問題 原因&#xff1a; 主要還是協議控制高版本的一般都會關閉如rmi&#xff0c;ldap等協議遠程加載的類 RMI限制&#xff1a; com.sun.jndi.rmi.object.trustURLCodebase、com.sun.jndi.cosnaming.object.trustURLCodebase的默認值變為false&#xff0c;即…

JavaWeb筆記02

三、數據庫設計 1_簡介 1.數據庫設計設計什么&#xff1f; 有哪些表 表里有哪些字段 表和表之間是什么關系 2.表關系有哪幾種&#xff1f; 一對一 一對多&#xff08;多對一&#xff09; 多對多 2_多表關系實現 表關系之一對多 一對多 (多對一): 如&#xff1a;部門表和員…

Junit_注解_枚舉

文章目錄 一&#xff1a;Junit單元測試測試分類&#xff1a;Junit的使用Before_After 二&#xff1a;注解什么是注解文檔相關的注解IDEA中的javadoc使用&#xff1a;JDK內置的3個注解自定義注解 元注解RetentionTargetRepeatableDocumented&#xff08;用的很少&#xff09;Inh…

將N8N配置為服務【ubuntu】

docker模式不在此討論。這里討論的是node安裝為n8n后&#xff0c;如何安裝為服務&#xff1a; 安裝NODE&#xff08;略&#xff09; 安裝N8N 一個命令解決&#xff1a; npm install n8n -g 安裝服務 vi /etc/systemd/system/n8n.service內容如下 [Unit] Descriptionn8…

Java后端調用外部接口標準流程詳解

在Java后端開發中&#xff0c;調用外部HTTP接口&#xff08;如第三方平臺API、云服務、微服務等&#xff09;是非常常見的需求。實現這個功能通常遵循一套標準的流程&#xff1a; 1. 準備DTO類&#xff08;數據傳輸對象&#xff09; 作用&#xff1a; DTO&#xff08;Data Tra…

星火燎原 數智新生 —— 《GB/T 45341—2025》 × AI大模型 × 全域PaaS創新,領碼SPARK打造行業數字化轉型新范式

【摘要】 數字中國新征程&#xff0c;標準引航數智化。面對企業數字蝶變的關鍵關口&#xff0c;《GB/T 45341—2025 數字化轉型管理 參考架構》引領行業規范發展。愛分析最新數據顯示&#xff0c;中國iPaaS市場規模持續高增長&#xff0c;印證PaaS已成為企業數字化基石。 AI大…

25-7-1 論文學習(1)- Fractal Generative Models 何愷明大佬的論文

分形生成模型 Tianhong Li1 Qinyi Sun1 Lijie Fan2 Kaiming He1 摘要 模塊化是計算機科學的基石&#xff0c;它將復雜函數抽象為原子構建塊。在本文中&#xff0c;我們通過將生成模型抽象為原子生成模塊&#xff0c;引入了新的模塊化層次。類似于數學中的分形&#xff0c;我…

如何讀取運行jar中引用jar中的文件

1.問題發現 項目中有個common包資源文件&#xff0c;然后springboot項目引用了common&#xff0c;那么我們要怎么讀取這個資源了。這里需要考慮三個場景&#xff0c;idea運行時、common jar獨立運行時、springboot引用common后運行時。 2.問題解決 2.1.idea運行時 Protection…

【學習方法】框架質疑學習法:破解專業學習的“知識厚度”困境

今天博主給大家分享一個&#xff0c;我自己發明了一個比較高效的學習方法,名叫“框架質疑學習法” 本文提出的框架質疑學習法&#xff08;Framework Questioning Learning Method&#xff09;為本文作者&#xff0c;也就是我&#xff0c;董翔首次提出。 在軟件專業的學習中&a…

spring-ai 1.0.0 學習(十七)——MCP Client

之前學過了工具調用&#xff08;spring-ai 1.0.0 學習&#xff08;十二&#xff09;——工具調用_springai 1.0 如何判斷調用哪一個tool工具-CSDN博客&#xff09;&#xff0c;今天來看一下MCP MCP是什么 MCP全稱是模型上下文協議&#xff0c;有點繞&#xff0c;通俗點理解&a…

Git 運行.sh文件

1.在項目文件中右擊 Open Git Bash here 顯示&#xff08;base&#xff09;環境 2.激活conda環境 3.復制.sh文件的相對路徑 4.將路徑復制到git終端 先輸入sh和空格&#xff0c;然后右擊后選paste&#xff0c;不要直接ctrl v 5.開始運行

MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么區別?

MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么區別&#xff1f; 主要解答詳細解答1. **聚簇索引&#xff08;Clustered Index&#xff09;**2. **非聚簇索引&#xff08;Non-Clustered Index / Secondary Index&#xff09;**3. **對比總結**4. **流程圖&#xff08;查詢過…

[2025CVPR]DE-GANs:一種高效的生成對抗網絡

目錄 引言:數據高效GAN的困境 核心原理:動態質量篩選機制 1. 判別器拒絕采樣(DRS)的再思考 2. 質量感知動態拒絕公式 (1)質量感知階段 (2)動態拒絕階段 模型架構:輕量化設計 技術突破:三大創新點 1. 首創訓練階段DRS 2. 動態拒絕機制 3. 質量重加權策略 …

[面試] 手寫題-數組轉樹

示例數據&#xff1a; const arr [{ id: 1, parentId: null, name: Root },{ id: 2, parentId: 1, name: Child 1 },{ id: 3, parentId: 1, name: Child 2 },{ id: 4, parentId: 2, name: Grandchild 1 }, ]目標生成&#xff1a; const tree [{id: 1,name: Root,children: …

CertiK《Hack3d:2025年第二季度及上半年Web3.0安全報告》(附報告全文鏈接)

CertiK《Hack3d&#xff1a;2025年第二季度及上半年Web3.0安全報告》現已發布&#xff0c;報告顯示&#xff1a;僅2025年上半年&#xff0c;因安全事件導致的損失接近25億美元&#xff1b;截至目前&#xff0c;總損失已超過去年全年水平。整體來看&#xff0c;Web3.0安全形勢依…

反向傳播 梯度消失

反向傳播 backpropagation 反向傳播&#xff08;Backpropagation&#xff09; 是神經網絡訓練中的一種核心算法&#xff0c;用于通過計算誤差并將其傳播回網絡&#xff0c;從而更新神經網絡的參數。通過反向傳播&#xff0c;網絡能夠在每次迭代中逐步調整其參數&#xff08;例…

京東外賣服務商加入方案對比!選擇本地生活服務商系統的優勢,到底在哪?

自入局之日起&#xff0c;京東外賣似乎就一直熱衷于給人驚喜&#xff1a; 先是在上線時規定了“2025年5月1日前入駐的商家&#xff0c;全年免傭金”和“僅限品質堂食商家入駐”&#xff1b; 再是宣布了要為外賣騎手繳納五險一金&#xff0c;并承擔其中的所有成本&#xff1b;…

【RTSP從零實踐】4、使用RTP協議封裝并傳輸AAC

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…