<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    coolfiry

    認認真真做人,兢兢業業做事!
    posts - 39, comments - 17, trackbacks - 0, articles - 0

    2018年1月5日

    在這篇文章中將我們一起來探討當前的API網關的作用。 

    一、API網關的用處

    API網關我的分析中會用到以下三種場景。 

    1. Open API。 企業需要將自身數據、能力等作為開發平臺向外開放,通常會以rest的方式向外提供,最好的例子就是淘寶開放平臺、騰訊公司的QQ開放平臺、微信開放平臺。 Open API開放平臺必然涉及到客戶應用的接入、API權限的管理、調用次數管理等,必然會有一個統一的入口進行管理,這正是API網關可以發揮作用的時候。
    2. 微服務網關。微服務的概念最早在2012年提出,在Martin Fowler的大力推廣下,微服務在2014年后得到了大力發展。 在微服務架構中,有一個組件可以說是必不可少的,那就是微服務網關,微服務網關處理了負載均衡,緩存,路由,訪問控制,服務代理,監控,日志等。API網關在微服務架構中正是以微服務網關的身份存在。 
    3. API服務管理平臺。上述的微服務架構對企業來說有可能實施上是困難的,企業有很多遺留系統,要全部抽取為微服務器改動太大,對企業來說成本太高。但是由于不同系統間存在大量的API服務互相調用,因此需要對系統間服務調用進行管理,清晰地看到各系統調用關系,對系統間調用進行監控等。 API網關可以解決這些問題,我們可以認為如果沒有大規模的實施微服務架構,那么對企業來說微服務網關就是企業的API服務管理平臺。

    二、API網關在企業整體架構中的地位

    一個企業隨著信息系統復雜度的提高,必然出現外部合作伙伴應用、企業自身的公網應用、企業內網應用等,在架構上應該將這三種應用區別開,三種應用的安排級別、訪問方式也不一樣。 因此在我的設計中將這三種應用分別用不同的網關進行API管理,分別是:API網關(OpenAPI合伙伙伴應用)、API網關(內部應用)、API網關(內部公網應用)。

     

    三、企業中在如何應用API網關

    1、對于OpenAPI使用的API網關來說,一般合作伙伴要以應用的形式接入到OpenAPI平臺,合作伙伴需要到 OpenAPI平臺申請應用。 因此在OpenAPI網關之外,需要有一個面向合作伙伴的使用的平臺用于合作伙伴,這就要求OpenAPI網關需要提供API給這個用戶平臺進行訪問。 如下架構:

     

    當然如果是在簡單的場景下,可能并不需要提供一個面向合作伙伴的門戶,只需要由公司的運營人員直接添加合作伙伴應用id/密鑰等,這種情況下也就不需要合作伙伴門戶子系統。 

    2、對于內網的API網關,在起到的作用上來說可以認為是微服務網關,也可以認為是內網的API服務治理平臺。 當企業將所有的應用使用微服務的架構管理起來,那么API網關就起到了微服務網關的作用。 而當企業只是將系統與系統之間的調用使用rest api的方式進行訪問時使用API網關對調用進行管理,那么API網關起到的就是API服務治理的作用。 架構參考如下:

    3、對于公司內部公網應用(如APP、公司的網站),如果管理上比較細致,在架構上是可能由獨立的API網關來處理這部分內部公網應用,如果想比較簡單的處理,也可以是使用面向合作伙伴的API網關。 如果使用獨立的API網關,有以下的好處:

    • 面向合作伙伴和面向公司主體業務的優先級不一樣,不同的API網關可以做到業務影響的隔離。
    • 內部API使用的管理流程和面向合作伙伴的管理流程可能不一樣。
    • 內部的API在功能擴展等方面的需求一般會大于OpenAPI對于功能的要求。

    基于以上的分析,如果公司有能力,那么還是建議分開使用合作伙伴OPEN API網關和內部公網應用網關。

    四、API網關有哪些競爭方案

    1、對于Open API平臺的API網關,我分析只能選擇API網關作為解決方案,業界沒有發現比較好的可以用來作為Open API平臺的入口的其他方案。 

    2、對于作為微服務網關的API網關,業界的選擇可以選擇的解決方案比較多,也取決于微服務器的實現方案,有一些微服務架構的實現方案是不需要微服務網關的。

    • Service Mesh,這是新興的基于無API網關的架構,通過在客戶端上的代理完成屏蔽網絡層的訪問,這樣達到對應用層最小的改動,當前Service Mesh的產品還正在開發中,并沒有非常成熟可直接應用的產品。 發展最迅速的產品是Istio。 建議大家密切關注相關產品的研發、業務使用進展。

    • 基于duboo架構,在這個架構中通常是不需要網關的,是由客戶端直接訪問服務提供方,由注冊中心向客戶端返回服務方的地址。

    五、API網關解決方案

    私有云開源解決方案如下:

    • Kong kong是基于Nginx+Lua進行二次開發的方案, https://konghq.com/
    • Netflix Zuul,zuul是spring cloud的一個推薦組件,https://github.com/Netflix/zuul
    • orange,這個開源程序是國人開發的, http://orange.sumory.com/

    公有云解決方案:

    • Amazon API Gateway,https://aws.amazon.com/cn/api-gateway/
    • 阿里云API網關,https://www.aliyun.com/product/apigateway/
    • 騰訊云API網關, https://cloud.tencent.com/product/apigateway

    自開發解決方案:

    • 基于Nginx+Lua+ OpenResty的方案,可以看到Kong,orange都是基于這個方案
    • 基于Netty、非阻塞IO模型。 通過網上搜索可以看到國內的宜人貸等一些公司是基于這種方案,是一種成熟的方案。
    • 基于Node.js的方案。 這種方案是應用了Node.js天生的非阻塞的特性。
    • 基于java Servlet的方案。 zuul基于的就是這種方案,這種方案的效率不高,這也是zuul總是被詬病的原因。

    六、企業怎么選擇API網關

    如果是要選擇一款已有的API網關,那么需要從以下幾個方面去考慮。 

    1、性能與可用性
    如果一旦采用了API網關,那么API網關就會作為企業應用核心,因此性能和可用性是必須要求的。

    • 從性能上來說,需要讓網關增加的時間消耗越短越好,個人覺得需要10ms以下。 系統需要采用非阻塞的IO,如epoll,NIO等。網關和各種依賴的交互也需要是非阻塞的,這樣才能保證整體系統的高可用性,如:Node.js的響應式編程和基于java體現的RxJava和Future。
    • 網關必須支持集群部署,任務一臺服務器的crash都應該不影響整體系統的可用性。
    • 多套網關應該支持同一管理平臺和同一監控中心。 如: 一個企業的OpenAPI網關和內部應用的多個系統群的不同的微服務網關可以在同一監控中心進行監控。

    2、可擴展性、可維護性
    一款產品總有不能滿足生產需求的地方,因此需求思考產品在如何進行二次開發和維護,是否方便公司團隊接手維護產品。 
    3、需求匹配度
    需要評估各API網關在需求上是否能滿足,如: 如果是OpenAPI平臺需要使用API網關,那么需要看API網關在合作伙伴應用接入、合作伙伴門戶集成、訪問次數限額等OpenAPI核心需求上去思考產品是否能滿足要求。 如果是微服務網關,那么要從微服務的運維、監控、管理等方面去思考產品是否足夠強大。
    4、是否開源?公司是否有自開發的能力?
    現有的開源產品如kong,zuul,orange都有基礎的API網關的核心功能,這些開源產品大多離很好的使用有一定的距離,如:沒有提供管理功能的UI界面、監控功能弱小,不支持OpenAPI平臺,沒有公司運營與運維的功能等。 當然開源產品能獲取源代碼,如果公司有比較強的研發能力,能hold住這些開源產品,經過二次開發kong、zuul應該還是適應一些公司,不過需求注意以下一些點:

    • kong是基于ngnix+lua的,從公司的角度比較難于找到能去維護這種架構產品的人。 需求評估當前公司是否有這個能力去維護這個產品。
    • zuul因為架構的原因在高并發的情況下性能不高,同時需要去基于研究整合開源的適配zuul的監控和管理系統。
    • orange由于沒有被大量使用,同時是國內個人在開源,在可持續性和社區資源上不夠豐富,出了問題后可能不容易找到人問。

    另外kong提供企業版本的API網關,當然也是基于ngnix+lua的,企業版本可以購買他們的技術支持、培訓等服務、以及擁有界面的管理、監控等功能。

    5、公有云還是私有云
    現在的亞馬遜、阿里、騰訊云都在提供基礎公有云的API網關,當然這些網關的基礎功能肯定是沒有問題,但是二次開發,擴展功能、監控功能可能就不能滿足部分用戶的定制需求了。另外很多企業因為自身信息安全的原因,不能使用外網公有網的API網關服務,這樣就只有選擇私有云的方案了。 
    在需求上如果基于公有云的API網關只能做到由內部人員為外網人員申請應用,無法做到定制的合作伙伴門戶,這也不適合于部分企業的需求。 
    如果作為微服務網關,大多數情況下是希望網關服務器和服務提供方服務器是要在內網的,在這里情況下也只有私有云的API網關才能滿足需求。 

    綜合上面的分析,基礎公有云的API網關只有滿足一部分簡單客戶的需求,對于很多企業來說私有云的API網關才是正確的選擇。


    文章作者介紹:
    來自于小豹科技的架構師-專注于軟件研發基于平臺性軟件的研發,目前我正在研發一款基于Netty、響應式架構的插件式的API網關,希望能對行業帶來一些改變。 我希望與對OpenAPI、微服務、API網關、Service Mesh等感興趣的朋友多交流。 有興趣的朋友請加我的QQ群244054462。

    posted @ 2018-01-05 13:42 Coolfiry 閱讀(4699) | 評論 (0)編輯 收藏

    2009年1月19日

    虞美人 李煜
    春花秋月何時了,往事知多少?小樓昨夜又東風,故國不堪回首月明中。雕欄玉砌應猶在,只是朱顏改。問君能有幾多愁,恰似一江春水向東流。 

    posted @ 2009-01-19 10:49 Coolfiry 閱讀(265) | 評論 (0)編輯 收藏

    雨霖鈴 ·柳永


    寒蟬凄切。對長亭晚,驟雨初歇。都門帳飲無緒,留戀處、蘭舟催發。執手相看淚眼,竟無語凝噎。念去去、千里煙波,暮靄沉沉楚天闊。
    多情自古傷離別,更那堪冷落清秋節!今宵酒醒何處?楊柳岸、曉風殘月。此去經年,應是良辰好景虛設。便縱有千種風情,更與何人說?

    posted @ 2009-01-19 10:48 Coolfiry 閱讀(260) | 評論 (0)編輯 收藏

    2008年12月11日

    1、python的入門級內容。
    2、java mail的使用基本用法和注意事項。
    3、CXF中相關BUG的解決方法。
    4、UNIX 網絡編程步步提升系列。

    posted @ 2008-12-11 15:48 Coolfiry 閱讀(1072) | 評論 (5)編輯 收藏

    2008年10月21日

    轉自:http://bbs.chinaunix.net/viewthread.php?tid=691982&extra=&page=1
    snoop 抓包
    solaris自帶snoop抓包工具,抓所有數據流

    # snoop
    Using device /dev/pcn0 (promiscuous mode)
    192.168.8.18 -> 192.168.255.255 NBT NS Query Request for WORKGROUP[1c], Success
    192.168.253.35 -> solaris      TELNET C port=1246
         solaris -> 192.168.253.35 TELNET R port=1246 Using device /dev/pc
         solaris -> 192.168.253.35 TELNET R port=1246 Using device /dev/pc
    192.168.4.150 -> (broadcast)  ARP C Who is 192.168.4.200, 192.168.4.200 ?
    192.168.4.200 -> (broadcast)  ARP C Who is 192.168.4.150, 192.168.4.150 ?
    #

    抓源地址或目的為 202.101.98.55的數據流:

    # snoop 202.101.98.55
    Using device /dev/pcn0 (promiscuous mode)
    192.168.253.35 -> dns.fz.fj.cn DNS C www.163.com. Internet Addr ?
    dns.fz.fj.cn -> 192.168.253.35 DNS R www.163.com. Internet CNAME www.cache.split.netease.com.

    #

    說明:internet cname 后的為解析www.163.com的名字時,代表www.163.com回答的主機的域名。

    抓 192.168.253.35和202.101.98.55之間的數據流(雙向都抓)

    # snoop 192.168.253.35 202.101.98.55
    Using device /dev/pcn0 (promiscuous mode)
    192.168.253.35 -> dns.fz.fj.cn DNS C www.google.com. Internet Addr ?
    dns.fz.fj.cn -> 192.168.253.35 DNS R www.google.com. Internet CNAME www.l.google.com.
    #

    抓完存在當前目錄下的cap文件中并查看

    # snoop -o cap1 -P      -P表示處在非混雜模式抓數據,只抓廣播、主播、目的為本機的數據
    Using device /dev/pcn0 (non promiscuous)
    15 ^C                           15的含義是:顯示目前抓了多少個數據流
    #

    # snoop -i cap1
      1   0.00000 192.168.253.35 -> solaris      TELNET C port=1246
      2   0.18198 192.168.253.35 -> solaris      TELNET C port=1246
      3   0.37232 192.168.4.199 -> 192.168.255.255 NBT Datagram Service Type=17 Source=WB-200[20]
      4   0.00016            ? -> (multicast)  ETHER Type=EF08 (Unknown), size = 180bytes
      5   0.62546 192.168.253.35 -> solaris      TELNET C port=1246
      6   0.13822            ? -> (multicast)  ETHER Type=0000 (LLC/802.3), size = 52 bytes
      7   0.06283 192.168.253.35 -> solaris      TELNET C port=1246
      8   0.90301 192.168.253.35 -> solaris      TELNET C port=1246
      9   0.19781 192.168.253.35 -> solaris      TELNET C port=1246
    10   0.81493            ? -> (multicast)  ETHER Type=0000 (LLC/802.3), size = 52 bytes
    11   0.07018 192.168.253.35 -> solaris      TELNET C port=1246
    12   0.19939 192.168.253.35 -> solaris      TELNET C port=1246
    13   0.90151 192.168.253.35 -> solaris      TELNET C port=1246
    14   0.18904 192.168.253.35 -> solaris      TELNET C port=1246
    15   0.68422            ? -> (multicast)  ETHER Type=0000 (LLC/802.3), size = 52 bytes
    #snoop -i cap1 -p 10,12            只看10-12條記錄

    #snoop -i cap1 -p10                  只看第10條記錄

    # snoop -i cap1 -v -p101            查看第10條數據流的包頭的詳細內容

    #snoop -i cap1 -v -x 0 -p101   查看第10條數據流的全部的詳細內容

    抓主機192.168.253.35和202.101.98.55之間的tcp或者udp端口53的數據

    # snoop 192.168.253.35 and 202.101.98.55 and \(tcp or udp\) and port 53

    輸入(的時候要加轉義符號\


    snoop的詳細參數
    Snoop 是Solaris 系統中自帶的工具, 是一個用于顯示網絡通訊的程序, 它可捕獲IP 包并將其顯示或保存到指定文件. (限超級用戶使用snoop)
    Snoop 可將捕獲的包以一行的形式加以總結或用多行加以詳細的描述(有調用不同的參數–v -V來實現). 在總結方式下(-V ) , 將僅顯示最高層的相關協議, 例如一個NFS 包將僅顯示NFS 信息, 其低層的RPC, UDP, IP, Ethernet 幀信息將不會顯示, 但是當加上相應的參數(-v ), 這些信息都能被顯示出來.

    -C

    -D

    -N

    -P 在非混雜模式下抓包

    -S 抓包的時候顯示數據包的大小

    -V 半詳細的顯示抓的數據的信息

    -t [ r | a | d ] 顯示時間戳,-ta顯示當前系統時間,精確到毫秒

    -v 最詳細的顯示數據的信息

    -x offset [ , length] 以16進制或ACSII方式顯示某數據的部分內容,比如 -x 0,10 只顯示0-10字節

    #snoop -i cap1 -v -x 0 -p101 查看被抓獲的第101個數據流的全部內容


    表達式:

    根據地址:

    #snoop x.x.x.x         IPV4的IP

    #snoop 0XX:XX:XX:XX    ETHERNET的MAC地址

    數據的方向:

    from x.x.x.x 或者 src x.x.x.x

    to x.x.x.x 或者 dst x.x.x.x

    可用的數據類型的關鍵詞:

    ip, ip6, arp, rarp, pppoed, pppoes,pppoe,broadcast,multicast,apple,decnet

    udp, tcp, icmp, icmp6, ah, esp

    greater length
          True if the packet is longer than length.

    less length
          True if the packet is shorter than length.

    net net

    # snoop from net 192.168.1.0 抓來自192.168.1.0/24的數據

    # snoop from net 192.168.0.0 抓來自192.168.0.0/16的數據

    port xx XX為TCP或者UDP的端口號或者 /etc/services里定義的名字

    #snoop to udp and port 53    抓到UDP53的數據

    posted @ 2008-10-21 21:30 Coolfiry 閱讀(723) | 評論 (0)編輯 收藏

    2008年8月5日

    在項目使用CXF的過程中,遇到了有關List作為傳輸參數的時候,如果WebService端沒有明確給出List的泛型類型會報錯。
    例如
    CXF的WebService端口接口的一個方法為為:
    1 public boolean updateMessageStatus(List batchIds);

    客戶端的的調用為:
    1 //預先初始化cxf對象cxfObj
    2 List<String> list=new ArrayList<String>();
    3 list.add("1");
    4 cxfObj.updateMessageStatus(list);


    在客戶端進行調用WebService時會發生錯誤,錯誤為:unexpected element (uri:"", local:"arg0")等,據分析生成的wsdl,這是因為CXF在進行數據marshal時不知道要將要轉換的類型。

    解決辦法是:在WebService端的接口必須用List的泛型類型參數,如:

    1 public boolean updateMessageStatus(List<String> batchIds);

    這樣就完全解決問題了。

    posted @ 2008-08-05 20:09 Coolfiry 閱讀(4956) | 評論 (1)編輯 收藏

    2008年7月20日

    現在正在學習linux shell編程
    first.sh
    while read line
    do
            echo 
    "$line"
    done 
    <"$1"
    這是第一個shell程序小例子,就相當于一個學習其他語言的hello world了吧。用法first.sh test,將test文件中的每一行輸出到stdout中。

    second.sh
    number=0;
    while [ "$number" -lt 100 ]
    do
            echo 
    "$number"
            number
    ='expr $number + 1'
    done
    echo
    這是第二個shell程序小例子,作用是輸出0到99的數字到stdout中。其中用到的expr的作用是使expr的參數轉化為數字并相加。兩個單引號的作用是引號所包圍的命令被命令的標準輸出替換,并輸出賦值給我number,得到了如同java中number=number+1的效果。


    posted @ 2008-07-20 20:34 Coolfiry 閱讀(587) | 評論 (2)編輯 收藏

    2008年7月18日

    在項目開發過程中,遇到在本機和windows環境中部署用CXF框架開發的的webService沒有任何問題,但是當將工程部署到solaris 的SUN ONE application上時,再用本機的cxf Web服務客戶端訪問對應的web服務時,如果傳輸的數據量小于大約4K不會出問題,否則則會報一些數據綁定的異常如:
    Marshalling Error: Error writing request body to server。
    解決這個問題花了我足足兩天時間,原因是有關CXF的資料太少了,而且有關于這個錯誤的解決都必須使用google才能search到,用baidu完全search不到相關的資料。
    解決方案:
    在客戶端的class-path中加上cxf.xml。cxf.xml的配置如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:http
    ="http://cxf.apache.org/transports/http/configuration"
        xmlns:jaxws
    ="http://cxf.apache.org/jaxws"
        xsi:schemaLocation
    ="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
     http://cxf.apache.org/transports/http/configuration
    http://cxf.apache.org/schemas/configuration/http-conf.xsd"
    >
        
    <http:conduit name="*.http-conduit">
            
    <http:client AutoRedirect="true" />
        
    </http:conduit>
    </beans>
    這個問題的解決方案是我在cxf的官網上找了很久才找到的,雖然問題解決了,但是我感到很迷惑。主要在windows tomcat環境下沒有問題,而到了SUN ONE的環境就有問題,經過的思考和找了一資料,我認為問題出于solaris對于HTTP數據傳輸的某些限制,如果真要去搞清楚的話可能要去參看cxf的source code了,但是我不想花這個時間去研究這個問題了。

    我把這個解決方案寫出來,希望可以幫助到使用CXF的網友,也希望高手們能幫我解決我的迷惑。



    posted @ 2008-07-18 19:11 Coolfiry 閱讀(2568) | 評論 (0)編輯 收藏

    Internet的快速增長使多媒體網絡服務器,特別是Web服務器,面對的訪問者數量快速增加,網絡服務器需要具備提供大量并發訪問服務的能力。 例如Yahoo每天會收到數百萬次的訪問請求,因此對于提供大負載Web服務的服務器來講,CPU、I/O處理能力很快會成為瓶頸。

    簡單的 提高硬件性能并不能真正解決這個問題,因為單臺服務器的性能總是有限的,一般來講,一臺PC服務器所能提供的并發訪問處理能力大約為1000個,更為高檔 的專用服務器能夠支持3000-5000個并發訪問,這樣的能力還是無法滿足負載較大的網站的要求。尤其是網絡請求具有突發性,當某些重大事件發生時,網 絡訪問就會急劇上升,從而造成網絡瓶頸,例如在網上發布的克林頓彈劾書就是很明顯的例子。必須采用多臺服務器提供網絡服務,并將網絡請求分配給這些服務器 分擔,才能提供處理大量并發服務的能力。

    當使用多臺服務器來分擔負載的時候,最簡單的辦法是將不同的服務器用在不同的方面。 按提供的內容進行分割時,可以將一臺服務器用于提供新聞頁面,而另一臺用于提供游戲頁面;或者可以按服務器的功能進行分割,將一臺服務器用于提供靜態頁面 訪問,而另一些用于提供CGI等需要大量消耗資源的動態頁面訪問。然而由于網絡訪問的突發性,使得很難確定那些頁面造成的負載太大,如果將服務的頁面分割 的過細就會造成很大浪費。事實上造成負載過大的頁面常常是在變化中的,如果要經常按照負載變化來調整頁面所在的服務器,那么勢必對管理和維護造成極大的問 題。因此這種分割方法只能是大方向的調整,對于大負載的網站,根本的解決辦法還需要應用負載均衡技術。

    負載均衡的思路下多臺 服務器為對稱方式,每臺服務器都具備等價的地位,都可以單獨對外提供服務而無須其他服務器的輔助。然后通過某種負載分擔技術,將外部發送來的請求均勻分配 到對稱結構中的某一臺服務器上,而接收到請求的服務器都獨立回應客戶機的請求。由于建立內容完全一致的Web服務器并不復雜,可以使用服務器同步更新或者 共享存儲空間等方法來完成,因此負載均衡技術就成為建立一個高負載Web站點的關鍵性技術。

    1. 基于特定服務器軟件的負載均衡

      很 多網絡協議都支持“重定向”功能,例如在HTTP協議中支持Location指令,接收到這個指令的瀏覽器將自動重定向到Location指明的另一個 URL上。由于發送Location指令比起執行服務請求,對Web服務器的負載要小的多,因此可以根據這個功能來設計一種負載均衡的服務器。任何時候 Web服務器認為自己負載較大的時候,它就不再直接發送回瀏覽器請求的網頁,而是送回一個Locaction指令,讓瀏覽器去服務器集群中的其他服務器上 獲得所需要的網頁。

      在這種方式下,服務器本身必須支持這種功能,然而具體實現起來卻有很多困難,例如一臺服務器如何能保證它重定向過的服務 器是比較空閑的,并且不會再次發送Location指令?Location指令和瀏覽器都沒有這方面的支持能力,這樣很容易在瀏覽器上形成一種死循環。因 此這種方式實際應用當中并不多見,使用這種方式實現的服務器集群軟件也較少。有些特定情況下可以使用CGI(包括使用FastCGI或mod_perl擴 展來改善性能)來模擬這種方式去分擔負載,而Web服務器仍然保持簡潔、高效的特性,此時避免Location循環的任務將由用戶的CGI程序來承擔。

    2. 基于DNS的負載均衡

      由 于基于服務器軟件的負載均衡需要改動軟件,因此常常是得不償失,負載均衡最好是在服務器軟件之外來完成,這樣才能利用現有服務器軟件的種種優勢。最早的負 載均衡技術是通過DNS服務中的隨機名字解析來實現的,在DNS服務器中,可以為多個不同的地址配置同一個名字,而最終查詢這個名字的客戶機將在解析這個 名字時得到其中的一個地址。因此,對于同一個名字,不同的客戶機會得到不同的地址,他們也就訪問不同地址上的Web服務器,從而達到負載均衡的目的。

      例如如果希望使用三個Web服務器來回應對www.exampleorg.org.cn的HTTP請求,就可以設置該域的DNS服務器中關于該域的數據包括有與下面例子類似的結果:

      www1		IN		A 		192.168.1.1
      www2		IN		A 		192.168.1.2
      www3		IN		A 		192.168.1.3
      www		IN		CNAME		www1
      www		IN		CNAME		www2
      www		IN		CNAME		www3

      此后外部的客戶機就可能隨機的得到對應www的不同地址,那么隨后的HTTP請求也就發送給不同地址了。

      DNS 負載均衡的優點是簡單、易行,并且服務器可以位于互聯網的任意位置上,當前使用在包括Yahoo在內的Web站點上。然而它也存在不少缺點,一個缺點是為 了保證DNS數據及時更新,一般都要將DNS的刷新時間設置的較小,但太小就會造成太大的額外網絡流量,并且更改了DNS數據之后也不能立即生效;第二點 是DNS負載均衡無法得知服務器之間的差異,它不能做到為性能較好的服務器多分配請求,也不能了解到服務器的當前狀態,甚至會出現客戶請求集中在某一臺服 務器上的偶然情況。

    3. 反向代理負載均衡

      使用代理服務器可以將請求轉發給內部的Web服務器,使用這種加速 模式顯然可以提升靜態網頁的訪問速度。因此也可以考慮使用這種技術,讓代理服務器將請求均勻轉發給多臺內部Web服務器之一上,從而達到負載均衡的目的。 這種代理方式與普通的代理方式有所不同,標準代理方式是客戶使用代理訪問多個外部Web服務器,而這種代理方式是多個客戶使用它訪問內部Web服務器,因 此也被稱為反向代理模式。

      實現這個反向代理能力并不能算是一個特別復雜的任務,但是在負載均衡中要求特別高的效率,這樣實現起來就不是十分 簡單的了。每針對一次代理,代理服務器就必須打開兩個連接,一個為對外的連接,一個為對內的連接,因此對于連接請求數量非常大的時候,代理服務器的負載也 就非常之大了,在最后反向代理服務器會成為服務的瓶頸。例如,使用Apache的mod_rproxy模塊來實現負載均衡功能時,提供的并發連接數量受 Apache本身的并發連接數量的限制。一般來講,可以使用它來對連接數量不是特別大,但每次連接都需要消耗大量處理資源的站點進行負載均衡,例如搜尋。

      使 用反向代理的好處是,可以將負載均衡和代理服務器的高速緩存技術結合在一起,提供有益的性能,具備額外的安全性,外部客戶不能直接訪問真實的服務器。并且 實現起來可以實現較好的負載均衡策略,將負載可以非常均衡的分給內部服務器,不會出現負載集中到某個服務器的偶然現象。

    4. 基于NAT的負載均衡技術

      網 絡地址轉換為在內部地址和外部地址之間進行轉換,以便具備內部地址的計算機能訪問外部網絡,而當外部網絡中的計算機訪問地址轉換網關擁有的某一外部地址 時,地址轉換網關能將其轉發到一個映射的內部地址上。因此如果地址轉換網關能將每個連接均勻轉換為不同的內部服務器地址,此后外部網絡中的計算機就各自與 自己轉換得到的地址上服務器進行通信,從而達到負載分擔的目的。

      地 址轉換可以通過軟件方式來實現,也可以通過硬件方式來實現。使用硬件方式進行操作一般稱為交換,而當交換必須保存TCP連接信息的時候,這種針對OSI網 絡層的操作就被稱為第四層交換。支持負載均衡的網絡地址轉換為第四層交換機的一種重要功能,由于它基于定制的硬件芯片,因此其性能非常優秀,很多交換機聲 稱具備400MB-800MB的第四層交換能力,然而也有一些資料表明,在如此快的速度下,大部分交換機就不再具備第四層交換能力了,而僅僅支持第三層甚 至第二層交換。

      然而對于大部分站點來講,當前負載均衡主要是解決Web服務器處理能力瓶頸的,而非網絡傳輸能力,很多站點的互聯網連接帶寬總共也不過10MB,只有極少的站點能夠擁有較高速的網絡連接,因此一般沒有必要使用這些負載均衡器這樣的昂貴設備。

      使 用軟件方式來實現基于網絡地址轉換的負載均衡則要實際的多,除了一些廠商提供的解決方法之外,更有效的方法是使用免費的自由軟件來完成這項任務。其中包括 Linux Virtual Server Project中的NAT實現方式,或者本文作者在FreeBSD下對natd的修訂版本。一般來講,使用這種軟件方式來實現地址轉換,中心負載均衡器存 在帶寬限制,在100MB的快速以太網條件下,能得到最快達80MB的帶寬,然而在實際應用中,可能只有40MB-60MB的可用帶寬。

    5. 擴展的負載均衡技術

    上 面使用網絡地址轉換來實現負載分擔,毫無疑問所有的網絡連接都必須通過中心負載均衡器,那么如果負載特別大,以至于后臺的服務器數量不再在是幾臺、十幾 臺,而是上百臺甚至更多,即便是使用性能優秀的硬件交換機也回遇到瓶頸。此時問題將轉變為,如何將那么多臺服務器分布到各個互聯網的多個位置,分散網絡負 擔。當然這可以通過綜合使用DNS和NAT兩種方法來實現,然而更好的方式是使用一種半中心的負載均衡方式。

    在這種半中心的負載均衡方式下,即當客戶請求發送給負載均衡器的時候,中心負載均衡器將請求打包并發送給某個服務器,而服務器的回應請求不再返回給中心負載均衡器,而是直接返回給客戶,因此中心負載均衡器只負責接受并轉發請求,其網絡負擔就較小了。

    上圖來自Linux Virtual Server Project,為他們使用IP隧道實現的這種負載分擔能力的請求/回應過程,此時每個后臺服務器都需要進行特別的地址轉換,以欺騙瀏覽器客戶,認為它的回應為正確的回應。

    同樣,這種方式的硬件實現方式也非常昂貴,但是會根據廠商的不同,具備不同的特殊功能,例如對SSL的支持等。

    由于這種方式比較復雜,因此實現起來比較困難,它的起點也很高,當前情況下網站并不需要這么大的處理能力。

    比 較上面的負載均衡方式,DNS最容易,也最常用,能夠滿足一般的需求。但如果需要進一步的管理和控制,可以選用反向代理方式或NAT方式,這兩種之間進行 選擇主要依賴緩沖是不是很重要,最大的并發訪問數量是多少等條件。而如果網站上對負載影響很厲害的CGI程序是由網站自己開發的,也可以考慮在程序中自己 使用Locaction來支持負載均衡。半中心化的負載分擔方式至少在國內當前的情況下還不需要。
    http://galaxystar.javaeye.com/blog/50546

    posted @ 2008-07-18 14:23 Coolfiry 閱讀(255) | 評論 (0)編輯 收藏

    2007年10月12日

    在Java版發表這篇文章,似乎有點把矛頭指向Java了。其實不是,GC是所有新一代語言共有的特征,
    Python, Eiffel,C#,Roby等無一例外地都使用了GC機制。但既然Java中的GC最為著名,所以天塌
    下來自然應該抗著。

    這篇短文源于comp.lang.java.programmer跟comp.lang.c++上發生的一場大辯論,支持C++和Java
    的兩派不同勢力展開了新世紀第一場沖突,跟貼發言超過350,兩派都有名角壓陣。C++陣營的擂主是
    Pete Becker,ACM會員,Dinkumware Ltd. 的技術副總監。此君精通C++和Java,開發過兩種語言的
    核心類庫,但是卻對C++狂熱之極,而對于Java頗不以為然。平時談到Java的時候還好,一旦有人膽
    敢用Java來批判C++,立刻忍不住火爆脾氣跳將出來,以堅韌不拔的毅力和大無畏精神與對手周旋,
    舌戰群儒,哪怕只剩下一個人也要血戰到底。這等奇人當真少見!我真奇怪他整天泡在usenet上,
    不用工作么?他的老板P.J. Plauger如此寬宏大量?Java陣營主角是一個網名Razzi的兄弟,另外有
    Sun公司大名鼎鼎的Peter van der Linden助陣,妙語連珠,寸土必爭,加上人多勢眾,一度占據優勢。
    C++陣營里大拿雖然很多,但是大多數沒有Pete那么多閑工夫,例如Greg Comeau,Comeau公司老板,
    每次來個只言片語,實在幫不了Pete多大忙。但是自從C++陣營中冒出一個無名小子,網名Courage(勇氣),
    發動對Java GC機制的批判,形勢為之一變。C++陣營眼下處于全攻之勢,Java陣營疲于防守,只能
    招架說:“你們沒有證據,沒有統計資料”,形勢很被動。

    垃圾收集(GC)不是一直被Java fans用來炫耀,引以為傲的優點么?怎么成了弱點了?我大惑不解,定睛
    一看,才覺得此中頗有道理。

    首先,Java Swing庫存在大量資源泄漏問題,這一點SUN非常清楚,稱之為bugs,正在極力修正。但是看來
    這里的問題恐怕不僅是庫編寫者的疏忽,可能根源在于深層的機制,未必能夠輕易解決,搞不好要傷筋動骨。
    不過這個問題不是那么根本,C++陣營覺得如果抓住對方的弱點攻擊,就算是占了上風也沒什么說服力。誰
    沒有缺點呢?于是反其道而行之,猛烈攻擊Java陣營覺得最得意的東西,Java的GC機制本身。

    首先來想一想,memory leak到底意味著什么。在C++中,new出來的對象沒有delete,這就導致了memory
    leak。但是C++早就有了克服這一問題的辦法——smart pointer。通過使用標準庫里設計精致的auto_ptr
    以及各種STL容器,還有例如boost庫(差不多是個準標準庫了)中的四個smart pointers,C++
    程序員只要
    花上一個星期的時間學習最新的資料,就可以拍著胸脯說:“我寫的
    程序沒有memory leak!”。

    相比之下,Java似乎更優秀,因為從一開始你就不用考慮什么特殊的機制,大膽地往前new,自有GC替你
    收拾殘局。Java的GC實際上是
    JVM中的一個獨立線程,采用不同的算法策略來收集heap中那些不再有
    reference指向的垃圾對象所占用的內存。但是,通常情況下,GC線程的優先級比較低,只有在當前
    程序
    空閑的時候才會被調度,收集垃圾。當然,如果JVM感到內存緊張了,JVM會主動調用GC來收集垃圾,獲取
    更多的內存。請注意,Java的GC工作的時機是:1. 當前
    程序不忙,有空閑時間。2. 空閑內存不足。
    現在我們考慮一種常見的情況,
    程序在緊張運行之中,沒喲空閑時間給GC來運行,同時機器內存很大,
    JVM也沒有感到內存不足,結果是什么?對了,GC形同虛設,得不到調用。于是,內存被不斷吞噬,而那些
    早已經用不著的垃圾對象仍在在寶貴的內存里睡大覺。例如:

    class BadGc {

        public void job1() {
            String garbage = "I am a garbage, and just sleeping in your precious memory, " +
                      "how do you think you can deal with me? Daydreaming! HAHA!!!";
            ....
        }

        public void job2() {...}

        ...
        ...

        public void job1000() {...}

        public static void main(String[] args) {
            bgc = new BadGc();
     bgc.job1();
     bgc.job2();
     ...
     bgc.job1000();
        }
    }

    運行中,雖然garbage對象在離開job1()之后,就再也沒有用了。但是因為程序忙,內存還夠用,所以GC得
    不到調度,garbage始終不會被回收,直到
    程序運行到bgc.job1000()時還躺在內存里嘲笑你。沒轍吧!

    好了,我承認這段程序很傻。但是你不要以為這只是理論上的假設,恰恰相反,大多數實用中的Java程序都有
    類似的效應。這就是為什么Java
    程序狂耗內存,而且好像給它多少內存吃都不夠。你花上大筆的銀子把內存
    從128升到256,再升到512,結果是,一旦執行復雜任務,內存還是被輕易填滿,而且多出來的這些內存只是
    用來裝垃圾,GC還是不給面子地千呼萬喚不出來。等到你的內存終于心力交瘁,GC才姍姍來遲,收拾殘局。而
    且GC工作的方式也很不好評價,一種方法是一旦有機會回收內存,就把所有的垃圾都回收。你可以想象,這要
    花很長時間(幾百M的垃圾啊!),如果你這時侯正在壓下開炮的按鈕,GC卻叫了暫定,好了,你等死吧!另一
    種方法,得到機會之后,回收一些內存,讓JVM感到內存不那么緊張時就收手。結果呢,內存里始終有大批垃
    圾,
    程序始終在半死不活的蕩著。最后,GC可以每隔一段時間就運行一次,每次只回收一部分垃圾,這是現在
    大部分JVM的方式,結果是內存也浪費了,還動不動暫停幾百毫秒。難啊!

    反過來看看C++利用smart pointer達成的效果,一旦某對象不再被引用,系統刻不容緩,立刻回收內存。這
    通常發生在關鍵任務完成后的清理(cleanup)時期,不會影響關鍵任務的實時性,同時,內存里所有的對象
    都是有用的,絕對沒有垃圾空占內存。怎么樣?傳統、樸素的C++是不是更勝一籌?

    據統計,目前的Java程序運行期間占用的內存通常為對應C++程序的4-20倍。除了其它的原因,上面所說的是一個
    非常主要的因素。我們對memory leak如此憤恨,不就是因為它導致大量的內存垃圾得不到清除嗎?如果有了
    GC之后,垃圾比以前還來勢洶洶,那么GC又有什么好處呢?

    當然,C++的smart pointer現在會使用的人不多,所以現在的C++程序普遍存在更嚴重的memory leak問題。
    但是,如果我奶奶跟舒馬赫比賽車輸掉了,你能夠埋怨那輛車子么?
    http://www.594k.com/java/html/y2007m1/12051/

    posted @ 2007-10-12 10:43 Coolfiry 閱讀(642) | 評論 (1)編輯 收藏

    主站蜘蛛池模板: 国产禁女女网站免费看| 久久笫一福利免费导航| 亚洲精品网站在线观看不卡无广告| 亚洲综合色一区二区三区| 一个人免费高清在线观看| 中国亚洲呦女专区| 国产美女精品视频免费观看 | 国产精品久久亚洲不卡动漫| 日本阿v免费费视频完整版| 亚洲国产高清在线精品一区| 免费看美女裸露无档网站| 国产成人aaa在线视频免费观看 | A毛片毛片看免费| 亚洲精品国产品国语在线| 久久久久久国产a免费观看不卡| 中文字幕久久亚洲一区| 国产一精品一AV一免费| 亚洲熟妇无码爱v在线观看| 三年片在线观看免费观看高清电影| 亚洲成_人网站图片| 免费人成在线观看播放国产| 一区二区三区免费在线视频| 亚洲成A人片在线观看无码不卡 | 亚洲综合AV在线在线播放| 色欲A∨无码蜜臀AV免费播 | 羞羞视频网站免费入口| 中文字幕在线亚洲精品| 久久国产乱子伦免费精品| 亚洲欧洲无码AV不卡在线| 最新亚洲成av人免费看| 97青青草原国产免费观看| 亚洲国产成人综合精品| 亚洲午夜福利717| aa级一级天堂片免费观看| 一级毛片大全免费播放| 久久久久亚洲AV片无码下载蜜桃| 日韩成全视频观看免费观看高清| 中文在线观看国语高清免费| 亚洲国产区男人本色在线观看| 亚洲另类激情专区小说图片| aⅴ在线免费观看|