最牛逼的集群監控系統,它始終位列第一。。

来源:https://www.cnblogs.com/javastack/archive/2022/06/06/16348249.html
-Advertisement-
Play Games

在本文中,我們將看到Prometheus監控技術棧的局限性,以及為什麼移動到基於Thanos的技術棧可以提高指標留存率並降低總體基礎設施成本。 用於此演示的內容可以在下麵鏈接中獲取,並提交到他們各自的許可證。 https://github.com/particuleio/teks/tree/main ...


在本文中,我們將看到Prometheus監控技術棧的局限性,以及為什麼移動到基於Thanos的技術棧可以提高指標留存率並降低總體基礎設施成本。

用於此演示的內容可以在下麵鏈接中獲取,並提交到他們各自的許可證。

Kubernetes普羅米修斯技術棧

在為我們的客戶部署Kubernetes基礎設施時,在每個集群上部署監控技術棧是標準做法。這個堆棧通常由幾個組件組成:

  • Prometheus:收集度量標準
  • 告警管理器:根據指標查詢向各種提供者發送警報
  • Grafana:可視化豪華儀錶板

簡化架構如下:

註意事項

這種架構有一些註意事項,當你想從其中獲取指標的集群數量增加時,它的伸縮性以及可擴展性不太好。

多個Grafana

在這種設置中,每個集群都有自己的Grafana和自己的一組儀錶板,維護起來很麻煩。

存儲指標數據是昂貴的

Prometheus將指標數據存儲在磁碟上,你必須在存儲空間和指標保留時間之間做出選擇。如果你想長時間存儲數據併在雲提供商上運行,那麼如果存儲TB的數據,塊存儲的成本可能會很高。同樣,在生產環境中,Prometheus經常使用複製或分片或兩者同時運行,這可能會使存儲需求增加兩倍甚至四倍。

解決方案

多個Grafana數據源

可以在外部網路上公開Prometheus的端點,並將它們作為數據源添加到單個Grafana中。你只需要在Prometheus外部端點上使用TLS或TLS和基本認證來實現安全性。此解決方案的缺點是不能基於不同的數據源進行計算。

Prometheus聯邦

Prometheus聯邦允許從Prometheus中抓取Prometheus,當你不抓取很多指標數據時,這個解決方案可以很好地工作。在規模上,如果你所有的Prometheus目標的抓取持續時間都比抓取間隔長,可能會遇到一些嚴重的問題。

Prometheus遠程寫

雖然遠程寫入是一種解決方案(也由Thanos receiver實現),但我們將不在本文中討論“推送指標”部分。你可以在這裡[1]閱讀關於推送指標的利弊。建議在不信任多個集群或租戶的情況下(例如在將Prometheus構建為服務提供時),將指標作為最後的手段。無論如何,這可能是以後文章的主題,但我們將在這裡集中討論抓取。

Thanos,它來了

Thanos是一個“開源的,高可用的Prometheus系統,具有長期存儲能力”。很多知名公司都在使用Thanos,也是CNCF孵化項目的一部分。

Thanos的一個主要特點就是允許“無限”存儲空間。通過使用對象存儲(比如S3),幾乎每個雲提供商都提供對象存儲。如果在前提環境下運行,對象存儲可以通過rook或minio這樣的解決方案提供。

它是如何工作的?

Thanos和Prometheus並肩作戰,從Prometheus開始升級到Thanos是很常見的。

Thanos被分成幾個組件,每個組件都有一個目標(每個服務都應該這樣:)),組件之間通過gRPC進行通信。

Thanos Sidecar

Thanos和Prometheus一起運行(有一個邊車),每2小時向一個對象存儲庫輸出Prometheus指標。這使得Prometheus幾乎是無狀態的。Prometheus仍然在記憶體中保存著2個小時的度量值,所以在發生宕機的情況下,你可能仍然會丟失2個小時的度量值(這個問題應該由你的Prometheus設置來處理,使用HA/分片,而不是Thanos)。

Thanos sidecar與Prometheus運營者和Kube Prometheus棧一起,可以輕鬆部署。這個組件充當Thanos查詢的存儲。

Thanos存儲

Thanos存儲充當一個網關,將查詢轉換為遠程對象存儲。它還可以在本地存儲上緩存一些信息。基本上,這個組件允許你查詢對象存儲以獲取指標。這個組件充當Thanos查詢的存儲。

Thanos Compactor

Thanos Compactor是一個單例(它是不可擴展的),它負責壓縮和降低存儲在對象存儲中的指標。下採樣是隨著時間的推移對指標粒度的寬鬆。例如,你可能想將你的指標保持2年或3年,但你不需要像昨天的指標那麼多數據點。這就是壓縮器的作用,它可以在對象存儲上節省位元組,從而節省成本。

Thanos Query

Thanos查詢是Thanos的主要組件,它是向其發送PromQL查詢的中心點。Thanos查詢暴露了一個與Prometheus相容的端點。然後它將查詢分派給所有的“stores”。記住,Store可能是任何其他提供指標的Thanos組件。Thanos查詢可以發送查詢到另一個Thanos查詢(他們可以堆疊)。

  • Thanos Store
  • Thanos Sidecar
  • Thanos Query

還負責對來自不同Store或Prometheus的相同指標進行重覆數據刪除。例如,如果你有一個度量值在Prometheus中,同時也在對象存儲中,Thanos Query可以對該指標值進行重覆數據刪除。在Prometheus HA設置的情況下,重覆數據刪除也基於Prometheus副本和分片。

Thanos Query Frontend

正如它的名字所暗示的,Thanos查詢前端是Thanos查詢的前端,它的目標是將大型查詢拆分為多個較小的查詢,並緩存查詢結果(在記憶體或memcached中)。

還有其他組件,比如在遠程寫的情況下接收Thanos,但這仍然不是本文的主題。

多集群架構

有多種方法可以將這些組件部署到多個Kubernetes集群中,根據用例的不同,有些方法比其他方法更好,在這裡我們不能給出詳細的介紹。

我們的例子是在AWS上運行,使用tEKS[2]部署了2個集群,我們的all in one解決方案將生產就緒的EKS集群部署在AWS上:

  • 一個觀察者集群[3]
  • 一個被觀察集群[4]

我們的部署使用了官方的kube-prometheus-stack和bitnami thanos圖表。

一切都是在我們的terraform-kubernetes-addons存儲庫中策劃的。

Thanos demo文件夾中的目錄結構如下:

.
├──  env_tags.yaml
├──  eu-west-1
│  ├──  clusters
│  │  └──  observer
│  │     ├──  eks
│  │     │  ├──  kubeconfig
│  │     │  └──  terragrunt.hcl
│  │     ├──  eks-addons
│  │     │  └──  terragrunt.hcl
│  │     └──  vpc
│  │        └──  terragrunt.hcl
│  └──  region_values.yaml
└──  eu-west-3
   ├──  clusters
   │  └──  observee
   │     ├──  cluster_values.yaml
   │     ├──  eks
   │     │  ├──  kubeconfig
   │     │  └──  terragrunt.hcl
   │     ├──  eks-addons
   │     │  └──  terragrunt.hcl
   │     └──  vpc
   │        └──  terragrunt.hcl
   └──  region_values.yaml

這允許DRY(Don 't Repeat Yourself)基礎設施,並可以輕鬆地擴展AWS帳戶、區域和集群的數量。

觀察者集群

觀察者集群是我們的主集群,我們將從它查詢其他集群:

Prometheus正在運行:

  • Grafana啟用
  • Thanos邊車上傳到特定的桶
kube-prometheus-stack = {
  enabled                     = true
  allowed_cidrs               = dependency.vpc.outputs.private_subnets_cidr_blocks
  thanos_sidecar_enabled      = true
  thanos_bucket_force_destroy = true
  extra_values                = <<-EXTRA_VALUES
    grafana:
      deploymentStrategy:
        type: Recreate
      ingress:
        enabled: true
        annotations:
          kubernetes.io/ingress.class: nginx
          cert-manager.io/cluster-issuer: "letsencrypt"
        hosts:
          - grafana.${local.default_domain_suffix}
        tls:
          - secretName: grafana.${local.default_domain_suffix}
            hosts:
              - grafana.${local.default_domain_suffix}
      persistence:
        enabled: true
        storageClassName: ebs-sc
        accessModes:
          - ReadWriteOnce
        size: 1Gi
    prometheus:
      prometheusSpec:
        replicas: 1
        retention: 2d
        retentionSize: "10GB"
        ruleSelectorNilUsesHelmValues: false
        serviceMonitorSelectorNilUsesHelmValues: false
        podMonitorSelectorNilUsesHelmValues: false
        storageSpec:
          volumeClaimTemplate:
            spec:
              storageClassName: ebs-sc
              accessModes: ["ReadWriteOnce"]
              resources:
                requests:
                  storage: 10Gi
    EXTRA_VALUES

為觀察者集群生成一個CA證書:

  • 這個CA將被進入sidecar的被觀察集群所信任
  • 為Thanos querier組件生成TLS證書,這些組件將查詢被觀察集群

Thanos組件部署:

  • Thanos組件全部部署完成
  • 查詢前端,作為Grafana的數據源端點
  • 存儲網關用於查詢觀察者桶
  • Query將對存儲網關和其他查詢器執行查詢

部署的額外Thanos組件:

  • 配置了TLS的Thanos查詢器對每個被觀察集群進行查詢
thanos-tls-querier = {
  "observee" = {
    enabled                 = true
    default_global_requests = true
    default_global_limits   = false
    stores = [
      "thanos-sidecar.${local.default_domain_suffix}:443"
    ]
  }
}

thanos-storegateway = {
  "observee" = {
    enabled                 = true
    default_global_requests = true
    default_global_limits   = false
    bucket                  = "thanos-store-pio-thanos-observee"
    region                  = "eu-west-3"
  }

被觀測集群

被觀測集群是Kubernetes集群,具有最小的Prometheus/Thanos安裝,將被觀測集群查詢。

推薦一個 Spring Boot 基礎教程及實戰示例:
https://github.com/javastacks/spring-boot-best-practice

Prometheus operator正在運行:

  • Thanos這邊就是上傳給觀察者特定的桶
  • Thanos邊車與TLS客戶端認證的入口對象一起發佈,並信任觀察者集群CA
kube-prometheus-stack = {
  enabled                     = true
  allowed_cidrs               = dependency.vpc.outputs.private_subnets_cidr_blocks
  thanos_sidecar_enabled      = true
  thanos_bucket_force_destroy = true
  extra_values                = <<-EXTRA_VALUES
    grafana:
      enabled: false
    prometheus:
      thanosIngress:
        enabled: true
        ingressClassName: nginx
        annotations:
          cert-manager.io/cluster-issuer: "letsencrypt"
          nginx.ingress.kubernetes.io/ssl-redirect: "true"
          nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
          nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
          nginx.ingress.kubernetes.io/auth-tls-secret: "monitoring/thanos-ca"
        hosts:
        - thanos-sidecar.${local.default_domain_suffix}
        paths:
        - /
        tls:
        - secretName: thanos-sidecar.${local.default_domain_suffix}
          hosts:
          - thanos-sidecar.${local.default_domain_suffix}
      prometheusSpec:
        replicas: 1
        retention: 2d
        retentionSize: "6GB"
        ruleSelectorNilUsesHelmValues: false
        serviceMonitorSelectorNilUsesHelmValues: false
        podMonitorSelectorNilUsesHelmValues: false
        storageSpec:
          volumeClaimTemplate:
            spec:
              storageClassName: ebs-sc
              accessModes: ["ReadWriteOnce"]
              resources:
                requests:
                  storage: 10Gi
    EXTRA_VALUES

Thanos組件部署:

  • Thanos壓縮器來管理這個特定集群的下採樣
thanos = {
  enabled = true
  bucket_force_destroy = true
  trusted_ca_content      = dependency.thanos-ca.outputs.thanos_ca
  extra_values = <<-EXTRA_VALUES
    compactor:
      retentionResolution5m: 90d
    query:
      enabled: false
    queryFrontend:
      enabled: false
    storegateway:
      enabled: false
    EXTRA_VALUES
}

再深入一點

讓我們檢查一下集群上正在運行什麼。關於觀察員,我們有:

kubectl -n monitoring get pods
NAME                                                        READY   STATUS    RESTARTS   AGE
alertmanager-kube-prometheus-stack-alertmanager-0           2/2     Running   0          120m
kube-prometheus-stack-grafana-c8768466b-rd8wm               2/2     Running   0          120m
kube-prometheus-stack-kube-state-metrics-5cf575d8f8-x59rd   1/1     Running   0          120m
kube-prometheus-stack-operator-6856b9bb58-hdrb2             1/1     Running   0          119m
kube-prometheus-stack-prometheus-node-exporter-8hvmv        1/1     Running   0          117m
kube-prometheus-stack-prometheus-node-exporter-cwlfd        1/1     Running   0          120m
kube-prometheus-stack-prometheus-node-exporter-rsss5        1/1     Running   0          120m
kube-prometheus-stack-prometheus-node-exporter-rzgr9        1/1     Running   0          120m
prometheus-kube-prometheus-stack-prometheus-0               3/3     Running   1          120m
thanos-compactor-74784bd59d-vmvps                           1/1     Running   0          119m
thanos-query-7c74db546c-d7bp8                               1/1     Running   0          12m
thanos-query-7c74db546c-ndnx2                               1/1     Running   0          12m
thanos-query-frontend-5cbcb65b57-5sx8z                      1/1     Running   0          119m
thanos-query-frontend-5cbcb65b57-qjhxg                      1/1     Running   0          119m
thanos-storegateway-0                                       1/1     Running   0          119m
thanos-storegateway-1                                       1/1     Running   0          118m
thanos-storegateway-observee-storegateway-0                 1/1     Running   0          12m
thanos-storegateway-observee-storegateway-1                 1/1     Running   0          11m
thanos-tls-querier-observee-query-dfb9f79f9-4str8           1/1     Running   0          29m
thanos-tls-querier-observee-query-dfb9f79f9-xsq24           1/1     Running   0          29m

kubectl -n monitoring get ingress
NAME                            CLASS    HOSTS                                            ADDRESS                                                                         PORTS     AGE
kube-prometheus-stack-grafana   <none>   grafana.thanos.teks-tg.clusterfrak-dynamics.io   k8s-ingressn-ingressn-afa0a48374-f507283b6cd101c5.elb.eu-west-1.amazonaws.com   80, 443   123m

被觀察者:

kubectl -n monitoring get pods
NAME                                                        READY   STATUS    RESTARTS   AGE
alertmanager-kube-prometheus-stack-alertmanager-0           2/2     Running   0          39m
kube-prometheus-stack-kube-state-metrics-5cf575d8f8-ct292   1/1     Running   0          39m
kube-prometheus-stack-operator-6856b9bb58-4cngc             1/1     Running   0          39m
kube-prometheus-stack-prometheus-node-exporter-bs4wp        1/1     Running   0          39m
kube-prometheus-stack-prometheus-node-exporter-c57ss        1/1     Running   0          39m
kube-prometheus-stack-prometheus-node-exporter-cp5ch        1/1     Running   0          39m
kube-prometheus-stack-prometheus-node-exporter-tnqvq        1/1     Running   0          39m
kube-prometheus-stack-prometheus-node-exporter-z2p49        1/1     Running   0          39m
kube-prometheus-stack-prometheus-node-exporter-zzqp7        1/1     Running   0          39m
prometheus-kube-prometheus-stack-prometheus-0               3/3     Running   1          39m
thanos-compactor-7576dcbcfc-6pd4v                           1/1     Running   0          38m

kubectl -n monitoring get ingress
NAME                                   CLASS   HOSTS                                                   ADDRESS                                                                         PORTS     AGE
kube-prometheus-stack-thanos-gateway   nginx   thanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.io   k8s-ingressn-ingressn-95903f6102-d2ce9013ac068b9e.elb.eu-west-3.amazonaws.com   80, 443   40m

我們的TLS查詢器應該能夠查詢被觀測集群的度量標準。讓我們來看看它們的行為:

k -n monitoring logs -f thanos-tls-querier-observee-query-687dd88ff5-nzpdh

level=info ts=2021-02-23T15:37:35.692346206Z caller=storeset.go:387 component=storeset msg="adding new storeAPI to query storeset" address=thanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.io:443 extLset="{cluster=\"pio-thanos-observee\", prometheus=\"monitoring/kube-prometheus-stack-prometheus\", prometheus_replica=\"prometheus-kube-prometheus-stack-prometheus-0\"}"

所以這個查詢器pods可以查詢我的其他集群,如果我們檢查Web,我們可以看到存儲:

kubectl -n monitoring port-forward thanos-tls-querier-observee-query-687dd88ff5-nzpdh 10902

太棒了,但是我只有一個存儲,還記得我們說過查詢器可以堆疊在一起嗎?在我們的觀察者集群中,我們有標準的http查詢器,它可以查詢架構圖中的其他組件。

kubectl -n monitoring port-forward thanos-query-7c74db546c-d7bp8 10902

這裡我們可以看到所有的存儲已經被添加到我們的中心查詢器:

  • 觀察者把本地Thanos聚集
  • 我們的存儲網關(一個用於遠程觀測者集群,一個用於本地觀測者集群)
  • 本地TLS查詢器,它可以查詢被觀察的sidecar

在Grafana可視化

最後,我們可以前往Grafana,看看預設的Kubernetes儀錶板是如何與多集群相容的。

總結

Thanos是一個非常複雜的系統,有很多移動部件,我們沒有深入研究具體的自定義配置,因為它會花費太多的時間。

我們在tEKS存儲庫中提供了一個相當完整的AWS實現,它抽象了很多複雜性(主要是mTLS部分),並允許進行很多定製。你也可以使用terraform-kubernetes-addons模塊作為獨立的組件。我們計劃在未來支持其他雲提供商。不要猶豫,通過Github上的任何一個項目的問題聯繫我們。

根據你的基礎設施和需求,有許多可能適合你的Thanos實現。

如果你想深入研究Thanos,可以查看他們的官方kube-thanos存儲庫,以及他們關於跨集群通信的建議[5]。

作者:Kevin Lefevre, CTO & 聯合創始人
原文:particule.io/en/blog/thanos-monitoring/
翻譯:劉志超 來源:weekly.dockone.io/article/2432427

相關鏈接:

  1. https://docs.google.com/document/d/1H47v7WfyKkSLMrR8_iku6u9VB73WrVzBHb2SB6dL9_g/edit#heading=h.2v27snv0lsur
  2. https://github.com/particuleio/teks
  3. https://github.com/particuleio/teks/tree/main/terragrunt/live/thanos/eu-west-1/clusters/observer
  4. https://github.com/particuleio/teks/tree/main/terragrunt/live/thanos/eu-west-3/clusters/observee
  5. https://thanos.io/tip/operating/cross-cluster-tls-communication.md/

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • Spring Ioc源碼分析系列--實例化Bean的幾種方法 前言 前面的文章Spring Ioc源碼分析系列--Bean實例化過程(二)在講解到bean真正通過那些方式實例化出來的時候,並沒有繼續分析了,而是留到了這裡去分析,主要是因為獲取獲取構造函數,推斷構造函數也是一個比較複雜的操作,就想另起 ...
  • 主線程與守護線程 預設情況下,Java 進程需要等待所有線程都運行結束,才會結束。有一種特殊的線程叫做守護線程,只要其它非守護線程運行結束了,即使守護線程的代碼沒有執行完,也會強制結束。 package Daemon; import lombok.extern.slf4j.Slf4j; @Slf4j ...
  • 1 與其它協程庫使用對比 這個 C 協程庫是雲風(cloudwu) 寫的,其介面風格與 Lua 協程類似,並且都是非對稱 stackful 協程。這個是源代碼中的示例: #include "coroutine.h" #include <stdio.h> struct args { int n; }; ...
  • 在理解裝飾器的概念前,我們首先看一下function和inner function在python中的含義。 function與inner function function:在python中,function就像其他對象一樣,可以當做參數或返回值。 inner function:一個函數A(inne ...
  • 能夠實現Nacos安裝 基於Nacos能實現應用負載均衡 能基於Nacos實現配置管理 配置管理 負載均衡 多環境切換 配置共用 配置刷新 灰度發佈 掌握Nacos集群部署 1 Nacos安裝 Nacos是Alibaba微服務生態組件中的重要組件之一,主要用它實現應用的動態服務發現、配置管理、服務管 ...
  • 一、說明 return一直中,每中語言中其沒沒有很大差別,就不多說了。(shell語言return的是退出狀態,可能差別是比較大的) 最早看到yield應該是哪們語言用來調整什麼線程優先順序的,記不清了,不過那裡的yield和python中的yield應該功能有區別。 python中最早看到yield ...
  • Lucene、solr以及elasticsearch之間的區別和聯繫 lucene,就是一個jar包,裡面包含了封裝好的各種建立倒排索引、以及進行搜索的代碼,包括各種演算法。我們就用java開發的時候,引入lucene jar,然後基於lucene的api去進行開發就可以了。solr和elastics ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...