最近在推廣應(yīng)用我們的分布式服務(wù)網(wǎng)關(guān)(Web Api):業(yè)務(wù)組大部分對(duì)外的業(yè)務(wù)邏輯以HSF服務(wù)或者自定義擴(kuò)展插件的方式,注冊(cè)并發(fā)布到分布式服務(wù)網(wǎng)關(guān)中,統(tǒng)一對(duì)外提供WebApi服務(wù)。臨時(shí)介紹下我們的分布式服務(wù)網(wǎng)關(guān):
1. 一鍵注冊(cè)、發(fā)布WebApi服務(wù),
2. 統(tǒng)一管理發(fā)布WebApi服務(wù),實(shí)現(xiàn)WebApi的服務(wù)化治理
3. 集成安全認(rèn)證、加解密、監(jiān)控、日志等Aspect
4. 流量安全控制:流控
5. 橫向伸縮、彈性擴(kuò)展,支持大規(guī)模并發(fā)
6. 簡(jiǎn)化WebApi開(kāi)發(fā),提升開(kāi)發(fā)效率,減少重復(fù)開(kāi)發(fā)工作
在實(shí)際的開(kāi)發(fā)應(yīng)用中,業(yè)務(wù)邏輯dll要注冊(cè)、發(fā)布到分布式服務(wù)網(wǎng)關(guān)中,例如參數(shù)類(lèi)型、自定義擴(kuò)展插件等。
每次業(yè)務(wù)的變更,都需要重新發(fā)布服務(wù),例如實(shí)體類(lèi)的注解(屬性標(biāo)簽)發(fā)生變化,重新發(fā)布服務(wù),分布式服務(wù)網(wǎng)關(guān)偵測(cè)到變化,重新加載。
同時(shí),各個(gè)業(yè)務(wù)模塊之間存在SPI層接口、實(shí)體類(lèi)的依賴,例如:A中依賴B.Spi.dll, B發(fā)布了最新的B.Spi.dll, A未發(fā)布,這樣會(huì)產(chǎn)生一個(gè)問(wèn)題:
一個(gè)AppDomain中只能加載一個(gè)B.Spi.dll,如果先訪問(wèn)A服務(wù),那么舊版本的B.Spi.dll就會(huì)先加載到AppDomain,此時(shí),訪問(wèn)B服務(wù)時(shí),就會(huì)出現(xiàn)dll沖突問(wèn)題:
例如:
{:
類(lèi)似的錯(cuò)誤還有:
未能加載文件或程序集“***.dll”或它的某一個(gè)依賴項(xiàng)
運(yùn)行時(shí)如何快速定位到dll 沖突的根本原因,找到到底加載的dll是在GAC中、還是Bin中、還是指定目錄中的dll?
有經(jīng)驗(yàn)的老司機(jī),分享給大家一個(gè)三步法,屢試不爽?。?!
1. 找到程序主進(jìn)程,右鍵:Create Dump File,如果IIS站點(diǎn):指定應(yīng)用程序池下的w3wp進(jìn)程,如果自己的服務(wù)進(jìn)程,直接找進(jìn)程即可
2. 安裝指定版本的Windbg(X86\X64), Ctrl+D 加載第一步抓的Dump文件,.loadby sos clr -> !dumpdomain
3. 找到相關(guān)的dll文件路徑,ILSpy,反編譯定位問(wèn)題,解決。
show:
1. 抓dump:通過(guò)上面的錯(cuò)誤堆棧,我們定位到w3wp.exe, 右鍵創(chuàng)建轉(zhuǎn)儲(chǔ)文件
2. 安裝Windbg, 請(qǐng)根據(jù)程序的32/64版本下載安