最近在推广应用我们的分布式服务网关(Web Api):业务组大部分对外的业务逻辑以HSF服务或者自定义扩展插件的方式,注册并发布到分布式服务网关中,统一对外提供WebApi服务。临时介绍下我们的分布式服务网关:
1. 一键注册、发布WebApi服务,
2. 统一管理发布WebApi服务,实现WebApi的服务化治理
3. 集成安全认证、加解密、监控、日志等Aspect
4. 流量安全控制:流控
5. 横向伸缩、弹性扩展,支持大规模并发
6. 简化WebApi开发,提升开发效率,减少重复开发工作
在实际的开发应用中,业务逻辑dll要注册、发布到分布式服务网关中,例如参数类型、自定义扩展插件等。
每次业务的变更,都需要重新发布服务,例如实体类的注解(属性标签)发生变化,重新发布服务,分布式服务网关侦测到变化,重新加载。
同时,各个业务模块之间存在SPI层接口、实体类的依赖,例如:A中依赖B.Spi.dll, B发布了最新的B.Spi.dll, A未发布,这样会产生一个问题:
一个AppDomain中只能加载一个B.Spi.dll,如果先访问A服务,那么旧版本的B.Spi.dll就会先加载到AppDomain,此时,访问B服务时,就会出现dll冲突问题:
例如:
{:
类似的错误还有:
未能加载文件或程序集“***.dll”或它的某一个依赖项
运行时如何快速定位到dll 冲突的根本原因,找到到底加载的dll是在GAC中、还是Bin中、还是指定目录中的dll?
有经验的老司机,分享给大家一个三步法,屡试不爽!!!
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, 右键创建转储文件
2. 安装Windbg, 请根据程序的32/64版本下载安