環(huán)境部署實(shí)操與避坑指南)
這幾年做GIS項(xiàng)目交付驗(yàn)收現(xiàn)場(chǎng)被問(wèn)得最多的一類(lèi)問(wèn)題幾乎都繞不開(kāi)信創(chuàng)環(huán)境部署。尤其是SuperMap GIS平臺(tái)軟件這套東西——iServer、iDesktopX、iPortal這些組件放到國(guó)產(chǎn)CPU加國(guó)產(chǎn)操作系統(tǒng)的機(jī)器上跟在普通x86服務(wù)器上裝完全是兩種手感。前者你可能十分鐘就搞定了后者可能折騰兩天還在查日志。這篇東西就是把我自己在多個(gè)信創(chuàng)項(xiàng)目里踩過(guò)的坑、總結(jié)出來(lái)的排查路徑、以及那些官方文檔里寫(xiě)得比較含蓄的細(xì)節(jié)一次性攤開(kāi)來(lái)講清楚。不管你是剛接觸SuperMap GIS的新手還是已經(jīng)做過(guò)幾個(gè)信創(chuàng)項(xiàng)目的老人這篇SuperMap GIS平臺(tái)軟件在信創(chuàng)環(huán)境部署的實(shí)操問(wèn)答記錄應(yīng)該都能幫你少走點(diǎn)彎路。它不講空泛的概念只講你真正會(huì)碰到的問(wèn)題環(huán)境怎么盤(pán)、依賴(lài)怎么補(bǔ)、服務(wù)為什么起不來(lái)、地圖為什么出不了字、許可為什么激活不了。適合做GIS平臺(tái)實(shí)施、運(yùn)維、二次開(kāi)發(fā)的朋友參考。1. 信創(chuàng)環(huán)境下部署SuperMap GIS難點(diǎn)究竟卡在哪1.1 環(huán)境組合的碎片化是最先要接受的現(xiàn)實(shí)在普通項(xiàng)目里我們說(shuō)部署一套GIS服務(wù)心里基本有譜x86服務(wù)器裝個(gè)Linux發(fā)行版JDK裝好解壓iServer配個(gè)許可啟動(dòng)。整個(gè)過(guò)程是線性的。但到了信創(chuàng)環(huán)境這個(gè)線性流程會(huì)被徹底打散。你要面對(duì)的是CPU架構(gòu)、操作系統(tǒng)、JDK、數(shù)據(jù)庫(kù)、中間件這五個(gè)維度各自都有多個(gè)國(guó)產(chǎn)選項(xiàng)而且它們之間的兼容性并不是天然對(duì)齊的。龍芯是LoongArch架構(gòu)鯤鵬和飛騰是ARM海光和兆芯是x86光是CPU架構(gòu)這一層就決定了你下載的安裝包、JDK、加密狗驅(qū)動(dòng)都要分開(kāi)準(zhǔn)備。操作系統(tǒng)這邊有麒麟、統(tǒng)信UOS又分服務(wù)器版和桌面版底層glibc版本、包管理命令、默認(rèn)字體配置都可能不一樣。這就導(dǎo)致一個(gè)很尷尬的情況同事在麒麟加鯤鵬上跑得好好的部署腳本你拿到統(tǒng)信加海光上就報(bào)glibc symbol not found。這不是誰(shuí)能力不行是環(huán)境本身就是碎的。我一般建議團(tuán)隊(duì)在做信創(chuàng)項(xiàng)目時(shí)第一件事是把環(huán)境組合固定下來(lái)形成一份內(nèi)部的兼容清單。比如某個(gè)項(xiàng)目確定用鯤鵬920 麒麟V10 SP2 達(dá)夢(mèng)DM8 畢昇JDK這套組合那后續(xù)所有部署文檔、腳本、依賴(lài)包都圍繞這一套走不輕易替換。因?yàn)槊繐Q一個(gè)變量你都要重新驗(yàn)證一遍iServer能不能起、數(shù)據(jù)源能不能連、出圖正不正常。這種驗(yàn)證成本在信創(chuàng)項(xiàng)目里特別高能省就省。1.2 為什么普通x86的部署經(jīng)驗(yàn)直接搬過(guò)來(lái)會(huì)翻車(chē)很多人第一反應(yīng)是Linux都差不多嘛命令一樣路徑一樣應(yīng)該能通用。這個(gè)想法非常危險(xiǎn)。我列幾個(gè)真實(shí)會(huì)翻車(chē)的點(diǎn)你感受一下。第一個(gè)是JDK。SuperMap iServer基于Java對(duì)JDK版本和實(shí)現(xiàn)比較敏感。普通環(huán)境你裝個(gè)OpenJDK或者Oracle JDK就完事但在信創(chuàng)環(huán)境往往要求用國(guó)產(chǎn)JDK比如畢昇、騰訊Kona、龍井、龍芯JDK等。這些JDK雖然都兼容Java規(guī)范但個(gè)別版本在特定CPU上對(duì)某些類(lèi)庫(kù)的實(shí)現(xiàn)有差異可能導(dǎo)致iServer啟動(dòng)時(shí)報(bào)奇怪的異?;蛘哌\(yùn)行一段時(shí)間后內(nèi)存回收異常。第二個(gè)是本地庫(kù)依賴(lài)。GIS軟件大量使用本地庫(kù)比如投影轉(zhuǎn)換、圖形渲染、GDAL相關(guān)的讀寫(xiě)。這些庫(kù)在x86上通常有預(yù)編譯好的so文件但在ARM或者LoongArch上如果安裝包里沒(méi)有對(duì)應(yīng)架構(gòu)的版本就會(huì)出現(xiàn)加載失敗。表現(xiàn)就是服務(wù)能啟動(dòng)但一旦做某個(gè)具體操作比如坐標(biāo)轉(zhuǎn)換、柵格切片就拋UnsatisfiedLinkError。第三個(gè)是字體和編碼。這個(gè)后面會(huì)詳細(xì)講但簡(jiǎn)單說(shuō)普通環(huán)境你可能從來(lái)沒(méi)關(guān)心過(guò)系統(tǒng)字體因?yàn)橹形娘@示一直是正常的。到了精簡(jiǎn)安裝的國(guó)產(chǎn)服務(wù)器系統(tǒng)上中文字體庫(kù)經(jīng)常是缺的地圖上的標(biāo)注直接變成方塊或者亂碼。提示不要假設(shè)Linux都一樣。在信創(chuàng)項(xiàng)目里把每一個(gè)環(huán)境變量都當(dāng)成需要重新確認(rèn)的對(duì)象而不是可以默認(rèn)繼承的常識(shí)。1.3 部署前必須先確認(rèn)的幾件事動(dòng)手之前我習(xí)慣做一份部署前檢查清單把不確定的東西提前鎖定。這份清單大概包括下面這些內(nèi)容你可以直接拿去用。CPU架構(gòu)和操作系統(tǒng)版本執(zhí)行uname -m看架構(gòu)aarch64、loongarch64、x86_64cat /etc/os-release看系統(tǒng)發(fā)行版和版本號(hào)。glibc版本ldd --version這個(gè)直接決定你能不能跑官方預(yù)編譯的二進(jìn)制。JDK信息java -version確認(rèn)廠商、版本并把JAVA_HOME記下來(lái)。內(nèi)存與磁盤(pán)free -h和df -hGIS服務(wù)吃?xún)?nèi)存緩存吃磁盤(pán)別到部署一半發(fā)現(xiàn)空間不夠。數(shù)據(jù)庫(kù)版本與字符集達(dá)夢(mèng)、人大金倉(cāng)的版本以及建庫(kù)時(shí)的字符集是不是UTF-8。許可類(lèi)型是軟許可還是硬件加密狗加密狗在信創(chuàng)平臺(tái)上的驅(qū)動(dòng)是否到位。網(wǎng)絡(luò)與端口iServer默認(rèn)用8090數(shù)據(jù)庫(kù)、許可服務(wù)各占什么端口防火墻要不要放行。這里面最容易被忽略的是glibc版本和加密狗驅(qū)動(dòng)。glibc低了安裝包直接跑不起來(lái)加密狗驅(qū)動(dòng)不對(duì)許可能讀到硬件但識(shí)別不了服務(wù)照樣起不來(lái)。這兩個(gè)問(wèn)題我在項(xiàng)目里都遇到過(guò)下面會(huì)細(xì)說(shuō)。2. 部署前的環(huán)境盤(pán)點(diǎn)與選型決策2.1 硬件架構(gòu)與安裝包的對(duì)應(yīng)關(guān)系SuperMap官方針對(duì)信創(chuàng)環(huán)境會(huì)提供不同架構(gòu)的安裝包這一點(diǎn)必須先搞清楚。你在官網(wǎng)或者服務(wù)渠道拿到安裝包時(shí)一定要核對(duì)包名里或者說(shuō)明里的架構(gòu)標(biāo)識(shí)。ARM架構(gòu)aarch64的包不能拿到LoongArch上跑x86的包也不能拿到ARM上跑。我見(jiàn)過(guò)有人圖省事直接把x86的iServer包扔到鯤鵬機(jī)器上解壓結(jié)果啟動(dòng)腳本里調(diào)用的本地庫(kù)全是x86的so報(bào)錯(cuò)信息還特別隱晦找了半天才發(fā)現(xiàn)是包拿錯(cuò)了。選型上我的經(jīng)驗(yàn)是優(yōu)先選項(xiàng)目組已經(jīng)有成功案例的組合。比如某個(gè)區(qū)域的項(xiàng)目普遍用鯤鵬麒麟達(dá)夢(mèng)那就跟著用遇到問(wèn)題也容易找到人問(wèn)。如果必須用比較新的組合比如LoongArch平臺(tái)那就提前留出驗(yàn)證時(shí)間別等到交付前一周才開(kāi)始試。數(shù)據(jù)庫(kù)這塊同樣要對(duì)應(yīng)。達(dá)夢(mèng)、人大金倉(cāng)、openGauss、GBase這些國(guó)產(chǎn)數(shù)據(jù)庫(kù)SuperMap iServer通常通過(guò)JDBC驅(qū)動(dòng)連接。你要確認(rèn)驅(qū)動(dòng)包的版本和數(shù)據(jù)庫(kù)版本匹配并且驅(qū)動(dòng)要放到iServer的lib目錄下。驅(qū)動(dòng)版本不對(duì)典型表現(xiàn)是能連上但執(zhí)行某些空間查詢(xún)SQL時(shí)報(bào)錯(cuò)或者空間數(shù)據(jù)讀出來(lái)是亂碼。2.2 中間件、數(shù)據(jù)庫(kù)與JDK的取舍邏輯很多信創(chuàng)項(xiàng)目會(huì)要求用國(guó)產(chǎn)中間件比如把iServer部署在東方通TongWeb或者寶蘭德BES上運(yùn)行。這里有個(gè)取舍是把iServer作為獨(dú)立進(jìn)程跑自帶內(nèi)置容器還是部署成war包放進(jìn)國(guó)產(chǎn)中間件。兩種方式各有適用場(chǎng)景。獨(dú)立進(jìn)程方式簡(jiǎn)單、排查方便適合大多數(shù)GIS服務(wù)場(chǎng)景。部署成war包則適合需要和已有Java應(yīng)用統(tǒng)一管理、統(tǒng)一做會(huì)話和安全的場(chǎng)景。我個(gè)人的傾向是除非有硬性要求否則優(yōu)先用獨(dú)立進(jìn)程方式因?yàn)镚IS服務(wù)本身對(duì)內(nèi)存和線程的調(diào)度有自己的訴求塞進(jìn)通用中間件反而容易在性能和排查上增加復(fù)雜度。JDK的選擇邏輯類(lèi)似。優(yōu)先用SuperMap官方文檔里明確驗(yàn)證過(guò)的JDK版本和廠商。如果文檔沒(méi)寫(xiě)就選主流的國(guó)產(chǎn)JDK穩(wěn)定版本不要一上來(lái)就用最新版。JDK這東西新版本帶來(lái)新特性但也可能帶來(lái)新的兼容問(wèn)題GIS平臺(tái)不一定跟得那么快。2.3 依賴(lài)包的離線準(zhǔn)備清單信創(chuàng)環(huán)境很多是內(nèi)網(wǎng)不能聯(lián)網(wǎng)裝包所以依賴(lài)必須提前準(zhǔn)備齊全。我一般會(huì)整理一個(gè)離線依賴(lài)包目錄包含以下內(nèi)容。依賴(lài)類(lèi)別具體內(nèi)容用途說(shuō)明系統(tǒng)基礎(chǔ)庫(kù)libX11、libXext、libXtst、fontconfig、freetype相關(guān)圖形渲染、字體解析中文字體宋體、黑體等TTF/TTC字體文件地圖標(biāo)注中文顯示JDK對(duì)應(yīng)架構(gòu)的國(guó)產(chǎn)JDK安裝包或壓縮包運(yùn)行iServer數(shù)據(jù)庫(kù)驅(qū)動(dòng)達(dá)夢(mèng)/金倉(cāng)/openGauss的JDBC jar數(shù)據(jù)源連接加密狗驅(qū)動(dòng)對(duì)應(yīng)架構(gòu)的驅(qū)動(dòng)及守護(hù)進(jìn)程硬件許可識(shí)別其他工具unzip、net-tools、chrony等解壓、網(wǎng)絡(luò)排查、時(shí)間同步把這些東西提前拷到內(nèi)網(wǎng)機(jī)器上能省掉大量來(lái)回折騰的時(shí)間。尤其是字體和加密狗驅(qū)動(dòng)缺了它們服務(wù)要么顯示不正常要么根本起不來(lái)。3. iServer與iDesktopX在信創(chuàng)環(huán)境的實(shí)操部署流程3.1 系統(tǒng)基礎(chǔ)環(huán)境的配置動(dòng)作部署從系統(tǒng)層面的準(zhǔn)備開(kāi)始。我通常按下面的順序做。第一步創(chuàng)建專(zhuān)用運(yùn)行用戶(hù)。不要用root跑iServer一方面是安全規(guī)范另一方面是用root跑時(shí)產(chǎn)生的一些文件權(quán)限會(huì)很麻煩。命令大致如下。useradd -m -s /bin/bash gisuser passwd gisuser第二步設(shè)置locale和時(shí)區(qū)。中文環(huán)境建議設(shè)置成UTF-8否則中文路徑、中文數(shù)據(jù)都可能出問(wèn)題。localectl set-locale LANGzh_CN.UTF-8 timedatectl set-timezone Asia/Shanghai如果系統(tǒng)里沒(méi)有zh_CN.UTF-8這個(gè)locale需要先生成localedef -i zh_CN -f UTF-8 zh_CN.UTF-8第三步安裝中文字體。這是信創(chuàng)服務(wù)器上極其常見(jiàn)的一個(gè)坑。做法是把字體文件拷貝到系統(tǒng)字體目錄然后刷新字體緩存。mkdir -p /usr/share/fonts/chinese cp simsun.ttc simhei.ttf /usr/share/fonts/chinese/ chmod 644 /usr/share/fonts/chinese/* fc-cache -fv刷新完成后用fc-list :langzh看一下能不能列出中文字體。如果列不出來(lái)地圖標(biāo)注就會(huì)出問(wèn)題。第四步時(shí)間同步。GIS服務(wù)里很多緩存、切片、日志都依賴(lài)時(shí)間準(zhǔn)確把chrony配好指向內(nèi)網(wǎng)的時(shí)間源。3.2 安裝包解壓與依賴(lài)補(bǔ)齊環(huán)境準(zhǔn)備好之后切換到gisuser用戶(hù)解壓iServer安裝包。假設(shè)包名叫supermap_iserver_11i_linux_aarch64.tar.gz操作如下。su - gisuser tar -zxvf supermap_iserver_11i_linux_aarch64.tar.gz cd supermap_iserver_11i解壓之后先別急著啟動(dòng)檢查一下關(guān)鍵目錄。通常會(huì)有bin、lib、webapps、support這幾個(gè)目錄。bin下面是啟動(dòng)腳本lib下面放依賴(lài)和數(shù)據(jù)庫(kù)驅(qū)動(dòng)support下面可能有一些工具。接下來(lái)把數(shù)據(jù)庫(kù)驅(qū)動(dòng)放到lib目錄。以達(dá)夢(mèng)為例把DmJdbcDriver18.jar拷過(guò)去。cp DmJdbcDriver18.jar ./lib/如果你用的是硬件加密狗這一步還要裝驅(qū)動(dòng)。驅(qū)動(dòng)一般是按架構(gòu)分的插上加密狗之后用廠商提供的檢測(cè)工具確認(rèn)系統(tǒng)能不能識(shí)別到硬件。識(shí)別不到的話先排查USB或者并口、驅(qū)動(dòng)是否加載、以及是否需要在虛擬機(jī)里做USB直通。關(guān)于JVM參數(shù)這一步要提前規(guī)劃好別用默認(rèn)值。默認(rèn)參數(shù)在實(shí)際項(xiàng)目里往往偏小服務(wù)一上壓力就出問(wèn)題。我通常會(huì)在啟動(dòng)腳本或者配置里顯式設(shè)置堆內(nèi)存。3.3 JVM內(nèi)存參數(shù)怎么算才不吃虧GIS服務(wù)是典型的內(nèi)存密集型應(yīng)用切片、緩存、并發(fā)請(qǐng)求都吃?xún)?nèi)存。給太小頻繁Full GC服務(wù)卡頓給太大可能把系統(tǒng)內(nèi)存擠爆導(dǎo)致數(shù)據(jù)庫(kù)或者系統(tǒng)本身不穩(wěn)定。我的算法是這樣的。假設(shè)單機(jī)64GB內(nèi)存這臺(tái)機(jī)器上同時(shí)跑達(dá)夢(mèng)數(shù)據(jù)庫(kù)和iServer。那么先給操作系統(tǒng)和后臺(tái)進(jìn)程預(yù)留6GB左右給達(dá)夢(mèng)預(yù)留16GB到20GB剩下的留給iServer。這樣iServer大概能分到 64 - 6 - 18 40GB 左右。堆內(nèi)存不建議把可用內(nèi)存全吃掉留20%到30%給堆外內(nèi)存、線程棧、本地庫(kù)。所以-Xmx大概設(shè)到28g到30g比較穩(wěn)妥。對(duì)應(yīng)的一組參數(shù)大致是這樣JAVA_OPTS-Xms28g -Xmx28g -XX:MetaspaceSize512m -XX:MaxMetaspaceSize1024m -XX:UseG1GC這里Xms和Xmx設(shè)成一樣是為了避免運(yùn)行期堆反復(fù)伸縮帶來(lái)的抖動(dòng)。GC算法選G1在大多數(shù)場(chǎng)景下比較均衡。如果你的場(chǎng)景是超大內(nèi)存、超低延遲要求可以再評(píng)估其他收集器。這些參數(shù)要寫(xiě)進(jìn)啟動(dòng)腳本或者專(zhuān)門(mén)的環(huán)境變量文件里別臨時(shí)手敲容易漏。注意改了JVM參數(shù)之后一定要觀察一段時(shí)間的GC日志。可以在參數(shù)里加上-Xlog:gc*:filegc.log:time之類(lèi)的選項(xiàng)把GC情況記錄到文件里出問(wèn)題時(shí)這是最重要的線索之一。3.4 許可配置與服務(wù)啟動(dòng)驗(yàn)證SuperMap iServer的許可可以走軟許可也可以用硬件加密狗。軟許可一般需要在許可中心里激活信創(chuàng)內(nèi)網(wǎng)環(huán)境通常是離線激活在一臺(tái)能聯(lián)網(wǎng)的機(jī)器上生成申請(qǐng)文件拿到許可文件后拷回內(nèi)網(wǎng)導(dǎo)入。軟許可的配置大致是把許可文件放到指定目錄或者通過(guò)許可服務(wù)配置。具體路徑和方式依版本略有不同按你所用版本的部署文檔來(lái)。這里要強(qiáng)調(diào)的是許可服務(wù)的進(jìn)程要能正常起來(lái)如果許可起不來(lái)iServer啟動(dòng)時(shí)會(huì)在日志里明確提示許可相關(guān)的錯(cuò)誤這時(shí)候先別看iServer先去看許可服務(wù)。一切就緒后啟動(dòng)iServer。cd bin ./startup.sh啟動(dòng)之后看日志日志一般在logs目錄下。看到類(lèi)似Server startup in xxx ms這樣的輸出基本就是起來(lái)了。然后用瀏覽器或者curl訪問(wèn)一下。curl http://127.0.0.1:8090/iserver/能返回頁(yè)面就說(shuō)明服務(wù)正常。接下來(lái)是登錄管理頁(yè)面配置數(shù)據(jù)源、發(fā)布服務(wù)。到這里部署的主流程就走完了。但真正耗時(shí)間的往往是下面這些起來(lái)了但用不了的問(wèn)題。4. 常見(jiàn)問(wèn)題排查與避坑經(jīng)驗(yàn)實(shí)錄4.1 啟動(dòng)失敗類(lèi)問(wèn)題的速查表服務(wù)起不來(lái)是最讓人焦慮的場(chǎng)景。我整理了一份常見(jiàn)問(wèn)題速查表遇到問(wèn)題可以先對(duì)號(hào)入座?,F(xiàn)象可能原因排查方向啟動(dòng)腳本報(bào)權(quán)限錯(cuò)誤用root解壓后又用普通用戶(hù)跑或反過(guò)來(lái)檢查文件屬主chown改成運(yùn)行用戶(hù)報(bào)glibc相關(guān)錯(cuò)誤系統(tǒng)glibc版本低于安裝包要求ldd --version核對(duì)必要時(shí)換包或升系統(tǒng)報(bào)UnsatisfiedLinkError本地庫(kù)架構(gòu)不匹配或缺依賴(lài)用ldd查具體so的依賴(lài)確認(rèn)架構(gòu)一致許可相關(guān)報(bào)錯(cuò)許可服務(wù)未啟動(dòng)、許可文件過(guò)期或加密狗未識(shí)別先查許可服務(wù)日志和硬件識(shí)別端口被占用8090被別的進(jìn)程占用netstat -tlnp查占用者改端口或停進(jìn)程啟動(dòng)很慢最后超時(shí)內(nèi)存不足或數(shù)據(jù)庫(kù)連接卡住看GC日志和數(shù)據(jù)庫(kù)連通性這份表里我最想強(qiáng)調(diào)的是本地庫(kù)問(wèn)題和許可問(wèn)題。本地庫(kù)問(wèn)題隱蔽因?yàn)樗膱?bào)錯(cuò)往往只是一行異常堆棧不仔細(xì)看根本注意不到架構(gòu)不對(duì)。許可問(wèn)題則是信創(chuàng)項(xiàng)目的高發(fā)區(qū)尤其是加密狗在ARM平臺(tái)上驅(qū)動(dòng)的成熟度參差不齊遇到識(shí)別不了先確認(rèn)驅(qū)動(dòng)版本對(duì)不對(duì)再確認(rèn)硬件本身在別的機(jī)器上能不能用。4.2 中文亂碼與地圖出圖異常的解決服務(wù)起來(lái)了數(shù)據(jù)也掛了結(jié)果地圖上中文標(biāo)注顯示成方塊這是信創(chuàng)環(huán)境里出現(xiàn)頻率極高的問(wèn)題根源就在前面說(shuō)的字體缺失。解決辦法前面已經(jīng)講了補(bǔ)字體、刷緩存。但要補(bǔ)一個(gè)細(xì)節(jié)iServer有自己的字體配置有時(shí)候系統(tǒng)字體補(bǔ)了iServer還需要重啟甚至需要在配置里指定字體目錄才能生效。所以補(bǔ)完字體后重啟一次服務(wù)再驗(yàn)證。另一個(gè)常見(jiàn)的是圖層放大不顯示。這個(gè)問(wèn)題不一定是環(huán)境問(wèn)題很多時(shí)候是地圖文檔里的比例尺范圍設(shè)置導(dǎo)致的——某個(gè)圖層只在特定比例尺區(qū)間顯示超出范圍就不畫(huà)。排查時(shí)先看圖層屬性里的最大最小可見(jiàn)比例尺再看是不是緩存問(wèn)題。如果確認(rèn)是環(huán)境相關(guān)的顯示異常再去看渲染相關(guān)的本地庫(kù)和字體。還有在線地圖加載的問(wèn)題。信創(chuàng)內(nèi)網(wǎng)環(huán)境往往不能直接訪問(wèn)公網(wǎng)地圖服務(wù)需要提前把底圖數(shù)據(jù)本地化或者通過(guò)內(nèi)網(wǎng)的地圖服務(wù)發(fā)布。這個(gè)不是部署環(huán)節(jié)能解決的屬于方案設(shè)計(jì)階段就要考慮的問(wèn)題但部署時(shí)經(jīng)常被翻出來(lái)所以順便提醒一句。4.3 遷移交付階段的實(shí)操心得部署完只是開(kāi)始交付階段還有幾件事決定成敗。第一做一次完整的功能回歸。別只看服務(wù)起來(lái)了就交差要實(shí)際發(fā)布一個(gè)地圖服務(wù)打開(kāi)看看做一次空間查詢(xún)導(dǎo)出一個(gè)圖片把主要功能都過(guò)一遍。信創(chuàng)環(huán)境里能啟動(dòng)但某個(gè)功能不可用太常見(jiàn)了。第二把依賴(lài)和配置固化下來(lái)。包括JDK版本、JVM參數(shù)、字體、數(shù)據(jù)庫(kù)驅(qū)動(dòng)、許可文件全部整理成一份部署清單和一套可復(fù)用的腳本。下次遇到同樣的環(huán)境組合直接跑腳本效率天差地別。第三留好日志和排查入口。GC日志、iServer運(yùn)行日志、數(shù)據(jù)庫(kù)日志、系統(tǒng)日志都確認(rèn)能正常輸出并保留。出問(wèn)題時(shí)日志就是命根子。第四關(guān)于性能別在交付前臨時(shí)調(diào)優(yōu)。信創(chuàng)平臺(tái)的性能特征和x86不完全一樣尤其ARM平臺(tái)上的CPU調(diào)度和內(nèi)存帶寬表現(xiàn)需要在項(xiàng)目前期就做壓測(cè)。壓測(cè)時(shí)關(guān)注并發(fā)請(qǐng)求下的響應(yīng)時(shí)間和GC頻率根據(jù)結(jié)果反推JVM參數(shù)和線程配置而不是拍腦袋。最后說(shuō)一個(gè)我自己踩過(guò)的坑。有一次在統(tǒng)信UOS上部署服務(wù)一切正常但導(dǎo)出地圖圖片時(shí)中文全部變成方塊查了半天系統(tǒng)字體明明是有的。后來(lái)發(fā)現(xiàn)是iServer的運(yùn)行用戶(hù)和字體緩存權(quán)限不匹配——字體是root拷進(jìn)去的緩存刷新的記錄普通用戶(hù)讀不到。把字體目錄權(quán)限放開(kāi)重新用運(yùn)行用戶(hù)刷一遍緩存問(wèn)題就沒(méi)了。這種問(wèn)題沒(méi)有任何文檔會(huì)寫(xiě)只能靠自己一點(diǎn)點(diǎn)試出來(lái)。我在實(shí)際操作中的體會(huì)是信創(chuàng)環(huán)境部署SuperMap GIS拼的不是誰(shuí)技術(shù)多高深而是誰(shuí)對(duì)環(huán)境細(xì)節(jié)更較真。把每一個(gè)依賴(lài)、每一項(xiàng)權(quán)限、每一個(gè)參數(shù)都當(dāng)成需要確認(rèn)的對(duì)象而不是想當(dāng)然地繼承x86時(shí)代的經(jīng)驗(yàn)?zāi)銜?huì)發(fā)現(xiàn)那些看似詭異的報(bào)錯(cuò)其實(shí)都有清晰的因果。這套平臺(tái)本身是成熟的難的是讓它在一個(gè)全新的、碎片化的基礎(chǔ)環(huán)境里穩(wěn)穩(wěn)落地。