背景描述:
在IIS上部署了netcore应用程序,在更新netcore程序时,会造成更新期间1分钟左右服务停止不可用的情况。为了提高系统可用性,采用consul多数据中心方式,在consul上挂载了3个netcore应用程序,最终通过网关(基于ocelot)提供对外服务。

在系统更新期间又遇到了一个问题:在IIS上挂载的netcore应用程序不会随IIS启动而自动启动,必须通过浏览访问触发启动。启动后才能向consul注册。
因此每次更新程序后,netcore程序无法向consul注册,因为netcore无法自动启动。
第一次解决方案(失败),在停止netcore应用程序的时候, 不注销在consul的服务

看起来没问题了,停止IIS的时候,consul注册的服务由于健康检查会变成红色的xx

等到IIS启动的时候,通过健康检查,又会恢复这个节点。
但是!出现了另一个问题。
在IIS停止到健康检查间隔的这几秒中,如果发生了请求,consul认为服务是正常的,而实际这个节点无法访问,这样就造成了几秒钟的服务不可用。
看起来跟第一次比较,我们把服务的不可用性从1分钟缩短到了几秒钟。但还不够,还需要优化!
最终解决方案(成功),通过IIS预加载,实现启动IIS的时候,自动启动netcore程序。
- 
首先我们取消之前的注释 
 image.png
- 
在控制面板 - 启用或关闭Windows功能,勾选应用程序初始化,这个很重要,一定要勾选,我之前没勾选,按照网上流程走完还是无法自动启动netcore。 
 image.png
- 
IIS应用程序池配置以下3个 
 image.png
- 
网站高级设置,勾选预加载已启用 
 image.png
- 配置管理器配置如下 

选择节点:system.webServer/applicationInitialization
勾选doAooInitAfterRestart = true
集合添加启动时要启动的页面,hostname我们就配置当前网站ip和端口,页面就/就好了。

- 应用,完成!
这个时候停止IIS,consul的服务会立即注销,启动后consul的服务又会重新注册上去!
参考文档:
https://www.pianshen.com/article/96961627195/
https://weblog.west-wind.com/posts/2016/Jun/06/Publishing-and-Running-ASPNET-Core-Applications-with-IIS



