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