<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是API網關 如何設計億萬級統一網關

fjYQ_ittbank ? 作者:工程師李察 ? 2018-11-02 10:45 ? 次閱讀

1.背景

1.1 什么是API網關

API網關可以看做系統與外界聯通的入口,我們可以在網關進行處理一些非業務邏輯的邏輯,比如權限驗證,監控,緩存,請求路由等等。

1.2 為什么需要API網關

RPC協議轉成HTTP。

由于在內部開發中我們都是以RPC協議(thrift or dubbo)去做開發,暴露給內部服務,當外部服務需要使用這個接口的時候往往需要將RPC協議轉換成HTTP協議。

請求路由

在我們的系統中由于同一個接口新老兩套系統都在使用,我們需要根據請求上下文將請求路由到對應的接口。

統一鑒權

對于鑒權操作不涉及到業務邏輯,那么可以在網關層進行處理,不用下層到業務邏輯。

統一監控

由于網關是外部服務的入口,所以我們可以在這里監控我們想要的數據,比如入參出參,鏈路時間。

流量控制,熔斷降級

對于流量控制,熔斷降級非業務邏輯可以統一放到網關層。

有很多業務都會自己去實現一層網關層,用來接入自己的服務,但是對于整個公司來說這還不夠。

1.3 統一API網關

統一的API網關不僅有API網關的所有的特點,還有下面幾個好處:

統一技術組件升級

在公司中如果有某個技術組件需要升級,那么是需要和每個業務線溝通,通常幾個月都搞不定。舉個例子如果對于入口的安全鑒權有重大安全隱患需要升級,如果速度還是這么慢肯定是不行,那么有了統一的網關升級是很快的。

統一服務接入

對于某個服務的接入也比較困難,比如公司已經研發出了比較穩定的服務組件,正在公司大力推廣,這個周期肯定也特別漫長,由于有了統一網關,那么只需要統一網關統一接入。

節約資源

不同業務不同部門如果按照我們上面的做法應該會都自己搞一個網關層,用來做這個事,可以想象如果一個公司有100個這種業務,每個業務配備4臺機器,那么就需要400臺機器。并且每個業務的開發RD都需要去開發這個網關層,去隨時去維護,增加人力。如果有了統一網關層,那么也許只需要50臺機器就可以做這100個業務的網關層的事,并且業務RD不需要隨時關注開發,上線的步驟。

2.統一網關的設計

2.1 異步化請求

對于我們自己實現的網關層,由于只有我們自己使用,對于吞吐量的要求并不高所以,我們一般同步請求調用即可。

對于我們統一的網關層,如何用少量的機器接入更多的服務,這就需要我們的異步,用來提高更多的吞吐量。對于異步化一般有下面兩種策略:

Tomcat/Jetty+NIO+servlet3

這種策略使用的比較普遍,京東,有贊,Zuul,都選取的是這個策略,這種策略比較適合HTTP。在Servlet3中可以開啟異步。

Netty+NIO

Netty為高并發而生,目前唯品會的網關使用這個策略,在唯品會的技術文章中在相同的情況下Netty是每秒30w+的吞吐量,Tomcat是13w+,可以看出是有一定的差距的,但是Netty需要自己處理HTTP協議,這一塊比較麻煩。

對于網關是HTTP請求場景比較多的情況可以采用Servlet,畢竟有更加成熟的處理HTTP協議。如果更加重視吞吐量那么可以采用Netty。

2.1.1 全鏈路異步

對于來的請求我們已經使用異步了,為了達到全鏈路異步所以我們需要對去的請求也進行異步處理,對于去的請求我們可以利用我們rpc的異步支持進行異步請求所以基本可以達到下圖:

由在web容器中開啟servlet異步,然后進入到網關的業務線程池中進行業務處理,然后進行rpc的異步調用并注冊需要回調的業務,最后在回調線程池中進行回調處理。

2.2 鏈式處理

在設計模式中有一個模式叫責任鏈模式,他的作用是避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。通過這種模式將請求的發送者和請求的處理者解耦了。在我們的各個框架中對此模式都有實現,比如servlet里面的filter,springmvc里面的Interceptor。

在Netflix Zuul中也應用了這種模式,如下圖所示:

這種模式在網關的設計中我們可以借鑒到自己的網關設計:

preFilters:前置過濾器,用來處理一些公共的業務,比如統一鑒權,統一限流,熔斷降級,緩存處理等,并且提供業務方擴展。

routingFilters: 用來處理一些泛化調用,主要是做協議的轉換,請求的路由工作。

postFilters: 后置過濾器,主要用來做結果的處理,日志打點,記錄時間等等。

errorFilters: 錯誤過濾器,用來處理調用異常的情況。

這種設計在有贊的網關也有應用。

2.3 業務隔離

上面在全鏈路異步的情況下不同業務之間的影響很小,但是如果在提供的自定義FiIlter中進行了某些同步調用,一旦超時頻繁那么就會對其他業務產生影響。所以我們需要采用隔離之術,降低業務之間的互相影響。

2.3.1 信號量隔離

信號量隔離只是限制了總的并發數,服務還是主線程進行同步調用。這個隔離如果遠程調用超時依然會影響主線程,從而會影響其他業務。因此,如果只是想限制某個服務的總并發調用量或者調用的服務不涉及遠程調用的話,可以使用輕量級的信號量來實現。有贊的網關由于沒有自定義filter所以選取的是信號量隔離。

2.3.2 線程池隔離

最簡單的就是不同業務之間通過不同的線程池進行隔離,就算業務接口出現了問題由于線程池已經進行了隔離那么也不會影響其他業務。在京東的網關實現之中就是采用的線程池隔離,比較重要的業務比如商品或者訂單 都是單獨的通過線程池去處理。但是由于是統一網關平臺,如果業務線眾多,大家都覺得自己的業務比較重要需要單獨的線程池隔離,如果使用的是Java語言開發的話那么,在Java中線程是比較重的資源比較受限,如果需要隔離的線程池過多不是很適用。如果使用一些其他語言比如Golang進行開發網關的話,線程是比較輕的資源,所以比較適合使用線程池隔離。

2.3.3 集群隔離

如果有某些業務就需要使用隔離但是統一網關又沒有線程池隔離那么應該怎么辦呢?那么可以使用集群隔離,如果你的某些業務真的很重要那么可以為這一系列業務單獨申請一個集群或者多個集群,通過機器之間進行隔離。

2.4 請求限流

流量控制可以采用很多開源的實現,比如阿里最近開源的Sentinel和比較成熟的Hystrix。

一般限流分為集群限流和單機限流:

利用統一存儲保存當前流量的情況,一般可以采用Redis,這個一般會有一些性能損耗。

單機限流:限流每臺機器我們可以直接利用Guava的令牌桶去做,由于沒有遠程調用性能消耗較小。

2.5 熔斷降級

這一塊也可以參照開源的實現Sentinel和Hystrix,這里不是重點就不多提了。

2.6 泛化調用

泛化調用指的是一些通信協議的轉換,比如將HTTP轉換成Thrift。在一些開源的網關中比如Zuul是沒有實現的,因為各個公司的內部服務通信協議都不同。比如在唯品會中支持HTTP1,HTTP2,以及二進制的協議,然后轉化成內部的協議,淘寶的支持HTTPS,HTTP1,HTTP2這些協議都可以轉換成,HTTP,HSF,Dubbo等協議。

2.6.1泛化調用

如何去實現泛化調用呢?由于協議很難自動轉換,那么其實每個協議對應的接口需要提供一種映射。簡單來說就是把兩個協議都能轉換成共同語言,從而互相轉換。

一般來說共同語言有三種方式指定:

json:json數據格式比較簡單,解析速度快,較輕量級。在Dubbo的生態中有一個HTTP轉Dubbo的項目是用JsonRpc做的,將HTTP轉化成JsonRpc再轉化成Dubbo。

比如可以將一個 www.baidu.com/id = 1 GET 可以映射為json:

代碼塊



{

“method”:"getBaidu"

"param":{

"id":1

}

}

xml:xml數據比較重,解析比較困難,這里不過多討論。

自定義描述語言:一般來說這個成本比較高需要自己定義語言來進行描述并進行解析,但是其擴展性,自定義個性化性都是最高。例:spring自定義了一套自己的SPEL表達式語言

對于泛化調用如果要自己設計的話JSON基本可以滿足,如果對于個性化的需要特別多的話倒是可以自己定義一套語言。

2.7 管理平臺

上面介紹的都是如何實現一個網關的技術關鍵。這里需要介紹網關的一個業務關鍵。有了網關之后,需要一個管理平臺如何去對我們上面所描述的技術關鍵進行配置,包括但不限于下面這些配置:

限流

熔斷

緩存

日志

自定義filter

泛化調用

3.總結

最后一個合理的標準網關應該按照如下去實現:

什么是API網關 如何設計億萬級統一網關

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 網關
    +關注

    關注

    9

    文章

    3343

    瀏覽量

    50189
  • API
    API
    +關注

    關注

    2

    文章

    1416

    瀏覽量

    61132

原文標題:有史以來最強的5G入門科普!

文章出處:【微信號:ittbank,微信公眾號:ittbank】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Profinet轉RS232網關與固定式條碼槍的應用

    Profinet轉RS232網關可以實現RS232接口的設備與Profinet網絡之間的通信。這包括各種儀表、變頻器、綜保、軟啟動器等設備,使其可以接入到S71500、S71200
    發表于 01-11 17:08

    API信息全掌控,方便你的日志管理——阿里云推出API網關打通日志服務

    支持用戶實時在線的SQL查詢。 多維度自定義統計:日志服務還支持基于日志和用戶的SQL自定義創建報表,自動生成,API網關還為用戶預設些很重要的數據報表。在服務國內的用戶的功能和開發方面,阿里云顯然
    發表于 02-06 15:24

    請問為什么以太網網關和DNS的地址樣?

    臺以太設備有如下信息:IP地址:172.24.1.1DNS:172.24.1.100網關:172.24.1.100這里面的 網關 為什么和DNS的地址
    發表于 04-16 07:56

    linux雙網卡雙網關實現

    192.168.1.1 eth0 #1.0段走192.168.1.1網關走 eth0為要走的網卡。 route add -net 192.168.2.0/24 gw 192.168.2.254 eth1 #2.0
    發表于 07-05 08:39

    Modbus Tcp轉Profinet網關連接施耐德PLC配置案例

    Modbus]本案例是開疆智能Modbus TCP轉Profinet網關連接施耐德PLC的配置案例用到的設備為西門子1200PLC臺,KJ-PNG-106網關個,施耐德PLC
    發表于 11-22 18:18

    基于ESP32的小網關有哪些性能

    提示:今天分享的ESP32小網關,是深圳市啟明云端有限公司推出的基于ESP32系列的嵌入式串口轉以太模塊,模塊內部集成了優化過的TCP/IP協議棧的WT32-ETH01模塊WT32-ETH01-
    發表于 12-16 07:14

    profinet轉canopen網關連接施耐德變頻器配置案例

    轉換KJ-PNG-205網關、施耐德變頻器、PC電腦部;1.打開西門子專用的配置軟件(博圖,Step7等);2.選擇新建項目,在管理通用站中添加Profinet轉CanOpen網關的GSD文件;3.
    發表于 04-11 19:29

    配置案例丨Profinet轉Canopen網關連接施耐德變頻器

    轉換KJ-PNG-205網關、施耐德變頻器、PC電腦部; 1、打開西門子專用的配置軟件(博圖,Step7等); 2、選擇新建項目,在管理通用站中添加Profinet轉CanOpen網關的GSD文件
    發表于 04-12 14:33

    什么是API網關為什么需要API網關

    API網關可以看做系統與外界聯通的入口,我們可以在網關進行處理一些非業務邏輯的邏輯,比如權限驗證,監控,緩存,請求路由等等。
    發表于 12-23 09:57 ?1.2w次閱讀
    什么是<b class='flag-5'>API</b><b class='flag-5'>網關</b>為什么需要<b class='flag-5'>API</b><b class='flag-5'>網關</b>

    關于API網關策略的知識分享

    近些年隨著云原生和微服務架構的日趨發展,API 網關以流量入口的角色在技術架構中扮演著越來越重要的作用。API 網關主要負責接收所有請求的流量并進行處理轉發至上游服務,
    的頭像 發表于 02-11 10:45 ?963次閱讀

    API 網關詳細介紹(上)

    業界有很多流行的 API 網關,開源的有 Nginx、Netflix Zuul、Kong 等。當然 Kong 還有商業版,類似的商業版網關還有 GoKu API Gateway 和 T
    的頭像 發表于 05-04 17:28 ?1273次閱讀
    <b class='flag-5'>API</b> <b class='flag-5'>網關</b>詳細介紹(上)

    API 網關詳細介紹(下)

    業界有很多流行的 API 網關,開源的有 Nginx、Netflix Zuul、Kong 等。當然 Kong 還有商業版,類似的商業版網關還有 GoKu API Gateway 和 T
    的頭像 發表于 05-04 17:28 ?632次閱讀
    <b class='flag-5'>API</b> <b class='flag-5'>網關</b>詳細介紹(下)

    為什么需要 API 網關?

    API 網關API 全生命周期管理的關鍵基礎組件,負責生產環境中 API 的配置、發布、版本回滾、安全、負載均衡等。API
    的頭像 發表于 05-04 17:47 ?575次閱讀
    為什么需要 <b class='flag-5'>API</b> <b class='flag-5'>網關</b>?

    企業怎么選擇API網關

    、騰訊公司的QQ開發平臺、微信開放平臺。 Open API開放平臺必然涉及到客戶應用的接入、API權限的管理、調用次數管理等,必然會有一個統一的入口進行管理,這正是API
    的頭像 發表于 05-23 11:05 ?424次閱讀
    企業怎么選擇<b class='flag-5'>API</b><b class='flag-5'>網關</b>

    api網關 kong 教程入門

    統一權限控制、接口請求訪問日志統計 安全,是保護內部服務而設計的一道屏障 開源-最大好處 當然也有一個很大的缺點,api-gw很可能成為性能瓶頸,因為所有的請求都經過這里,可以通過橫向擴展和限流解決這個問題。 在眾多API G
    的頭像 發表于 11-10 11:39 ?359次閱讀
    <b class='flag-5'>api</b><b class='flag-5'>網關</b> kong 教程入門
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>