在學習完前面的知識后,微服務架構已經初具雛形。但還有一些問題:不同的微服務一般會有不同的網絡地址,客戶端在訪問這些微服務時必須記住幾十甚至幾百個地址,這對於客戶端方來說太復雜也難以維護。如下圖:

如果讓客戶端直接與各個微服務通訊,可能會有很多問題:
客戶端會請求多個不同的服務,需要維護不同的請求地址,增加開發難度
在某些場景下存在跨域請求的問題
加大身份認證的難度,每個微服務需要獨立認證
因此,我們需要一個微服務網關,介於客戶端與服務器之間的中間層,所有的外部請求都會先經過微服務網關。客戶端只需要與網關交互,只知道一個網關地址即可,這樣簡化了開發還有以下優點:
1、易於監控
2、易於認證
3、減少了客戶端與各個微服務之間的交互次數

什么是微服務網關
API網關是一個服務器,是系統對外的唯一入口。API網關封裝了系統內部架構,為每個客戶端提供一個定制的API。API網關方式的核心要點是,所有的客戶端和消費端都通過統一的網關接入微服務,在網關層處理所有的非業務功能。通常,網關也是提供REST/HTTP的訪問API。服務端通過API-GW注冊和管理服務。
作用和應用場景
網關具有的職責,如身份驗證、監控、負載均衡、緩存、請求分片與管理、靜態響應處理。當然,最主要的職責還是與“外界聯系”。
常見的API網關實現方式
Kong
基於Nginx+Lua開發,性能高,穩定,有多個可用的插件(限流、鑒權等等)可以開箱即用。
問題:只支持Http協議;二次開發,自由擴展困難;提供管理API,缺乏更易用的管控、配置方式。
Zuul
Netflflix開源,功能豐富,使用JAVA開發,易於二次開發;需要運行在web容器中,如Tomcat。
問題:缺乏管控,無法動態配置;依賴組件較多;處理Http請求依賴的是Web容器,性能不如Nginx;
Traefifik
Go語言開發;輕量易用;提供大多數的功能:服務路由,負載均衡等等;提供WebUI
問題:二進制文件部署,二次開發難度大;UI更多的是監控,缺乏配置、管理能力;
Spring Cloud Gateway
SpringCloud提供的網關服務
Nginx+lua實現
使用Nginx的反向代理和負載均衡可實現對api服務器的負載均衡及高可用
問題:自注冊的問題和網關本身的擴展性