自從容器(主要是docker)出現(xiàn)后辕翰,分布式部署迎來了一場不小的革命橡庞,開發(fā)運維人員終于可以不用為部署環(huán)境不一致問題扯皮戏仓,同時動態(tài)擴展也大大簡化。Docker加上K8S后客冈,更是爭強對基于docker部署的分布式系統(tǒng)的“三高”(高可用旭从,高可擴,高并發(fā))场仲。對于C#而言和悦,.net core時代的到來,開始了擁抱跨平臺渠缕,對于容器化技術(shù)鸽素,微軟會遲到,但絕不會缺席亦鳞。今天馍忽,我們也來體驗一把利用.net core3.1 WebApi架構(gòu),將虹軟人臉識別項目部署到docker容器中燕差。本文基于虹軟人臉識別SDK 3.0 Windows C++ / X64版本(SDK下載鏈接:https://ai.arcsoft.com.cn/ucenter/resource/build/index.html#/addFreesdk/1002?from=index)作為講解以及代碼展示遭笋。
生產(chǎn)環(huán)境中,Linux服務(wù)器的數(shù)量遠超Windows server谁不,因此Linux系統(tǒng)才是docker的主戰(zhàn)場坐梯,順便提一句K8S目前也僅支持Linux運行。在Linux系統(tǒng)安裝docker刹帕,根據(jù)Linux版本不同吵血,可能有些差異,主要兩種發(fā)行版安裝參考如下(你可能需要科學(xué)上網(wǎng)):
Ubuntu:https://www.runoob.com/docker/ubuntu-docker-install.html
CentOS:https://www.runoob.com/docker/centos-docker-install.html
環(huán)境好了偷溺,可以干活了蹋辅。下面我們開始擼代碼,實例代碼我去除so挫掏,dll文件以及AppId侦另,Key配置后,放在了github上面(https://github.com/18628271760/MicroService_Face_3_0)大家可以下載參考,添加去除內(nèi)容后褒傅,就可以可以跑起來弃锐。
下面開始避坑提示:
- 無法加載錯誤:絕大多數(shù)小伙伴在Windows上開發(fā),再部署到Linux上殿托。因此經(jīng)常直接把虹軟SDK的2個dll格式文件上傳到Linux服務(wù)器霹菊,導(dǎo)致啟動docker時候失敗。原因當(dāng)然是Windows的動態(tài)鏈接庫與Linux版本不兼容引發(fā)的支竹。
避坑做法是:推薦將dll與so文件同時加載到項目旋廷,方便調(diào)試與部署。編寫完成在本地測試的時候礼搁,選擇dll格式的動態(tài)鏈接庫饶碘,部署上傳到Linux的時候只上傳對應(yīng)的so文件。 -
“28676(0x7004)”錯誤:官方SDK解釋的很清楚馒吴,SDK_KEY和使用的SDK不匹配扎运。開發(fā)者在虹軟開發(fā)者中心創(chuàng)建一個項目后,會自動生成一個APP_ID募书。這個項目下绪囱,可以有N個版本的SDK测蹲,這些SDK共用一個APP_ID莹捡,但有自己獨立的SDK_KEY(不同系統(tǒng)版本間肯定不一樣!)扣甲。
避坑做法是:注意在開發(fā)和部署測試的時候篮赢,切換不同的key,與當(dāng)前系統(tǒng)版本一致琉挖。同樣不要忘記不同系統(tǒng)下的引用文件切換启泣。(表揚下虹軟開發(fā),相同代數(shù)的Windows/Linux C++版本函數(shù)完全一致示辈,省去了不少麻煩)寥茫。
3.png
4.png - (微軟挖坑!)鏡像缺少依賴(提示找不到libgdiplus組件):由于本實例基于.net core3.1版本矾麻,需要在DockerFile里面加入.net core3.1依賴鏡像纱耻。早期筆者使用的是微軟自帶的.net core3.1鏡像,結(jié)果發(fā)現(xiàn)部署完成后啟動容器险耀,出現(xiàn)依賴缺失問題弄喘。經(jīng)過排查后發(fā)現(xiàn),微軟自帶的.net core3.1鏡像沒有集成libgdiplus庫(libgdiplus是一個Mono庫甩牺,用于對非Windows操作系統(tǒng)提供GDI+兼容的API蘑志,libgdiplus是mono中的System.Drawing依賴的一個組件,用于顯示web頁面基本顏色等〖钡可用于生成netcore驗證碼澎媒,處理圖片等。關(guān)于libgdiplus的詳細信息波桩,請小伙伴參考:http://www.reibang.com/p/f71f9e7138c0)
避坑做法是:引用第三方鏡像( lonwern/aspnetcore-libgdiplus:3.1)可以解決此問題旱幼。(其在Github上的開源地址為:https://github.com/lonwern/aspnetcore-libgdiplus) - 無法找到相關(guān)引用:與Windows系統(tǒng)類似,Linux在查找動態(tài)鏈接文件so時突委,也有一定順序柏卤,如下:
(1) gcc 編譯時指定的運行時庫路徑 -Wl,-rpath
(2) 環(huán)境變量 LD_LIBRARY_PATH
(3) ldconfig 緩存 /etc/ld.so.cache
(4) 系統(tǒng)默認庫位置 /lib以及/usr/lib
如果我們的so文件沒有在上述位置,Linux 程序運行時自然查找不到匀油,將會報錯缘缚。
避坑做法是:建議在Linux系統(tǒng)中基于docker部署, libarcsoft_face.so 和libarcsoft_face_engine.so需要拷貝到/usr/lib/目錄下敌蚜,最為簡單方便桥滨。
5.png
將程序集上傳到Linux,打包成鏡像文件弛车。鏡像打包參考:
https://blog.csdn.net/xiaoxionglove/article/details/108962750
打包成功后齐媒,利用docker images命令參看是否創(chuàng)建成功:
6.png
創(chuàng)建成功后,利用docker run命令啟動容器實例纷跛。
沒有錯誤喻括,利用docker ps -a命令參看下結(jié)果:
7.png
打開swagger,測試:
8.png
10.png
總結(jié)贫奠,容器化的部署唬血,簡化了跨平臺的部署,同時也減輕了運維壓力唤崭。但對新手來說拷恨,可能會遇到很多“坑”。不過踩坑爬坑就是能力提升的過程谢肾,希望本期開發(fā)心得對小伙伴使用虹軟容器化部署有個避坑參考腕侄。