<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>

          解決 WebAPI 在容器中的啟動(dòng)初始化問題

          共 3599字,需瀏覽 8分鐘

           ·

          2023-07-14 23:12

          f84d8670037160e5f852d53afb2297e0.webp

          在產(chǎn)品或項(xiàng)目的部署中,如果和下面場(chǎng)景類似,那么本文可能對(duì)您有所幫助。

          場(chǎng)景

          1、WebAPI 和 ?MySql ?數(shù)據(jù)部署在同一服務(wù)器(通常是測(cè)試環(huán)境);

          2、WebAPI 和 ?MySql ?使用 ?docker-compose ?進(jìn)行部署;

          3、WebAPI ?啟動(dòng)時(shí)有一些初始化的操作要做,而初始化需要從 ?MySql ?中獲取數(shù)據(jù)。

          問題

          1、第一次部署,執(zhí)行 ?docker-compose up -d ?后,WebAPI ?不能正常啟動(dòng);

          2、斷電、或其他原因?qū)е碌姆?wù)器重啟或 ?docker ?重啟,WebAPI ?不能正常啟動(dòng)。

          原因

          docker ?容器啟動(dòng)時(shí),WebAPI ?程序啟動(dòng)的速度比 ?MySql ?快,導(dǎo)致程序去連接 ?MySql ?時(shí),MySql ?服務(wù)器還沒有啟動(dòng)完成,自然是連不上。

          假象

          在 ?docker-compose.yml 文件中可以添加 depends_on 來設(shè)置依賴,如下:

                
                ?api:
          ??restart:?always
          ??image:?netapi
          ??ports:
          ????-?"5000:5000"
          ??environment:
          ????-?TZ=Asia/Shanghai??
          ??depends_on:
          ????-?mysql
          ??networks:
          ???s2_net:
          ????ipv4_address:?172.66.9.5

          在 api ?的 depends_on 設(shè)置 mysql ,表示 api ?依賴 ?mysql ,只有當(dāng) ?mysql ?啟動(dòng)后,api ?才會(huì)啟動(dòng)。

          但很可惜,這里的 ?mysql ?啟動(dòng)指的是 ?mysql ?的容器是否啟動(dòng)了,而不是 ?mysql ?的服務(wù)是否啟動(dòng)。所以,這種配置只能控制容器的啟動(dòng)順序,并不能解決問題。

          解決

          要解決這個(gè)問題,有兩種方式:

          1、在 WebAPI 項(xiàng)目中使用 Polly 庫(kù),它是一個(gè) .NET 的彈性和瞬態(tài)故障處理庫(kù),可以實(shí)現(xiàn)重試、斷路器、超時(shí)等策略來處理網(wǎng)絡(luò)請(qǐng)求失敗的情況。可以使用 Polly 來嘗試連接 mysql 服務(wù),并在失敗時(shí)進(jìn)行重試或等待。

          2、優(yōu)化 depends_on 配置。

          本文著重介紹的是第二種方式,進(jìn)行 depends_on 配置的優(yōu)化。

          優(yōu)化思路

          1、mysql ?服務(wù)添加 healthcheck 檢查,用來判斷 ?mysql 的服務(wù)是否正常啟動(dòng);

          2、api ?服務(wù)的 depends_on 監(jiān)聽這個(gè)檢查,只有當(dāng) mysql 服務(wù)正常啟動(dòng)后,api ?才會(huì)啟動(dòng)。

          完整 ?docker-compose.yml

                
                version:?"3"

          networks:
          ?s2_net:
          ??driver:?bridge
          ??ipam:
          ???driver:?default
          ???config:
          ????-?subnet:?172.66.9.0/24

          services:
          ?mysql:
          ??restart:?always
          ??image:?mysql/mysql-server:latest
          ??ports:
          ????-?"3306:3306"
          ??environment:
          ????-?TZ=Asia/Shanghai
          ????-?MYSQL_ROOT_PASSWORD=123456
          ??healthcheck:
          ????test:?["CMD",?"mysqladmin"?,"ping",?"-h",?"localhost",?"-u",?"root",?"--password=123456"]
          ????interval:?3s
          ????timeout:?5s
          ????retries:?3
          ????start_period:?5s
          ??command:?mysqld?--character-set-server=utf8mb4?--collation-server=utf8mb4_general_ci?--default-authentication-plugin=mysql_native_password
          ??networks:
          ???s2_net:
          ????ipv4_address:?172.66.9.2
          ?
          ?api:
          ??restart:?always
          ??image:?netapi
          ??ports:
          ????-?"5000:5000"
          ??environment:
          ????-?TZ=Asia/Shanghai??
          ??depends_on:
          ????mysql:
          ??????condition:?service_healthy
          ??networks:
          ???s2_net:
          ????ipv4_address:?172.66.9.5

          mysql ?服務(wù)中添加 healthcheck 屬性,子屬性解釋如下:

          • test:設(shè)置健康檢查的命令。
          • interval:定義健康檢查的間隔時(shí)間,上面配置為間隔 ?3 ?秒。
          • timeout:健康檢查的超時(shí)時(shí)間。
          • retries:定義了健康檢查失敗后的重試次數(shù)。
          • start_period:默認(rèn)值為 0 秒,表示容器啟動(dòng)后立即進(jìn)行健康檢查。如果將 start_period 設(shè)置為非零值,則 Docker 會(huì)在容器啟動(dòng)后先等待一段時(shí)間,然后再開始進(jìn)行健康檢查。

          api ?服務(wù)的配置為固定寫法。

          注意事項(xiàng)

          如果您的 ?docker-compose ?安裝的是 ?1.27 ?以下的版本,需要升級(jí)到 ?1.27 ?或以上版本。

          因?yàn)?docker-compose 3 ?不支持 depends_on ?的條件設(shè)置, 但從 1.27.0 開始,2.x 和 3.x 與 COMPOSE_SPEC 架構(gòu)合并,版本現(xiàn)在是兼容的。

          可以使用下面命令進(jìn)行 ?docker-compose ?版本的查看:

                
                docker-compose?-v

          安裝 ?docker-compose ? 可以使用下面命令:

                
                curl?-L?https://github.com/docker/compose/releases/download/1.28.0/docker-compose-`uname?-s`-`uname?-m`?-o?/usr/local/bin/docker-compose
          sudo?chmod?+x?/usr/local/bin/docker-compose

          升級(jí)到 ?1.28.0 后,執(zhí)行 ?docker-compose ?的命令時(shí)可能會(huì)出現(xiàn)錯(cuò)誤,錯(cuò)誤提示如下:

          [29250] Error loading Python lib '/tmp/_MEIYmY20a/libpython3.9.so.1.0': dlopen: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by /tmp/_MEIYmY20a/libpython3.9.so.1.0)

          按照提示 ?google 下,會(huì)有很多方式解決,或者直接參考這個(gè)鏈接:https://blog.csdn.net/wangying202/article/details/113178159

          總結(jié)

          1、在 ?docker-compose ?中進(jìn)行設(shè)置是一種偷懶的做法,適用于測(cè)試環(huán)境,因?yàn)樯a(chǎn)環(huán)境程序和數(shù)據(jù)庫(kù)通常在不同的服務(wù)器。

          2、最好的方式還是應(yīng)該在 ?WebAPI ?程序中進(jìn)行處理。


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

          手機(jī)掃一掃分享

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

          手機(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>
                  最新欧美国产 | 国产日韩+欧美在线观看 | 豆花视频在线观看一区 | 国产精品成人免费视频 | 日韩福利资源 |