<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用 Zadig 交付云原生微服務(wù)應(yīng)用

          共 11513字,需瀏覽 24分鐘

           ·

          2022-07-22 15:41

          前面我們介紹了使用 Zadig 交付一個(gè)非常簡單的應(yīng)用示例,接下來我們來介紹下微服務(wù)項(xiàng)目如何在 Zadig 下進(jìn)行交付。

          微服務(wù)示例

          我們這里使用到開源項(xiàng)目是 https://github.com/GoogleCloudPlatform/microservices-demo,該開源項(xiàng)目名叫 Online Boutique(https://onlineboutique.dev/),是一個(gè)云原生微服務(wù)演示應(yīng)用程序,其中包含 11 個(gè)微服務(wù),該應(yīng)用程序是一個(gè)基于 Web 的電子商務(wù)應(yīng)用程序,用戶可以在其中瀏覽商品、將它們添加到購物車并購買它們。

          基于該項(xiàng)目針對 Zadig 做了優(yōu)化修改,項(xiàng)目地址:https://github.com/cnych/microservices-demo

          該項(xiàng)目由 11 個(gè)使用不同語言編寫的微服務(wù)組成,它們通過 gRPC 相互通信。架構(gòu)如下所示。

          微服務(wù)架構(gòu)

          每個(gè)服務(wù)的功能描述如下表所示。

          服務(wù)功能

          Zadig 項(xiàng)目

          接下來我們來使用 Zadig 來交付該微服務(wù)項(xiàng)目,使用方式和前面基本類似。

          首先新建一個(gè)名為 microservices-demo 的項(xiàng)目,項(xiàng)目類型為 K8s YAML 項(xiàng)目

          新建項(xiàng)目

          點(diǎn)擊立即新建按鈕,然后進(jìn)入項(xiàng)目初始化頁面。

          項(xiàng)目初始化

          點(diǎn)擊下一步進(jìn)入到服務(wù)配置頁面,我們知道服務(wù)模板可以通過手動(dòng)創(chuàng)建、代碼倉庫中同步或者現(xiàn)有 K8s 資源中導(dǎo)入而來。我們這里服務(wù)模板在代碼倉庫中,所以選擇從代碼庫中進(jìn)行同步,選擇對應(yīng)的代碼倉庫、分支和對應(yīng)的資源清單目錄,然后點(diǎn)擊同步按鈕即可將對應(yīng)的服務(wù)同步到 Zadig 中來。

          同步服務(wù)

          可以看到我們這里同步過來后包含了 12 個(gè)服務(wù),每個(gè)服務(wù)的模板也都直接展示出來了,但是由于是通過倉庫同步的,模板是只讀模式,右側(cè)會(huì)自動(dòng)讀取到服務(wù)對應(yīng)的鏡像信息。

          注意:Zadig 讀取資源清單后,會(huì)以 K8s YAML 中的容器名作為唯一的 key 進(jìn)行去重,所以在編寫 K8s YAML 的時(shí)候不要讓容器名重復(fù),否則導(dǎo)入后會(huì)丟失服務(wù)。

          服務(wù)模板

          點(diǎn)擊右側(cè)讀取到的鏡像服務(wù)組件后面的添加構(gòu)建按鈕,前往配置該服務(wù)的鏡像是如何進(jìn)行構(gòu)建的。

          首先需要添加服務(wù)代碼源信息,我們這里的代碼在 GitLab 上面,所以添加對應(yīng)的代碼倉庫以及分支信息。我們這里的所有服務(wù)代碼都位于代碼倉庫根目錄下面的 src 目錄下。

          代碼結(jié)構(gòu)

          這屬于典型的 Monorepo 類型的倉庫(單體),而里面的每個(gè)服務(wù)我們也并未配置成 submodule,所以每個(gè)服務(wù)構(gòu)建的時(shí)候均要將整個(gè)代碼倉庫 Clone 下來,但其實(shí)我們只需要其中的一個(gè)服務(wù)即可,Git 是支持這種操作的,比如我們現(xiàn)在只想要獲取 adservice 這個(gè)服務(wù)的數(shù)據(jù),可以通過下面的方式來獲取。

          $ mkdir microservices-demo && cd microservices-demo
          $ git init
          $ git remote add origin [email protected]:course/microservices-demo.git
          $ git config core.sparsecheckout true
          $ git sparse-checkout set "src/adservice"
          $ git pull --depth 1 origin main
          remote: Enumerating objects: 307, done.
          remote: Counting objects: 100% (307/307), done.
          remote: Compressing objects: 100% (234/234), done.
          remote: Total 307 (delta 72), reused 185 (delta 39), pack-reused 0
          Receiving objects: 100% (307/307), 9.55 MiB | 5.28 MiB/s, done.
          Resolving deltas: 100% (72/72), done.
          From git.k8s.local:course/microservices-demo
           * branch            main       -> FETCH_HEAD
           * [new branch]      main       -> origin/main
          $ ls -la src
          total 0
          drwxr-xr-x   3 cnych  staff   96 Jul 15 14:10 .
          drwxr-xr-x   4 cnych  staff  128 Jul 15 14:10 ..
          drwxr-xr-x  12 cnych  staff  384 Jul 15 14:10 adservice

          通過上面的方式可以只獲取指定目錄的代碼,但是遺憾的是 Zadig 目前并不支持該功能,或許后續(xù)會(huì)支持吧!

          代碼源配置后,最主要的是添加通用構(gòu)建腳本

          構(gòu)建服務(wù)

          我們這里其實(shí)就是配置如何構(gòu)建鏡像,對應(yīng)的腳本如下所示:

          #!/bin/bash
          set -e

          cd $WORKSPACE/$REPONAME_0/src/adservice

          docker build -t $IMAGE -f Dockerfile .

          docker push $IMAGE

          首先需要進(jìn)入到當(dāng)前服務(wù)的代碼根目錄下面,我們這里使用的是 cd $WORKSPACE/$REPONAME_0/src/adservice 命令,其中的 $WORKSPACE$REPONAME_0$IMAGE 均為內(nèi)置的構(gòu)建變量,$WORKSPACE 表示工作根目錄,而 $REPONAME_0 表示配置的第一個(gè)代碼倉庫的名稱,也就是 microservices-demo

          構(gòu)建變量

          進(jìn)入到服務(wù)根目錄下面后,我們只需要執(zhí)行 docker build 命令構(gòu)建鏡像即可,每個(gè)服務(wù)的根目錄下面均配置了 Dockerfile 文件,構(gòu)建的鏡像使用變量 $IMAGE 代替,會(huì)使用添加的默認(rèn)的鏡像倉庫。

          默認(rèn)的鏡像命名規(guī)則如下所示,我們也可以自行定制。

          鏡像命令規(guī)則

          構(gòu)建配置完過后,記得保存構(gòu)建,用同樣的方式配置所有服務(wù)的構(gòu)建。

          服務(wù)配置完成后下一步開始加入環(huán)境,同樣默認(rèn)情況下會(huì)自動(dòng)創(chuàng)建一套 dev 和 qa 的環(huán)境以及 3 條工作流。

          加入環(huán)境

          加入環(huán)境后就可以看到對應(yīng)的 3 條工作流了,點(diǎn)擊完成即可。

          工作流

          執(zhí)行工作流

          這樣項(xiàng)目就創(chuàng)建成功了,現(xiàn)在我們先在 dev 環(huán)境來運(yùn)行工作流。點(diǎn)擊執(zhí)行工作流,在服務(wù)中可以選擇我們要構(gòu)建的服務(wù),可以選擇一個(gè)也可以選擇多個(gè)服務(wù)。

          執(zhí)行任務(wù)

          同樣任務(wù)執(zhí)行后會(huì)執(zhí)行配置的通用腳本,然后將對應(yīng)的服務(wù)部署到 K8s 集群中去。

          任務(wù)詳情

          將所有的服務(wù)執(zhí)行完成后在環(huán)境頁面可以看到所有服務(wù)的狀態(tài)和最新鏡像信息。

          dev環(huán)境

          每個(gè)服務(wù)都正常部署到 dev 環(huán)境后,查看對應(yīng)的 Pod 狀態(tài):

          $ kubectl get pods -n microservices-demo-env-dev
          NAME                                     READY   STATUS    RESTARTS   AGE
          adservice-5b5b97cf59-b7d6g               1/1     Running   0          21m
          cartservice-7d66bd5c4-wxd6v              1/1     Running   0          15m
          checkoutservice-6dbc8cdc46-fqrnx         1/1     Running   0          14m
          currencyservice-54fccf7b9f-c29h5         1/1     Running   0          13m
          emailservice-844b6c9b58-j5smc            1/1     Running   0          13m
          frontend-649699cc5-s5ggp                 1/1     Running   0          12m
          loadgenerator-565cdbb5dc-6dtrb           1/1     Running   0          5m42s
          paymentservice-fd8f95f79-4889n           1/1     Running   0          11m
          productcatalogservice-775db476b6-l4s2t   1/1     Running   0          6m47s
          recommendationservice-79f558bc9b-jx69n   1/1     Running   0          6m47s
          redis-cart-f9bdd7959-qtc9n               1/1     Running   0          34m
          shippingservice-f789c4494-ktbnz          1/1     Running   0          6m43s
          $ kubectl get svc -n microservices-demo-env-dev
          NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)        AGE
          adservice               ClusterIP      10.96.40.23      <none>         9555/TCP       41m
          cartservice             ClusterIP      10.110.0.136     <none>         7070/TCP       41m
          checkoutservice         ClusterIP      10.109.209.29    <none>         5050/TCP       41m
          currencyservice         ClusterIP      10.98.43.229     <none>         7000/TCP       41m
          emailservice            ClusterIP      10.101.67.47     <none>         5000/TCP       41m
          frontend                ClusterIP      10.96.37.222     <none>         80/TCP         41m
          frontend-external       LoadBalancer   10.109.168.181   192.168.0.53   80:30090/TCP   41m
          paymentservice          ClusterIP      10.105.223.48    <none>         50051/TCP      41m
          productcatalogservice   ClusterIP      10.102.112.64    <none>         3550/TCP       41m
          recommendationservice   ClusterIP      10.99.127.143    <none>         8080/TCP       41m
          redis-cart              ClusterIP      10.111.15.205    <none>         6379/TCP       41m
          shippingservice         ClusterIP      10.104.122.207   <none>         50051/TCP      41m

          該服務(wù)最后是通過 frontend-external 這個(gè) LoadBalancer 類型的 Service 來暴露的服務(wù),我們可以直接通過分配的 IP 192.168.0.53 來訪問服務(wù)了。

          frontend external

          觸發(fā)器

          同樣我們也可以給服務(wù)添加觸發(fā)器來觸發(fā)任務(wù),在工作流編輯頁面點(diǎn)擊左側(cè)的觸發(fā)器添加,勾選 Webhook -> 添加配置,我們可以先添加一個(gè)只針對 adservice 這個(gè)服務(wù)的觸發(fā)器,選擇對應(yīng)的代碼庫、要部署的服務(wù),最關(guān)鍵的是文件目錄部分的配置,也就是代碼倉庫中的什么文件變更才會(huì)觸發(fā)我們的任務(wù),我們的配置為:

          src/adservice/
          !.md
          !.gitignore

          該段配置的表示當(dāng)代碼倉庫中 src/adservice/ 目錄下面的代碼有變更,并且不是 .md 或者 .gitignore 文件則會(huì)觸發(fā)任務(wù)。

          觸發(fā)器

          配置后記得保存。現(xiàn)在我們可以去修改下 adservice 服務(wù)中的代碼,修改代碼 src/adservice/src/main/java/hipstershop/AdService.java,比如我們將 177 行的 50%修改為 60%,然后提交代碼到 main 分支。

          修改代碼

          當(dāng)我們將上述代碼 push 到 main 分支后,Zadig 就立即觸發(fā)了一次新的任務(wù)。

          webhook trigger

          該任務(wù)執(zhí)行成功后我們可以去查看該產(chǎn)品的頁面是否生效。

          驗(yàn)證修改

          到這里我就實(shí)現(xiàn)了該微服務(wù)項(xiàng)目的持續(xù)構(gòu)建,同樣的我們可以去手動(dòng)創(chuàng)建一個(gè)環(huán)境來進(jìn)行交付,操作方式一樣的。

          測試用例

          此外我們還可以來新建一些測試用例,在測試頁面點(diǎn)擊新建測試按鈕即可開始創(chuàng)建測試用例。

          新建測試

          比如我們這里對一個(gè) go 服務(wù)做一次簡單的測試,在依賴的軟件包中可以選擇對應(yīng)的依賴,如果沒有對應(yīng)的軟件包,則可以新建一個(gè)。

          軟件依賴

          比如我們需要一個(gè) 1.17 版本的 go 環(huán)境,可以通過 系統(tǒng)設(shè)置 -> 軟件包管理 新建一個(gè)軟件包。

          新建軟件包

          然后我們重新去創(chuàng)建一個(gè)測試用例,選擇相應(yīng)的依賴,同樣配置對應(yīng)的代碼源和測試腳本。

          測試腳本

          創(chuàng)建后可以用同樣的方式來執(zhí)行該測試用例。

          執(zhí)行測試

          測試詳情頁面和工作流的任務(wù)頁面基本上一致。

          測試詳情

          同樣也可以看到對應(yīng)的測試報(bào)告。

          測試報(bào)告

          此外我們還可以將自動(dòng)化測試和工作流關(guān)聯(lián)起來,當(dāng)日常運(yùn)行工作流更新環(huán)境后,會(huì)自動(dòng)執(zhí)行自動(dòng)化測試。可以實(shí)現(xiàn)只要環(huán)境有變更,就第一時(shí)間對其做自動(dòng)化測試。

          關(guān)聯(lián)工作流

          關(guān)聯(lián)后啟動(dòng)工作流任務(wù)就可以看到有該測試用例了。

          測試用例
          工作流

          Zadig 還會(huì)為我們的構(gòu)建數(shù)據(jù)進(jìn)行統(tǒng)計(jì),提供構(gòu)建效能、部署效能等數(shù)據(jù)。

          構(gòu)建效能

          到這里我們就完成了使用 Zadig 來對微服務(wù)項(xiàng)目進(jìn)行持續(xù)集成和交付,當(dāng)然在實(shí)際的生產(chǎn)環(huán)境中和具體的項(xiàng)目業(yè)務(wù)有關(guān)系,這就需要能夠結(jié)合實(shí)際需求去實(shí)踐了。


          今晚8點(diǎn)會(huì)在視頻號與大家對話 Zadig,會(huì)反饋大家對使用 Zadig 的相關(guān)問題,感興趣的朋友記得來哦~

          瀏覽 82
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美性爱免费网站 | 1000部国产av | 370p日韩欧美亚洲精品 | 奇米狠狠二区 | 蜜桃在线视频 |