微服務開發與治理(二)


前言

         在微服務架構中,網關是介於客戶端和服務器端之間的中間層所有的外部請求都會先經過網關這一層。實現了統一集中管理api,避免客戶端直接與各個業務服務訪問同時對請求進行負載均衡權限認證、訪問控制和流量限制等。這次我將主要給大家分享我們用到的網關的選型依據和使用經驗。主要是從網關的作用網關框架選型、網關服務開發,以及我們遇到的問題和一些總結。

 

 

一、網關的作用

       網關作爲連接服務的消費方和服務提供方的中間件系統,將各自的業務系統的演進和發展做了天然的隔離,使業務系統更加專注於業務服務本身,同時網關還可以爲服務提供和沉澱更多附加功能,主要作用如下:

    

       網關是微服務架構的出現,不同的微服務一般有不同的網絡地址,而外部客戶端可能需要調用多個服務的接口才能完成完成一個業務需求,如果讓客戶端直接與各個業務服務訪問,會出現以下的問題

  1. 客戶端會多次請求不同的微服務,增加了客戶端的複雜性。
  2. 存在跨域請求,在一定場景下處理相對複雜
  3. 認證複雜,每個服務都需要獨立的認證。
  4. 難以重構,隨着項目的迭代。可能需要重新劃分微服務。如果客戶端與業務服務直接訪問,那麼重構將會很複雜。

 

  

二、網關框架選型

        網關架構

 

       網關是介於客戶端和服務器端之間的中間層,所有的外部請求都會先經過API網關這一層。也就是說,API網關可以完成安全、性能、監控等功能,而服務提供者可以專門的完成具體的業務邏輯。易於監控,可以在網關收集監控數據並將其推送到外部系統進行分析;易於認證,可以在網關進行認證,然後再將請求轉發到後端的微服務,而無需在每個微服務中進行認證;減少客戶端和各個微服務之間的交互次數。

常用網關

 

  SpringCloud的生態圈裏面有非常多優秀的工具

包括目前常用的微服務網關有zuul、Spring Cloud 

gateway,還有另一種選擇OpenResty。

 

       Why  OpenResty?

 

      OpenResty 爲什麼能實現網關呢? 有一個非常重要的因素是,對於每一個請求,OpenResty 會把請求分爲不同階段,從而可以讓第三方模塊通過掛載行爲來實現不同階段的自定義行爲。這種機制可以非常方便的設計api網關

    Nginx 本身在處理一個用戶請求時,會按照不同的階段進行處理,總共會分爲 11個階段。而 OpenResty 的執行指令,就是在這 11 個步驟中掛載 lua 執行腳本實現擴展,我們分別看看每個指令的作用。

initbylua : 當 Nginx master 進程加載 nginx 配置文件時會運行這段 lua 腳本,一般用來註冊全局變量或者預加載 lua 模塊

initwokerby_lua: 每個 Nginx worker 進程啓動時會執行的 lua 腳本,可以用來做健康檢查

setbylua:設置一個變量

rewritebylua:在 rewrite 階段執行,爲每個請求執行指定的 lua 腳本

accessbylua:爲每個請求在訪問階段調用 lua 腳本

contentbylua:前面演示過,通過 lua 腳本生成 content 輸出給 http 響應

balancerbylua:實現動態負載均衡,如果不是走 contentbylua,則走 proxy_pass,再通過 upstream 進行轉發

headerfilterby_lua: 通過 lua 來設置 headers 或者 cookie

bodyfilterby_lua:對響應數據進行過濾

logbylua : 在 log 階段執行的腳本,一般用來做數據統計,將請求數據傳輸到後端進行分析

  OpenResty優勢

 

先我們選擇使用OpenResty,其是由Nginx核心加很多第三方模塊組成,其最大的亮點是默認集成了Lua開發環境,使得Nginx可以作爲一個Web Server使用。利用 Nginx 的非阻塞 I/O 模型,不僅僅對 HTTP 客戶端請求,甚至於對遠程後端諸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都進行一致的高性能響應,使在Nginx上開發Web應用更方便更簡單。目前在京東如實時價格、秒殺、動態服務、單品頁、列表頁等都在使用Nginx+Lua架構,其他公司如淘寶、去哪兒網等。

 

      快速構建微服務網關

 

       網關用了OpenResty,是一個基於nginx的可伸縮的Web應用服務器,提供了很多高質量的第三方模塊,開發人員可以使用lua腳本調動nginx支持的各種C以及lua模塊。在性能方面,OpenResty可以快速構造出支持10k以上併發連接響應的高性能Web應用系統。OpenResty在本項目中,用於JWT權限校驗、Token超時時間更新、限流保護、無需登錄接口的加密串驗證。

、網關服務開發

 

       服務啓動時,將自己的節點信息註冊到etcd,包括:服務名稱、ip、端口網關服務從etcd監聽服務節點信息變更,並保存到緩存中,從客戶端請求的url中提取服務名稱,通過服務名稱查找節點信息,將請求轉發到後端服務

url規範

  1. 對外api前綴:/open/api/service_name/**,後端服務路由:/open/api/**
  2. 對內api前綴:/inner/api/service_name/**,後端服務路由:/**

例如/open/api/user/fav會轉發到user服務的/open/api/fav接口;/inner/api/user/info會轉發到user服務的/info接口。通過url規範我們就能很輕易的做api鑑權,而不需要將對外api和對內api部署成2個服務(當然也要考慮實際情況,是否符合實際項目要求)。

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章