微服務之路由網關—Nginx

Nginx 簡介
Nginx 是一款自由的、開源的、高性能的 HTTP 服務器和反向代理服務器,它具備有不少很是優
越的特性:web

  • 做爲 Web 服務器:
    相比 Apache , Nginx 使用更少的資源,支持更多的併發鏈接,體現更高的效率,這點使
Nginx 尤爲受到虛擬主機提供商的歡迎,可以支持高達 50,000 個併發鏈接數的響應。apache

  • 做爲負載均衡服務器:
    Nginx 既能夠在內部直接支持 Rails 和 PHP,也能夠支持做爲 HTTP 代理服務器對外進行服
務。Nginx 用 C 編寫,不管是系統資源開銷仍是 CPU 使用效率都比 Perlbal 要好的多。緩存

  • 做爲郵件代理服務器:
    Nginx 同時也是一個很是優秀的郵件代理服務器(最先開發這個產品的目的之一也是做爲
郵件代理服務器),Last.fm 描述了成功而且美妙的使用經驗。
    而在微服務中,每一個功能可能都是一個獨立的服務,若是經過傳統的方式配置每一個應用,配
置文件會變得很複雜多變,因此咱們須要服務的註冊與發現。服務器

註冊與發現的原理
服務的註冊與發現是經過服務註冊表實現的,應用端(每一個服務)經過配置文件向服務註冊
表提交本身的註冊信息,當服務啓動時,服務註冊表會檢索到該應用,並將該應用的網絡地
址添加到表中。一樣當服務終止,服務註冊表會刪除服務的地址。
服務註冊表是經過心跳機制實現的。當其餘應用訪問已註冊的服務時,負載均衡會經過服務
註冊表,實現服務的發現。網絡

爲何要使用 Nginx
微服務架構中,衆多服務被拆分解耦,並部署到不一樣的容器以及服務器中,你可能使用了一
個服務發現系統(例如 etcd 或 Eureka)或者一個資源管理框架來管理全部這些服務,可若是
你想讓你的用戶去從互聯網訪問你的某些微服務,你就必需使用一個反向代理服務器,從而
使你的衆多微服務可以被訪問到。
還有一個問題是當你擁有多個服務實例時,你但願可以輕鬆地鏈接到它們,將你的請求在它
們中高效地分發,並以最快的方式執行,因此不一樣服務實例之間的負載均衡也是很是重要的
問題。架構

而 Nginx 做爲一款優秀的反向代理服務器和負載均衡服務器,他的諸多優秀特性成爲了咱們
選擇他的緣由:併發

• 模塊化設計
  Nginx 採用高度模塊化設計,使得具備較好的擴展性,在 Nginx 中,除了少許的核心代
碼,其餘一切皆爲模塊。全部模塊間是分層次、分類別的,官方 Nginx 有五大類型的模塊:
核心模塊、配置模塊、事件模塊、HTTP 模塊、Mail 模塊。負載均衡

• 高可靠性
  高可靠性是指服務可靠性。Nginx 是一個高可靠性的 Web 服務器,這也是咱們爲何選
擇 Nginx 的基本條件。Nginx 採用一個主進程(master)和 N 個工做進程(worker)的工做模式,而
worker 進程纔是真正複製相應用戶請求的進程。配置了緩存時還會有緩存加載器進程
(cacheloader)和緩存管理器進程(cachemanager)等。全部進程均是僅含有一個線程,並主要通
過「共享內存」的機制實現進程間通訊。框架

• 支持熱部署
  Nginx 使用主進程和 worker 工做進程的機制,使得 Nginx 支持熱部署,這個熱部署包括不
中止服務更新配置文件、更新日誌文件、以及更新服務器程序版本,也稱爲平滑升級。異步

• 低內存消耗
  Nginx 對於內存的消耗是很是小的,特別是對於非活動鏈接。Nginx 對於非活動鏈接是
指,當咱們開啓持久鏈接功能時,用戶鏈接再也不發送數據後就會當即轉爲非活動鏈接,直到
持久鏈接超時時間到達才銷燬。在通常的狀況下,10000 個非活躍的 HTTPKeep-Alive 鏈接在
Nginx 中僅消耗 2.5M 的內存,這也是 Nginx 支持高併發鏈接的基礎。

• 高擴展性
  Nginx 的設計具備擴展性,它徹底是由多個不一樣功能、不一樣層次、不一樣類型且耦合度極低
的模塊組成。所以,當對某一個模塊修復 Bug 或進行升級時,能夠專一於模塊自身,無須在
意其餘。Nginx 支持磁盤異步 I/O(AIO)、內存映射機制(MMAP)、事件驅動機制(Event-
driven)、單線程 N 請求等等。

• 高併發
  Nginx 是異步非阻塞的。在須要進程等待的過程當中,這些閒置的進程就空閒出來待命,而
webserver 的工做性質決定了每一個 request 的大部份生命都是在網絡傳輸中,實際上花費在
server 機器上的時間片很少,所以就表現爲幾個進程解決了高併發的問題。

 

Nginx 架構

Nginx 在啓動後,會有一個 master 進程和多個 worker 進程。master 進程主要用來管理 worker
進程,並不處理網絡請求,主要負責調度工做進程,也就是圖示的三項:加載配置、啓動工
做進程及非停升級。

服務器實際處理網絡請求及響應的是工做進程(worker),在類 unix 系統上,Nginx 能夠配置
多個 worker,而每一個 worker 進程均可以同時處理數以千計的網絡請求。多個 worker 進程之
間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。一個請求,只可
能在一個 worker 進程中處理,一個 worker 進程,不可能處理其它進程的請求。worker 進程
的個數是能夠設置的,通常咱們會設置與機器 cpu 核數一致,這裏面的緣由與 Nginx 的進程
模型以及事件處理模型是分不開的。代理(proxy)設計,能夠說是 Nginx 深刻骨髓的設計,
不管是對於 HTTP,仍是對於 FastCGI、memcache、Redis 等的網絡請求或響應,本質上都採用
了代理機制。因此,Nginx 天生就是高性能的代理服務器。

Nginx 與 Tomcat 對比

• Nginx 優勢:
  負載均衡、反向代理、處理靜態文件有優點。Nginx 處理靜態請求的速度高於 apache。
• Tomcat 優勢:  動態解析服務器,處理動態請求,是編譯 JSP\Servlet 的容器,Nginx 有動態分離機制,靜態請求直接就能夠經過 Nginx 處理,動態請求才轉發請求到後臺交由 Tomcat 進行處理。

相關文章
相關標籤/搜索