K8S -理解StatefulSet - 部署有狀態應用

在這里插入圖片描述



什么是 有狀態服務和 無狀態服務

有狀態服務(Stateful Service):
有狀態服務是指在處理請求期間維護和跟蹤用戶狀態或會話信息的服務。這意味著服務在多個請求之間保持狀態,并且需要在請求之間共享和使用這些狀態信息。通常,有狀態服務會將用戶數據存儲在內存、數據庫或其他持久化存儲中,并使用該狀態來處理后續請求。有狀態服務通常需要進行會話管理和狀態同步,以確保正確處理和維護用戶狀態。

無狀態服務(Stateless Service):
無狀態服務是指在處理請求期間不維護任何用戶狀態或會話信息的服務。每個請求被視為獨立的、無關的操作,服務不會存儲或依賴之前的請求狀態。無狀態服務僅根據當前請求的輸入進行處理,并生成相應的輸出。無狀態服務更加簡單和可伸縮,因為它們不需要跟蹤和管理用戶狀態。每個請求都是獨立的,可以在集群中的任何實例之間進行負載均衡。
總結:

有狀態服務維護和使用用戶狀態或會話信息,需要進行狀態同步和會話管理。
無狀態服務不維護任何用戶狀態或會話信息,每個請求是獨立的。

再簡單地講, 有狀態服務需要考慮用戶數據如何在各個service instance 中同步的問題。
而無狀態服務是不需要考慮的, 所以無狀態服務能基于QPS 無限制地進行增加實例, 但是有狀態并不能這么做




K8S 的deployment 是不是只能用于無狀態服務

Deployment 在 Kubernetes 中用于管理無狀態應用的更新和擴縮容,但它也可以用于管理有狀態應用。Deployment 控制器是 Kubernetes 中的一種資源對象,它提供了應用部署的聲明性描述,并負責確保所需的 Pod 副本數目在集群中運行。

Deployment 控制器的主要功能是實現滾動更新(Rolling Update)和回滾(Rollback)。無狀態應用通常使用 Deployment 來進行部署和更新,因為它們的實例可以平滑地替換,而不會對應用的狀態造成影響。

然而,有狀態應用也可以使用 Deployment 進行部署,尤其是在需要水平擴展和滾動更新有狀態應用時。通過配置適當的存儲卷(Volume)和持久性聲明(PersistentVolumeClaim),可以確保有狀態應用在 Pod 替換過程中不會丟失數據。

此外,對于有狀態應用,Kubernetes 還提供了 StatefulSet 控制器,它專門用于部署和管理有狀態應用。StatefulSet 可以為每個 Pod 分配一個唯一的標識符和穩定的網絡標識,確保有狀態應用的穩定性和持久性。StatefulSet 適用于需要有序部署、有狀態存儲和有狀態網絡標識的應用場景。

因此,Deployment 對于無狀態應用是常用的部署方式,但也可以用于管理有狀態應用。對于有狀態應用,可以使用 StatefulSet 來獲得更多的特性和保證。




StatefulSet 更適合用于有狀態service的部署

原因如下:

  1. 穩定的網絡標識符:StatefulSet 為每個 Pod 分配一個唯一的標識符,通常是以序號的形式命名,例如 myapp-0, myapp-1,以此類推。這些標識符在 Pod 的重新創建過程中保持不變,使得有狀態應用能夠保持穩定的網絡標識。這對于一些需要固定標識符的應用非常重要,例如數據庫集群中的主從關系或者分布式系統中的節點標識。

  2. 有序的部署和擴縮容:StatefulSet 支持有序的部署和擴縮容。在擴展 StatefulSet 時,Kubernetes 會按照指定的順序創建新的 Pod,確保先創建的 Pod 首先可用。這對于一些有狀態應用非常重要,例如數據庫集群中的主從復制關系,需要確保先啟動主節點再啟動從節點。

  3. 持久性存儲:StatefulSet 可以與持久性存儲卷(Persistent Volume)和持久性卷聲明(Persistent Volume Claim)結合使用,確保有狀態應用在 Pod 的重新創建過程中保留數據。每個 Pod 可以綁定到一個獨立的持久性存儲卷,以確保數據的持久性和可靠性。

  4. 有狀態應用的管理:StatefulSet 提供了一些管理有狀態應用的功能。例如,可以使用 rollingUpdate 策略來控制有狀態應用的滾動更新過程,確保更新的穩定性。此外,StatefulSet 還支持有狀態應用的有序刪除,以及與有狀態應用相關的服務發現和 DNS 解析。




一個StatefulSet 的部署例子 - Creation

先編寫1個yaml file:
stateful-nginx-without-pvc.yaml:

---
apiVersion: v1 # api version
kind: Service # type of this resource e.g. Pod/Deployment ..
metadata:name: nginx-stateful-service # name of the servicelabels:app: nginx-stateful-service
spec:ports: - port: 80 # port of the service, used to access the servicename: web-portclusterIP: None # the service is not exposed outside the clusterselector: # label of the Pod that the Service is selectingapp: nginx-stateful # only service selector could skip the matchLabels:
---apiVersion: apps/v1
kind: StatefulSet # it's for a stateful application, it's a controller
metadata:name: nginx-statefulset # name of the statefulsetlabels:app: nginx-stateful
spec: # detail descriptionserviceName: "nginx-stateful-service" # name of the service that used to manange the dns,  # must be the same as the service name defined abovereplicas: 3 # desired replica countselector: # label of the Pod that the StatefulSet is managingmatchLabels:app: nginx-statefultemplate: # Pod templatemetadata:labels:app: nginx-statefulspec:containers:- name: nginx-containerimage: nginx:1.25.4 # image of the containerports: # the ports of the container and they will be exposed- containerPort: 80 # the port used by the container servicename: web-port

上面的yaml 文件創建了兩個資源
1個是statefulset 部署對象
1個是service

但是并沒有pvc data volume 對象, 嚴格上將上面部署的service還是無狀態的, 但是本部分之focus on statefulset 的creation, 先忽略pvc.

置于為何還需要1個service

關鍵就是下面service name 的標簽

  serviceName: "nginx-stateful-service" # name of the service that used to manange the dns,  # must be the same as the service name defined above

serviceName 字段的作用是為 StatefulSet 中的每個 Pod 提供一個穩定的網絡標識符。當 StatefulSet 創建 Pod 時,每個 Pod 都會以其索引號作為后綴,形成一個唯一的 DNS 名稱。這個 DNS 名稱由以下組成:pod-name.service-name.namespace.svc.cluster.local。

通過指定 serviceName 字段,StatefulSet 與服務進行關聯,使得每個 Pod 都能夠使用服務的名稱作為其 DNS 標識符。這樣,每個 Pod 可以通過服務名稱進行網絡通信,而不需要知道其他 Pod 的具體名稱或 IP 地址。




當執行這個配置文件后, 可以見到 pods 是順序創建的, 創建好 pod0 再是 pod1 才是 pod2, 這就是1個和deployment pods創建很大的區別!


[gateman@manjaro-x13 statefulsets]$ kubectl apply -f stateful-nginx-without-pvc.yaml 
service/nginx-stateful-service created
statefulset.apps/nginx-statefulset created
[gateman@manjaro-x13 statefulsets]$ bash show.sh 
+ kubectl get pvc
No resources found in default namespace.
+ kubectl get svc
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
bq-api-service-1         NodePort    10.103.40.130   <none>        32111:30604/TCP   15h
kubernetes               ClusterIP   10.96.0.1       <none>        443/TCP           76d
nginx-stateful-service   ClusterIP   None            <none>        80/TCP            6s
+ kubectl get sts
NAME                READY   AGE
nginx-statefulset   1/3     6s
+ kubectl get pods
NAME                                        READY   STATUS              RESTARTS   AGE
bq-api-service-deployment-978b76fcf-4qcsp   1/1     Running             0          5h20m
bq-api-service-deployment-978b76fcf-7x54w   1/1     Running             0          5h20m
bq-api-service-deployment-978b76fcf-xfxcw   1/1     Running             0          5h20m
nginx-statefulset-0                         1/1     Running             0          7s
nginx-statefulset-1                         0/1     ContainerCreating   0          5s
[gateman@manjaro-x13 statefulsets]$ 
[gateman@manjaro-x13 statefulsets]$ bash show.sh 
+ kubectl get pvc
No resources found in default namespace.
+ kubectl get svc
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
bq-api-service-1         NodePort    10.103.40.130   <none>        32111:30604/TCP   15h
kubernetes               ClusterIP   10.96.0.1       <none>        443/TCP           76d
nginx-stateful-service   ClusterIP   None            <none>        80/TCP            15s
+ kubectl get sts
NAME                READY   AGE
nginx-statefulset   2/3     15s
+ kubectl get pods
NAME                                        READY   STATUS              RESTARTS   AGE
bq-api-service-deployment-978b76fcf-4qcsp   1/1     Running             0          5h20m
bq-api-service-deployment-978b76fcf-7x54w   1/1     Running             0          5h20m
bq-api-service-deployment-978b76fcf-xfxcw   1/1     Running             0          5h20m
nginx-statefulset-0                         1/1     Running             0          16s
nginx-statefulset-1                         1/1     Running             0          14s
nginx-statefulset-2                         0/1     ContainerCreating   0          7s
[gateman@manjaro-x13 statefulsets]$ bash show.sh 
+ kubectl get pvc
No resources found in default namespace.
+ kubectl get svc
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
bq-api-service-1         NodePort    10.103.40.130   <none>        32111:30604/TCP   15h
kubernetes               ClusterIP   10.96.0.1       <none>        443/TCP           76d
nginx-stateful-service   ClusterIP   None            <none>        80/TCP            52s
+ kubectl get sts
NAME                READY   AGE
nginx-statefulset   3/3     52s
+ kubectl get pods
NAME                                        READY   STATUS    RESTARTS   AGE
bq-api-service-deployment-978b76fcf-4qcsp   1/1     Running   0          5h20m
bq-api-service-deployment-978b76fcf-7x54w   1/1     Running   0          5h20m
bq-api-service-deployment-978b76fcf-xfxcw   1/1     Running   0          5h20m
nginx-statefulset-0                         1/1     Running   0          53s
nginx-statefulset-1                         1/1     Running   0          51s
nginx-statefulset-2                         1/1     Running   0          44s

重點, 跟上面的deployments的pod是不同, deployment pods 是無序的, 后面跟的是無意義的字符串, 而statefulset 的pods 是嚴格按照順序創建! POD名字后序是index 數字




測試service

當service 創建之后
默認在 nodes里是無法直接訪問的, 例如

root@k8s-master:~# ping nginx-statefulset-0.nginx-stateful-service
ping: nginx-statefulset-0.nginx-stateful-service: Name or service not known
root@k8s-master:~# ping nginx-statefulset-0.nginx-stateful-service.default.svc.cluster.local
ping: nginx-statefulset-0.nginx-stateful-service.default.svc.cluster.local: Name or service not known

上面提到了, 這個例子中的service 的作用是為pods 提供1個穩定的DNS name
但是無論是
簡寫: $podName.$serviceName
nginx-statefulset-0.nginx-stateful-service

還是全寫:$podName.$serviceName.$nameSpace.svc.cluster.local
nginx-statefulset-0.nginx-stateful-service.default.svc.cluster.local

在k8s-master 中是無法訪問的

原因就是這些DNS 只能在 k8s 的pod內部訪問!

為了測試, 我們臨時創建1個pod with busybox

kubectl run -it --image busybox:1.28 dns-test --restart=Never /bin/sh

注意, busybox 默認是沒安裝bash 和 curl的, 但是有ping 和 nslookup

現在可以ping 通了


/ # ping nginx-statefulset-0.nginx-stateful-service
PING nginx-statefulset-0.nginx-stateful-service (10.244.2.109): 56 data bytes
64 bytes from 10.244.2.109: seq=0 ttl=64 time=14.367 ms
64 bytes from 10.244.2.109: seq=1 ttl=64 time=0.093 ms

nslookup 結果
可見 k8s 容器內 , DNS server 是10.96.0.10 kube-dns.kube-system.svc.cluster.local

它會把nginx-statefulset-0.nginx-stateful-service
解釋為 10.244.2.109 nginx-statefulset-0.nginx-stateful-service.default.svc.cluster.local

而這個10.244.2.109 就是該pod的ip, 并且給了1個DNS 域名 nginx-statefulset-0.nginx-stateful-service.default.svc.cluster.local

/ # nslookup nginx-statefulset-0.nginx-stateful-service
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName:      nginx-statefulset-0.nginx-stateful-service
Address 1: 10.244.2.109 nginx-statefulset-0.nginx-stateful-service.default.svc.cluster.local
/ # nslookup nginx-statefulset-1.nginx-stateful-service
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName:      nginx-statefulset-1.nginx-stateful-service
Address 1: 10.244.3.62 nginx-statefulset-1.nginx-stateful-service.default.svc.cluster.local
/ # nslookup nginx-statefulset-2.nginx-stateful-service
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName:      nginx-statefulset-2.nginx-stateful-service
Address 1: 10.244.1.53 nginx-statefulset-2.nginx-stateful-service.default.svc.cluster.local

在容器內用該域名是可以訪問ngnix服務的

/ # wget http://nginx-statefulset-0.nginx-stateful-service.default.svc.cluster.local
Connecting to nginx-statefulset-0.nginx-stateful-service.default.svc.cluster.local (10.244.2.109:80)
index.html           100% |******************************************************************************************************************************************************************|   615   0:00:00 ETA
/ # cat index.html 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>




StatefulSet 的scale - 擴容和縮容

命令有兩種

kubectl scale statefulset \$statefulsetName --replicas=5
# another method
kubectl patch statefulset statefulsetName -p '{"spec":{"replicas":5}}'

兩種命令都可以用來擴容和縮容

例如:
用第一命令去把 replicas 從3 改成10

[gateman@manjaro-x13 statefulsets]$ kubectl scale statefulset nginx-statefulset --replicas=10
statefulset.apps/nginx-statefulset scaled
[gateman@manjaro-x13 statefulsets]$ 
[gateman@manjaro-x13 statefulsets]$ kubectl describe sts nginx-statefulset
Name:               nginx-statefulset
Namespace:          default
CreationTimestamp:  Sat, 22 Jun 2024 19:48:11 +0800
Selector:           app=nginx-stateful
Labels:             app=nginx-stateful
Annotations:        <none>
Replicas:           10 desired | 9 total
Update Strategy:    RollingUpdatePartition:        0
Pods Status:        9 Running / 1 Waiting / 0 Succeeded / 0 Failed
Pod Template:Labels:  app=nginx-statefulContainers:nginx-container:Image:         nginx:1.25.4Port:          80/TCPHost Port:     0/TCPEnvironment:   <none>Mounts:        <none>Volumes:         <none>Node-Selectors:  <none>Tolerations:     <none>
Volume Claims:     <none>
Events:Type    Reason            Age                From                    Message----    ------            ----               ----                    -------Normal  SuccessfulCreate  36s (x2 over 98s)  statefulset-controller  create Pod nginx-statefulset-3 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  35s (x2 over 97s)  statefulset-controller  create Pod nginx-statefulset-4 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  34s                statefulset-controller  create Pod nginx-statefulset-5 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  32s                statefulset-controller  create Pod nginx-statefulset-6 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  31s                statefulset-controller  create Pod nginx-statefulset-7 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  29s                statefulset-controller  create Pod nginx-statefulset-8 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  28s                statefulset-controller  create Pod nginx-statefulset-9 in StatefulSet nginx-statefulset successful

通過describe 命令 可以見 當前運行的副本的確變成10 (9 running 還有1個正在創建)
而且pods 的創建是按順序執行的




StatefulSet 的rollingUpdate 滾動更新

跟deployment 一樣, 一樣可以用set image 來執行

[gateman@manjaro-x13 bq-api-service]$ kubectl set image statefulset/nginx-statefulset nginx-container=nginx:1.26.1
statefulset.apps/nginx-statefulset image updated

從describe 信息來看, rolling update 也是按照pod的順序來執行的

Events:Type    Reason            Age                From                    Message----    ------            ----               ----                    -------Normal  SuccessfulCreate  13m (x2 over 23m)  statefulset-controller  create Pod nginx-statefulset-9 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  13m (x2 over 23m)  statefulset-controller  create Pod nginx-statefulset-8 in StatefulSet nginx-statefulset successfulNormal  SuccessfulDelete  13m                statefulset-controller  delete Pod nginx-statefulset-7 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  13m (x2 over 23m)  statefulset-controller  create Pod nginx-statefulset-7 in StatefulSet nginx-statefulset successfulNormal  SuccessfulDelete  12m                statefulset-controller  delete Pod nginx-statefulset-6 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  12m (x2 over 23m)  statefulset-controller  create Pod nginx-statefulset-6 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  12m (x2 over 24m)  statefulset-controller  create Pod nginx-statefulset-5 in StatefulSet nginx-statefulset successfulNormal  SuccessfulDelete  12m                statefulset-controller  delete Pod nginx-statefulset-5 in StatefulSet nginx-statefulset successfulNormal  SuccessfulDelete  12m (x2 over 24m)  statefulset-controller  delete Pod nginx-statefulset-4 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  12m (x3 over 25m)  statefulset-controller  create Pod nginx-statefulset-4 in StatefulSet nginx-statefulset successfulNormal  SuccessfulDelete  12m (x2 over 24m)  statefulset-controller  delete Pod nginx-statefulset-3 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  12m (x3 over 25m)  statefulset-controller  create Pod nginx-statefulset-3 in StatefulSet nginx-statefulset successfulNormal  SuccessfulDelete  12m                statefulset-controller  delete Pod nginx-statefulset-2 in StatefulSet nginx-statefulset successfulNormal  SuccessfulCreate  12m (x2 over 3h)   statefulset-controller  create Pod nginx-statefulset-2 in StatefulSet nginx-statefulset successful

一樣可以用kubectl annotate 命令去提供change cause

[gateman@manjaro-x13 bq-api-service]$ kubectl annotate statefulset/nginx-statefulset kubernetes.io/change-cause="downgraded to 1.26.1"
statefulset.apps/nginx-statefulset annotated

但是很可惜, 跟deployment 不一樣, 不能在revision list 里顯示 change cause的annotation

[gateman@manjaro-x13 bq-api-service]$ kubectl rollout history statefulset/nginx-statefulset 
statefulset.apps/nginx-statefulset 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

而且跟deployment 不同
statefulset的 revision 沒有 replicasets 的對應

[gateman@manjaro-x13 statefulsets]$ kubectl get rs -o wide
NAME                                   DESIRED   CURRENT   READY   AGE   CONTAINERS                 IMAGES                                                                       SELECTOR
bq-api-service-deployment-6f6ffc7866   0         0         0       18h   bq-api-service-container   europe-west2-docker.pkg.dev/jason-hsbc/my-docker-repo/bq-api-service:1.1.7   app=bq-api-service,pod-template-hash=6f6ffc7866
bq-api-service-deployment-978b76fcf    3         3         3       8h    bq-api-service-container   europe-west2-docker.pkg.dev/jason-hsbc/my-docker-repo/bq-api-service:1.1.8   app=bq-api-service,pod-template-hash=978b76fcf
bq-api-service-deployment-c4979b697    0         0         0       18h   bq-api-service-container   europe-west2-docker.pkg.dev/jason-hsbc/my-docker-repo/bq-api-service:1.1.6   app=bq-api-service,pod-template-hash=c4979b697

只有deployment的record

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

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

相關文章

Websocket在Java中的實踐——握手攔截器

在《Websocket在Java中的實踐——最小可行案例》一文中&#xff0c;我們看到如何用最簡單的方式實現Websocket通信。本文中&#xff0c;我們將介紹如何在握手前后進行干涉&#xff0c;以定制一些特殊需求。 在《Websocket在Java中的實踐——最小可行案例》的基礎上&#xff0c;…

PID原理及控制算法詳解

文章目錄 1. 概念 1.1 PID框圖 1.2 具體示例&#xff1a;無人機高度控制 2. PID原理 3. 常用術語 4. 計算過程 4.1 比例控制&#xff08;Proportional&#xff09; 4.2 積分控制&#xff08;Integral&#xff09; 4.3 微分控制&#xff08;Derivative&#xff09; 5.…

windows@文件高級共享設置@網絡發現功能@從資源管理器網絡中訪問遠程桌面

文章目錄 高級共享設置常用選項其他選項操作界面說明 網絡類型檢查和設置(專用網絡和公用網絡)&#x1f47a;Note 高級共享設置和防火墻&#x1f47a;命令行方式使用圖形界面方式配置 網絡發現網絡發現功能的詳細介紹網絡發現的作用&#x1f47a;網絡發現的工作原理啟用和配置網…

SOC和SOH聯合估計 | 基于集成ELM的鋰離子電池充電截止電壓下的SOC和SOH聯合估計

目錄 研究概述研究內容研究路線研究介紹研究概述 充電截止電壓是大多數電動汽車用戶充電都會經歷的電壓點。針對傳統安時積分法忽略初始容量誤差和電池老化等一系列待優化的問題,提出了雙層集成極限學習機(extreme learning machine, ELM)算法,實現鋰離子電池充電截止電壓下…

【Python實戰因果推斷】2_因果效應異質性2

目錄 CATE with Regression Evaluating CATE Predictions CATE with Regression 我想你可能已經預料到了&#xff1a;與應用因果推理中的大多數情況一樣&#xff0c;答案往往從線性回歸開始。但在走這條路之前&#xff0c;讓我們把事情變得更具體一些。假設你在一家遍布全國的…

[A133]uboot啟動流程

[A133]uboot啟動流程 hongxi.zhu 2024-6-21 1. 第一階段 lds描述 從u-boot.lds中能找到程序的匯編入口ENTRY(_start) brandy/brandy-2.0/u-boot-2018/u-boot.lds OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUT…

Spring Boot中的異步編程技巧

Spring Boot中的異步編程技巧 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討在Spring Boot應用程序中如何使用異步編程技巧&#xff0c;以提升性…

LeetCode題練習與總結:單詞拆分--139

一、題目描述 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。如果可以利用字典中出現的一個或多個單詞拼接出 s 則返回 true。 注意&#xff1a;不要求字典中出現的單詞全部都使用&#xff0c;并且字典中的單詞可以重復使用。 示例 1&#xff1a; 輸入: s "l…

vant組件 頂部下拉刷新和頁面底部下拉獲取數據+頂部搜索框

1.html部分&#xff08;頂部tab切換無&#xff0c;只有主體list部分&#xff09; <div class"yd" ><!-- yd端 --><!-- 搜索框 --><van-searchv-model"ydsearchvalue"show-actionplaceholder"請輸入搜索關鍵詞"search"…

JavaEE之HTTP協議(1)_HTTP基礎知識,HTTP 請求、響應格式,方法,狀態碼

一、HTTP協議 1.1 基本概念: HTTP全稱超文本傳輸協議&#xff0c;是一種無狀態的、應用層的協議&#xff0c;它基于請求/響應模型。客戶端&#xff08;通常是Web瀏覽器&#xff09;通過發送HTTP請求到服務器來獲取或發送信息&#xff0c;服務器則返回HTTP響應作為回應。HTTP協…

shell (三)shell腳本

SHELL腳本 編程語言的分類 解釋型語言&#xff1a;shell&#xff0c;Python&#xff0c;需要解析器 編譯型語言&#xff1a;C語言&#xff0c;C&#xff0c;需要編譯器 shell腳本 操作系統的結構 shell&#xff08;貝殼&#xff09; 應用層 app&#xff0c;代碼 應用層需要通…

2024年軟件測試面試題大全【答案+文檔】

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 一、面試基礎題 簡述測試流程&#xff1a; 1、閱讀相關技術文檔&#xff08;如產品PRD、UI設計…

1、線性回歸模型

1、主要解決問題類型 1.1 預測分析(Prediction) 線性回歸可以用來預測一個變量(通常稱為因變量或響應變量)的值,基于一個或多個輸入變量(自變量或預測變量)。例如,根據房屋的面積、位置等因素預測房價。 1.2 異常檢測(Outlier Detection) 線性回歸可以幫助識別數…

鴻蒙開發系統基礎能力:【@ohos.systemTime (設置系統時間)】

設置系統時間 本模塊用來設置、獲取當前系統時間&#xff0c;設置、獲取當前系統日期和設置、獲取當前系統時區。 說明&#xff1a; 本模塊首批接口從API version 7開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 導入模塊 import systemTime …

沙盒在數據防泄密領域意義

在信息化快速發展的今天&#xff0c;數據已成為企業最寶貴的資產之一。然而&#xff0c;數據泄密事件頻發&#xff0c;給企業的安全和發展帶來了巨大威脅。SDC沙盒防泄密系統&#xff0c;作為一種創新的數據防泄密解決方案&#xff0c;正逐漸在數據防泄密領域發揮著越來越重要的…

理解和使用JavaScript的閉包

閉包 在前端開發中&#xff0c;JavaScript是一種非常重要的編程語言。它的靈活性和強大功能使得開發者可以創建豐富的用戶體驗。然而&#xff0c;JavaScript中有些概念對于初學者來說可能比較難以理解&#xff0c;閉包就是其中之一。本文將深入探討JavaScript中的閉包&#xf…

安裝zabbix時報錯Could not resolve host: mirrors.huaweicloud.com;Unknown error解決辦法

目錄 1、問題原因 2、解決辦法 3、知識拓展 DNS的區別 DNS配置文件解析 域名解析過程 4、書籍推薦 當安裝Zabbix server&#xff0c;Web前端&#xff0c;agent時出現&#xff1a; [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安裝過程中會出…

Python3極簡教程(一小時學完)上

開始 Python 之旅 本教程基于 Python for you and me 教程翻譯制作&#xff0c;其中參考了 Python tutorial 和 _The Python Standard Library_&#xff0c;并對原教程的內容進行了改進與補充。 相關鏈接地址如下&#xff1a; _Python tutorial_&#xff1a;Python 入門指南…

數字孿生流域:定義、組成等

數字孿生流域&#xff1a;定義、組成等 1 數字孿生流域&#xff08;Digital Twin Basin/Watershed&#xff09;總則1.1 定義1.2 適用范圍1.3 建設目標1.4 建設原則 2 數字孿生流域框架與組成2.1 數字孿生流域框架2.2 數字孿生流域組成2.2.1 數字孿生平臺2.2.2 信息化基礎設施 3…

類的裝飾器

1 使用類定義裝飾器 class Person(object):def __init__(self):self._age 0propertydef age(self):return self._ageage.setterdef age(self,newValue):print(觸發了嗎)self._age newValuep Person() print(p.age) # 0 p.age 20 print(p.age) # 20 2 類屬性 class Pe…