<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天內不再提示

5種主流API網關技術選型

jf_ro2CN3Fa ? 來源:樓仔 ? 2023-04-17 10:45 ? 次閱讀

前 言

微服務近幾年非?;?,圍繞微服務的技術生態也比較多,比如微服務網關、Docker、Kubernetes等。

我是于2019年開始接觸微服務網關,當時和公司的一位同事一起開發,由于技術能力有限,我只負責網關后臺,后續微服務網關的迭代,我其實沒有參與,不過后來抽空看了微服務網關前臺的代碼,所以對這套微服務網關的實現原理算是基本掌握。

最近在寫技術棧相關的文章,剛好寫到微服務網關,就把之前學習的知識進行簡單總結,同時也把市面上常用的微服務網關進行梳理,一方面便于后續技術選型,另一方面也算是給自己一個交代。下面是文章目錄:

8f06cade-dc4f-11ed-bfe3-dac502259ad0.jpg

API網關基礎

什么是API網關

API網關是一個服務器,是系統的唯一入口。 從面向對象設計的角度看,它與外觀模式類似。

API網關封裝了系統內部架構,為每個客戶端提供一個定制的API。它可能還具有其它職責,如身份驗證、監控、負載均衡、緩存、協議轉換、限流熔斷、靜態響應處理。

API網關方式的核心要點是,所有的客戶端和消費端都通過統一的網關接入微服務, 在網關層處理所有的非業務功能。通常,網關也是提供REST/HTTP的訪問API。

網關的主要功能

微服務網關作為微服務后端服務的統一入口,它可以統籌管理后端服務,主要分為數據平面和控制平面:

數據平面主要功能是接入用戶的HTTP請求和微服務被拆分后的聚合。使用微服務網關統一對外暴露后端服務的API和契約,路由和過濾功能正是網關的核心能力模塊。另外,微服務網關可以實現攔截機制和專注跨橫切面的功能,包括協議轉換、安全認證、熔斷限流、灰度發布、日志管理、流量監控等。

控制平面主要功能是對后端服務做統一的管控和配置管理。例如,可以控制網關的彈性伸縮;可以統一下發配置;可以對網關服務添加標簽;可以在微服務網關上通過配置Swagger功能統一將后端服務的API契約暴露給使用方,完成文檔服務,提高工作效率和降低溝通成本。

8f3025f0-dc4f-11ed-bfe3-dac502259ad0.jpg

路由功能: 路由是微服務網關的核心能力。通過路由功能微服務網關可以將請求轉發到目標微服務。在微服務架構中,網關可以結合注冊中心的動態服務發現,實現對后端服務的發現,調用方只需要知道網關對外暴露的服務API就可以透明地訪問后端微服務。

負載均衡: API網關結合負載均衡技術,利用Eureka或者Consul等服務發現工具,通過輪詢、指定權重、IP地址哈希等機制實現下游服務的負載均衡。

統一鑒權: 一般而言,無論對內網還是外網的接口都需要做用戶身份認證,而用戶認證在一些規模較大的系統中都會采用統一的單點登錄(Single Sign On)系統,如果每個微服務都要對接單點登錄系統,那么顯然比較浪費資源且開發效率低。API網關是統一管理安全性的絕佳場所,可以將認證的部分抽取到網關層,微服務系統無須關注認證的邏輯,只關注自身業務即可。

協議轉換: API網關的一大作用在于構建異構系統,API網關作為單一入口,通過協議轉換整合后臺基于REST、AMQP、Dubbo等不同風格和實現技術的微服務,面向Web Mobile、開放平臺等特定客戶端提供統一服務。

指標監控: 網關可以統計后端服務的請求次數,并且可以實時地更新當前的流量健康狀態,可以對URL粒度的服務進行延遲統計,也可以使用Hystrix Dashboard查看后端服務的流量狀態及是否有熔斷發生。

限流熔斷 在某些場景下需要控制客戶端的訪問次數和訪問頻率,一些高并發系統有時還會有限流的需求。在網關上可以配置一個閾值,當請求數超過閾值時就直接返回錯誤而不繼續訪問后臺服務。當出現流量洪峰或者后端服務出現延遲或故障時,網關能夠主動進行熔斷,保護后端服務,并保持前端用戶體驗良好。

黑白名單: 微服務網關可以使用系統黑名單,過濾HTTP請求特征,攔截異??蛻舳说恼埱?,例如DDoS攻擊等侵蝕帶寬或資源迫使服務中斷等行為,可以在網關層面進行攔截過濾。比較常見的攔截策略是根據IP地址增加黑名單。在存在鑒權管理的路由服務中可以通過設置白名單跳過鑒權管理而直接訪問后端服務資源。

灰度發布: 微服務網關可以根據HTTP請求中的特殊標記和后端服務列表元數據標識進行流量控制,實現在用戶無感知的情況下完成灰度發布。

流量染色: 和灰度發布的原理相似,網關可以根據HTTP請求的Host、Head、Agent等標識對請求進行染色,有了網關的流量染色功能,我們可以對服務后續的調用鏈路進行跟蹤,對服務延遲及服務運行狀況進行進一步的鏈路分析。

文檔中心: 網關結合Swagger,可以將后端的微服務暴露給網關,網關作為統一的入口給接口的使用方提供查看后端服務的API規范,不需要知道每一個后端微服務的Swagger地址,這樣網關起到了對后端API聚合的效果。

日志審計: 微服務網關可以作為統一的日志記錄和收集器,對服務URL粒度的日志請求信息和響應信息進行攔截。

API網關選型

常用API網關

先簡單看一下市面上常用的API網關:

8f5bc002-dc4f-11ed-bfe3-dac502259ad0.jpg

Nginx

Nginx是一個高性能的HTTP和反向代理服務器。Nginx一方面可以做反向代理,另外一方面可以做靜態資源服務器,接口使用Lua動態語言可以完成靈活的定制功能 。

Nginx 在啟動后,會有一個 Master 進程和多個 Worker 進程,Master 進程和 Worker 進程之間是通過進程間通信進行交互的,如圖所示。Worker 工作進程的阻塞點是在像 select()、epoll_wait() 等這樣的 I/O 多路復用函數調用處,以等待發生數據可讀 / 寫事件。Nginx 采用了異步非阻塞的方式來處理請求,也就是說,Nginx 是可以同時處理成千上萬個請求的。

Zuul

Zuul 是 Netflix 開源的一個API網關組件,它可以和 Eureka、Ribbon、Hystrix 等組件配合使用。社區活躍,融合于 SpringCloud 完整生態,是構建微服務體系前置網關服務的最佳選型之一。

Zuul 的核心是一系列的過濾器,這些過濾器可以完成以下功能:

統一鑒權 + 動態路由 + 負載均衡 + 壓力測試

審查與監控: 與邊緣位置追蹤有意義的數據和統計結果,從而帶來精確的生產視圖。

多區域彈性: 跨越 AWS Region 進行請求路由,旨在實現 ELB(Elastic Load Balancing,彈性負載均衡)使用的多樣化,以及讓系統的邊緣更貼近系統的使用者。

Zuul 目前有兩個大的版本:Zuul1 和 Zuul2

Zuul1 是基于 Servlet 框架構建,如圖所示,采用的是阻塞和多線程方式,即一個線程處理一次連接請求,這種方式在內部延遲嚴重、設備故障較多情況下會引起存活的連接增多和線程增加的情況發生。

8f7a2e0c-dc4f-11ed-bfe3-dac502259ad0.jpg

Netflix 發布的 Zuul2 有重大的更新,它運行在異步和無阻塞框架上,每個 CPU 核一個線程,處理所有的請求和響應,請求和響應的生命周期是通過事件和回調來處理的,這種方式減少了線程數量,因此開銷較小。

8f9c4bae-dc4f-11ed-bfe3-dac502259ad0.jpg

Spring Cloud GetWay

Spring Cloud Gateway 是Spring Cloud的一個全新的API網關項目,目的是為了替換掉Zuul1,它基于Spring5.0 + SpringBoot2.0 + WebFlux(基于?性能的Reactor模式響應式通信框架Netty,異步?阻塞模型)等技術開發,性能?于Zuul,官?測試,Spring Cloud GateWay是Zuul的1.6倍 ,旨在為微服務架構提供?種簡單有效的統?的API路由管理?式。

Spring Cloud Gateway可以與Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等組件配合使用,實現路由轉發、負載均衡、熔斷、鑒權、路徑重寫、?志監控等,并且Gateway還內置了限流過濾器,實現了限流的功能 。

8fc0e27a-dc4f-11ed-bfe3-dac502259ad0.jpg

Kong

Kong是一款基于OpenResty(Nginx + Lua模塊)編寫的高可用、易擴展的,由Mashape公司開源的API Gateway項目。Kong是基于NGINX和Apache Cassandra或PostgreSQL構建的 ,能提供易于使用的RESTful API來操作和配置API管理系統,所以它可以水平擴展多個Kong服務器,通過前置的負載均衡配置把請求均勻地分發到各個Server,來應對大批量的網絡請求。

8fe25270-dc4f-11ed-bfe3-dac502259ad0.jpg

Kong主要有三個組件:

Kong Server : 基于Nginx的服務器,用來接收API請求。

Apache Cassandra/PostgreSQL : 用來存儲操作數據。

Kong dashboard: 官方推薦UI管理工具,也可以使用 restfull 方式管理admin api。

Kong采用插件機制進行功能定制,插件集(可以是0或N個)在API請求響應循環的生命周期中被執行。插件使用Lua編寫,目前已有幾個基礎功能:HTTP基本認證、密鑰認證、CORS(Cross-Origin Resource Sharing,跨域資源共享)、TCP、UDP、文件日志、API請求限流、請求轉發以及Nginx監控。

8ffca17a-dc4f-11ed-bfe3-dac502259ad0.jpg

Kong網關具有以下的特性:

可擴展性: 通過簡單地添加更多的服務器,可以輕松地進行橫向擴展,這意味著您的平臺可以在一個較低負載的情況下處理任何請求;

模塊化: 可以通過添加新的插件進行擴展,這些插件可以通過RESTful Admin API輕松配置;

在任何基礎架構上運行: Kong網關可以在任何地方都能運行。您可以在云或內部網絡環境中部署Kong,包括單個或多個數據中心設置,以及public,private 或invite-only APIs。

Traefik

Tr?f?k 是一個為了讓部署微服務更加便捷而誕生的現代HTTP反向代理、負載均衡工具。它支持多種后臺 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 來自動化、動態的應用它的配置文件設置。

901be990-dc4f-11ed-bfe3-dac502259ad0.jpg

重要特性:

它非???,無需安裝其他依賴,通過Go語言編寫的單一可執行文件;

多種后臺支持:Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd;

支持支持Rest API、Websocket、HTTP/2、Docker鏡像;

監聽后臺變化進而自動化應用新的配置文件設置;

配置文件熱更新,無需重啟進程;

后端斷路器、負載均衡、容錯機制;

清爽的前端頁面,可監控服務指標。

API網關對比

90455bc2-dc4f-11ed-bfe3-dac502259ad0.jpg906ba340-dc4f-11ed-bfe3-dac502259ad0.jpg908c70a2-dc4f-11ed-bfe3-dac502259ad0.jpg

上面是網關對比截圖,偷個懶,大家主要關注Kong、Traefik和Zuul即可:

開源社區活躍度 來看,無疑是Kong和Traefik較好;

成熟度 來看,較好的是Kong、Tyk、Traefik;

性能 來看,Kong要比其他幾個領先一些;

架構優勢 的擴展性來看,Kong、Tyk有豐富的插件,Ambassador也有插件但不多,而Zuul是完全需要自研,但Zuul由于與Spring Cloud深度集成,使用度也很高,近年來Istio服務網格的流行,Ambassador因為能夠和Istio無縫集成也是相當大的優勢。

下面是其它網友的思考結論,可供參考:

性能: Nginx+Lua形式必然是高于Java語言實現的網關的,Java技術棧里面Zuul1.0是基于Servlet實現的,剩下都是基于webflux實現,性能是高于基于Servlet實現的。在性能方面我覺得選擇網關可能不算那么重要,多加幾臺機器就可以搞定。

可維護性和擴展性: Nginx+Lua這個組合掌握的人不算多,如果團隊有大神,大佬們就隨意了,當沒看到這段話,對于一般團隊來說的話,選擇自己團隊擅長的語言更重要。Java技術棧下的3種網關,對于Zuul和Spring Cloud Getway需要或多或少要搞一些集成和配置頁面來維護,但是對于Soul我就無腦看看文章,需要哪個搬哪個好了,尤其是可以無腦對接Dubbo美滋滋,此外Soul2.0以后版本可以擺脫ZK,在我心里再無詬病,我就喜歡無腦操作。

高可用: 對于網關高可用基本都是統一的策略都是采用多機器部署的方式,前面掛一個負載,對于而外需要用的一些組件大家注意一下。

基于Traefik自研的微服務網關

技術棧選型

Traefik: 一款開源的反向代理與負載均衡工具,它最大的優點是能夠與常見的微服務系統直接整合,可以實現自動化動態配置。traefik較為輕量,非常易于使用和設置,性能比較好,已在全球范圍內用于生產環境。

Etcd: 一個Go言編寫的分布式、高可用的一致性鍵值存儲系統,用于提供可靠的分布式鍵值存儲、配置共享和服務發現等功能。

Go: 并發能力強,性能媲美C,處理能力是PHP的4倍,效率高,語法簡單,易上手,開發效率接近PHP。

90a8e3fe-dc4f-11ed-bfe3-dac502259ad0.jpg

網關框架

整個網關框架分為3塊:

網關后臺(hal-fe和hal-admin): 用于應用、服務和插件的配置,然后將配置信息發布到ETCD;

Traefik: 讀取ETCD配置,根據配置信息對請求進行路由分發,如果需要鑒權,會直接通過hal-agent模塊進行統一鑒權。鑒權完畢后,如果是Http請求,直接打到下游服務,如果是Grpc和Thrift協議,會通過hal-proxy模塊進行協議轉換。

協議轉換模塊: 讀取ETCD配置,對Traefik分發過來的請求,進行Grpc和Thrift協議轉換,并通過服務發現機制,獲取服務下游機器,并通過負載均衡,將轉換后的數據打到下游服務機器。

90c7640a-dc4f-11ed-bfe3-dac502259ad0.jpg

網關后臺

主要由3大模塊組成:

應用: 主要包括應用名、域名、路徑前綴、所屬組、狀態等,比如印度海外商城、印度社區;

服務: 主要包括服務名、注冊方式、協議類型、所屬組、狀態等,比如評論服務、地址服務、搜索服務。

插件: 主要包括插件名稱、插件類型、插件屬性配置等,比如路徑前綴替換插件、鑒權插件。

90e1ced0-dc4f-11ed-bfe3-dac502259ad0.jpg

一個應用只能綁定一個服務,但是可以綁定多個插件。 通過后臺完成網關配置后,將這些配置信息生成Config文件,發布到ETCD中,Config文件需要遵循嚴格的數據格式,比如Traefix配置需要遵循官方的文件配置格式,才能被Traefik識別。

91035f32-dc4f-11ed-bfe3-dac502259ad0.jpg

協議轉換模塊

hal-proxy模塊是整個微服務網關最復雜,也是技術含量最高的模塊,所以給大家詳細講解一下。

問題引入

在講這個模塊前,我們先看下面幾個問題:

當請求從上游的trafik過來時,需要知道訪問下游的機器IP和端口,才能將請求發送給下游,這些機器如何獲取呢?

有了機器后,我們需要和下游機器建立連接,如果連接用一次就直接釋放,肯定對服務會造成很大的壓力,這就需要引入Client緩存池,那這個Client緩存池我們又該如何實現呢?

最后就是需要對協議進行轉換,因為不同的下游服務,支持的協議類型是不一樣的,這個網關又是如何動態支持的呢?

913a0442-dc4f-11ed-bfe3-dac502259ad0.jpg

實現原理

91663af8-dc4f-11ed-bfe3-dac502259ad0.jpg

我們還是先看一下hal-proxy內部有哪些模塊,首先是Resolver模塊,這個模塊的是什么作用呢?這里我簡單介紹一下,目前公司內部通過服務獲取到機器列表的方式有多種,比如MIS平臺、服務樹等,也就是有的是通過平臺配置的,有的是直接掛在服務樹下,無論哪種方式,我們都通過服務名,通過一定的方式,找到該服務下面所有的主機。

所以Resolver模塊的作用,其實就是通過服務名,找到該服務下的所有機器的IP和服務端口,然后持久化到內存中,并定時更新。

協議模塊就是支持不同的協議轉換,每個協議類型的轉換,都需要單獨實現,這些協議轉換,無非就是先通過機器IP和端口初始化Client,然后再將數據進行轉換后,直接發送到下游的機器。

最后就是連接池,之前我們其實也用到go自帶的pool來做,但是當對pool數據進行更新時,需要加鎖,所以性能一直起不來,后來改成了環形隊列,然后對數據的操作全部通過原子操作方式,就實現了無鎖操作,大大提高的并發性能 。

實現邏輯

這個是hal-proxy的邏輯實現圖,畫了2天,包含所有核心對象的交互方式,這里就不去細講,能掌握多少,靠大家自己領悟,如果有任何疑問(或者看不清圖片),可以關注我公眾號,加我微信溝通。

918a4010-dc4f-11ed-bfe3-dac502259ad0.jpg






審核編輯:劉清

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

    關注

    3

    文章

    153

    瀏覽量

    22951
  • URL
    URL
    +關注

    關注

    0

    文章

    135

    瀏覽量

    14900
  • HTTP協議
    +關注

    關注

    0

    文章

    55

    瀏覽量

    9644
  • API接口
    +關注

    關注

    1

    文章

    80

    瀏覽量

    10352
  • docker容器
    +關注

    關注

    0

    文章

    28

    瀏覽量

    3291

原文標題:5 種主流API網關技術選型,yyds!

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

收藏 人收藏

    評論

    相關推薦

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

    具有很大優勢。而目前同類國內云廠商的同產品,要么功能上差距較大,日志輸出能力尚未提供,要么尚未支持API網關產品。阿里云表示,為了釋放更多技術紅利,普惠廣大云計算產品用戶,日志服務每月512M免費
    發表于 02-06 15:24

    幾種主流室內定位技術比較,誰更厲害?

    內定位的技術路徑,在技術選型中確保能夠正確選擇合適的室內定位技術,避免做出錯誤的方向性選擇,從而更好的選擇所需的室內定位技術,滿足業務需要。
    發表于 07-27 17:41

    5G邊緣計算網關的優勢

    行業領域。??計訊物聯邊緣計算網關的功能??采用Arm架構高端處理器;標準Linux系統,集成Python開發環境和C語言開發環境,提供標準API接口及開發指導,為用戶的二次應用開發提供穩定快捷的平臺
    發表于 09-06 09:59

    如何去實現一無線智能家庭網關控制技術?

    怎樣去設計無線智能家庭網關控制技術的結構?如何去實現一無線智能家庭網關控制技術?
    發表于 05-27 06:35

    什么是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網關層實現這些安全機制,不但提高安全性,也簡化了應用服務的開發。使開發人員專注于業務應用、業務服務的研發,不再考慮基礎能力基礎組件,提升開發部署的效率,從而提升收益率。
    的頭像 發表于 02-01 01:05 ?5164次閱讀
    基于<b class='flag-5'>API</b> <b class='flag-5'>網關</b>的微服務治理方案

    主流無線數傳模塊選型手冊表免費下載

    本文檔的主要內容詳細介紹的是工程師必備短距離無線選型參考 主流無線數傳模塊選型手冊表免費下載
    發表于 01-22 11:10 ?13次下載
    <b class='flag-5'>主流</b>無線數傳模塊<b class='flag-5'>選型</b>手冊表免費下載

    什么是API網關

    API應用編程接口(Application Programming Interface)是一組用于構建和集成應用軟件的定義和協議。
    的頭像 發表于 07-03 09:37 ?2520次閱讀

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

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

    API 網關詳細介紹(上)

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

    為什么需要 API 網關?

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

    企業怎么選擇API網關

    ? 一、API網關的用處 API網關我的分析中會用到以下三種場景。 1、Open API 企業需要將自身數據、能力等作為開發平臺向外開放,通
    的頭像 發表于 05-23 11:05 ?416次閱讀
    企業怎么選擇<b class='flag-5'>API</b><b class='flag-5'>網關</b>

    api網關 kong 教程入門

    統一權限控制、接口請求訪問日志統計 安全,是保護內部服務而設計的一道屏障 開源-最大好處 當然也有一個很大的缺點,api-gw很可能成為性能瓶頸,因為所有的請求都經過這里,可以通過橫向擴展和限流解決這個問題。 在眾多API GATEWAY框架中,Mashape開源的高性
    的頭像 發表于 11-10 11:39 ?335次閱讀
    <b class='flag-5'>api</b><b class='flag-5'>網關</b> kong 教程入門

    工業網關技術特點、應用場景和選型要點介紹

    在智能制造的大潮中,工業網關作為一種關鍵的數據傳輸設備,正發揮著日益重要的作用。它不僅實現了工業設備之間的互聯互通,還為企業數字化轉型提供了有力支撐。本文將從工業網關技術特點、應用場景和選型
    的頭像 發表于 05-23 16:30 ?134次閱讀
    工業<b class='flag-5'>網關</b>的<b class='flag-5'>技術</b>特點、應用場景和<b class='flag-5'>選型</b>要點介紹
    亚洲欧美日韩精品久久_久久精品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>