Http Server API路由请求到web程序
引言
接上文,容器內web程序一般會綁定到http://0.0.0.0:{某監聽端口}或http://+:{某監聽端口},以確保使用容器IP可以訪問到web應用。
正如我們在ASP.NET Core官方鏡像顯示的,ASP.NET Core程序在容器內80端口監聽請求
This image sets the ASPNETCORE_URLS environment variable to http://+:80 which means that if you have not explicity set a URL in your application, via app.UseUrl in your Program.cs for example, then your application will be listening on port 80 inside the container.
http://+:80是什么鬼?請求為什么會被路由到監聽http://+:80地址的web服務器?
UrlPrefix
這里涉及一個不為人知的概念:UrlPrefix
UrlPrefix是統一資源定位符Url的前綴部分:scheme://host:port/relativeURI
"https://www.adatum.com:80/vroot/"
"https://adatum.com:443/secure/database/"
"http://+:80/vroot/"
web程序啟動后,根據監聽地址UrlPrefix中的主機元素,會向系統組件Http Server API注冊不同的路由桶,由Http Server API將接收的請求路由到合適的web程序。
容器內web程序監聽http://+:80地址,+ 是強通配符,意味著web程序在容器(輕量級虛擬機)內以任意主機名監聽80端口的請求。
監聽地址UrlPrefix 中的主機元素有四種形態:
強通配符 ( + )
當主機元素是一個加號(+),UrlPrefix匹配所有可能的主機名,這時的UrlPrefix屬于強通配符類別。
強通配符在如下場景下有用:當web程序要忽略請求到達的方式或忽略請求host標頭中指定的站點時,web服務器監聽地址的主機元素可設置為強通配符+
顯式主機名
當主機元素是完全限定的域名,web服務器的主機元素直接與傳入請求的host標頭相匹配, 明確的主機名對于多站點很有用,這些Web站點根據請求所指向的站點傳遞不同的內容。
綁定IP的弱通配符
主機元素為IP地址,這種類型的UrlPrefix匹配尚未與以上強通配符或顯式主機名匹配的任意IP地址主機名
弱通配符 ( * )
當星號*作為主機元素出現時, 這種類型的UrlPrefix將會匹配尚未與以上強通配符、顯式或IP綁定的弱通配符匹配的任意主機名, 此主機元素可以用作默認的catch-all,也可以用于指定URL名稱空間的較大部分,而不必使用許多UrlPrefixes
Http Server API維護了一張路由表,決定哪一個應用程序接收傳入請求,這張路由表是從預留數據庫中構建的,當新產生一個注冊項或預留項,將會被放進與特定主機元素相關的路由桶
路由桶優先級
當多個web程序監聽的UrlPrefix有重疊時,Http Server API會根據注冊的1-->4路由桶依次匹配,路由桶中UrlPrefix的相對URI部分中最長的匹配(假設URL的主機,端口和方案部分完全匹配)是最佳匹配。在路由桶中找到匹配項后,路由算法將停止搜索并跳過所有優先級較低的存儲桶。
例如下面的注冊項:
注冊項: https://+:80/vroot/ is registered by app1
注冊項: https://adatum.com:80/ is registered by app2
注冊項: https://*:80/ is registered by app3
對https://adatum.com:80/vroot/subdir/file.htm/的傳入請求路由給 app1,
對https://adatum.com:80/default.htm/的傳入請求路由給 app2,
對https://otheradatum.com:80/file.htm/的傳入請求路由給 app3
總結
HTTP Sever API 提供了將請求路由到web程序的機制
應用程序監聽地址UrlPrefix的主機元素決定了路由策略,其中+強通配符 表示忽略請求主機名和請求的方式,可以認為是囫圇吞棗的接收滿足(scheme、port、relativeUrl)的請求。
多個web程序監聽的UrlPrefix有重疊時,Http Server API根據host元素形成的路由桶有優先級
這應該是一篇很冷門的知識點,但是結合我們的實際和理論,相信能給讀者的知識結構添磚加瓦。
https://docs.microsoft.com/zh-cn/windows/win32/http/urlprefix-strings?redirectedfrom=MSDN
https://docs.microsoft.com/en-us/windows/win32/http/routing-incoming-requests
https://stackoverflow.com/questions/7007929/what-does-a-plus-sign-mean-in-a-http-url-http-80
推薦閱讀
●?這么香的Chrome插件,你都安裝了嗎?
●?一文掌握Cookies前世今生
●?ASP.NET Core跨平臺技術內幕
●?TPL Dataflow組件應對高并發,低延遲要求
●?實例解讀Docker Swarm
●?基于docker-compose的Gitlab CI/CD實踐&排坑指南
總結
以上是生活随笔為你收集整理的Http Server API路由请求到web程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十问十答 CDDL 许可证
- 下一篇: 百万年薪程序员的7点能力