最近幾個月,網路上 REST vs. SOAP 的口角甚囂塵上,實在看不下去了。就連在 SOA 和 Web services 界的重量級人物 — Burton Group 的分析總監 Anne Thomas Manes (ATM),也開始加入炒作 REST 的行列。
自 J2EE 草創期以來,我對 ATM 一直非常推崇,但這篇報導著實讓我有些驚訝!或許其中難免有幾分媒體的加油添醋,但大膽宣稱「SOA 的未來在 REST」,實在是太過火了。很仔細地看完相關的幾篇報導,仍感覺裡面有幾分炒作!猶記得大約在兩年前,透過一個 podcast,聽過一場 ATM 關於 SOA 的演講。在 Q&A 過程中,有人問到 REST,ATM 當時很堅定地表示,儘管 REST 更適合一些非常大訪問量的情境,是 Google, Yahoo, Amazon 等網際網路公司所必須,但在企業應用的領域,ATM 說,許多需求,例如安控、policy、交易處理… 等, 還是只有 SOAP 和 WS-* 做得來,REST 是不夠的。但三個月前的這場宣告,加上幾分渲染,讓人感覺她似乎完全推翻了過去的立場。ATM 的其他同僚,當然不忘趁機一擁而上,大炒 REST 概念股,口氣往往比 ATM 本人更加露骨許多(她還是比較中肯的;稍後再談)- 有的 (Peter Lacey) 說目前的 Web services 標準遠遠不足,正妨害著 SOA 發展,只有從 REST 開發帶來的約束力中,才能得到救贖。這位仁兄上周在談資料服務(data services,美國今年 SOA 界的熱門主題)時,更大言 REST 與資料服務是天作之和,儘管基本上的確有幾分道理,但同時似乎也有意無意地避談或淡化可行性的問題,包括目前不管在資料服務相關工具、 middleware 等領域對 REST 的支援程度,更忽略了廣大對物件導向已經根深蒂固的架構師和開發人員,需要多久的適應期,來對 REST 這種需要改採資源導向的新設計觀念來進行「換腦」工程。簡單地說,覺得他講的不夠務實。
到底什麼是 REST?這個問題太好、太重要了!因為目前 REST 和 SOAP 的爭論中,存在很多將 REST 擴大解釋的現象。不少人其實連 REST 真正的精神還本質根本都還搞不清楚,就以 “RESTafarian”(網上對實行「REST 主義」者的特殊稱號)自居,以為自己做的是 REST 應用,但很多其實不是(REST 的名氣大多是被這幫人所炒起來)。REST 全名 “Representational State Transfer” 。它的名稱由來、概念、理論基礎,和原則,源於 Roy Fielding 2000 年的博士論文。簡單地說,只要掌握幾個關鍵原則,便可巧妙地運用 WWW 的先天機制,藉而設計出許多簡單而且極為 scalable 的應用。這是一種「資源導向」的設計哲學,將應用所處理的對象用「資源」的觀念來規劃,應用只需利用 HTTP 內建的 GET, POST, DELETE, PUT 等,作為統一而簡單的 “API”,對這些資源的表現形式和狀態(REST 中的 “RES”)做修改和轉變(REST 的 “T”),來達到維護和處理資料的目的。
關於對 REST 的快速入門,我推薦《SOA Using Java Web Services》這本書的第三章(試閱章節可由此免費下載),這本書只用了第三章開始的短短兩三頁,便點出很多重點 - 包括對 SOAP 和 RESTful 這兩種 Web services 的 styles,做了一個務實的比較;此外並提到,許多被認為是 REST 的應用,包括 Amazon.com 發布的許多 Web services,還有一些使用 cookies 的 “REST” 應用,其實都違反 Fielding 所闡述的基本原則。另一本推薦的書 - O’Reilly 所出版的《RESTful Web Services》,恰好可免費下載的章節,所談的正是作者想提倡的正統 REST 設計理念。他們採用了 ROA - Resource-Oriented Architecture 來闡述這個理念,藉以和號稱 RESTful,但只是以 REST 之形,行 RPC 之實的做法作區隔。為什麼要這麼強調 Fielding 所揭櫫的基本原則?就拿無狀態性來講,如果違背這個原則的話,例如在 server 端維護 session 資料,那麼 REST 在 scalability 上的優勢就不復存在。儘管許多 REST 擁護者在宣揚 REST 時不忘強調這些 REST 的優勢,但實際上不少他們開發出來的 “RESTful 應用” 不見得享有這些優勢。前面提到 ATM,儘管我感覺她多少有利用自己過去纍積的SOA光環,短線操作 SOA 和 REST 話題之嫌,但很高興看到她在其他許多場合(例如這個 InfoQ 專訪和這個 blog)所表達的訊息和看法,仍是十分正確而鏗鏘有力,她強調許多號稱 RESTful 的應用,其實只是 POX (Plain Old XML) - POX 只不過指訊息的 payload 採用單純的 XML,而不經 SOAP 或 Atom 那樣的信封包裝。很多 POX 應用其實不是 RESTful,而 RESTful 應用則也不見得必須是 POX。有的人說 REST 很簡單,就是 XML over HTTP,其實不是這麼回事。如同 ATM 和上述 O’Reilly 《RESTful…》一書作者所強調的,REST 內含一個架構的精神,或許可稱之為 ROA,而它的設計哲學,不見得是物件導向已深化心中的人能在短時間內完全領略。OO 和 RPC 的設計方式往往透過 method 或 function 呼叫來達成一件事,而在 SOA 之下,某個業務功能可透過服務的 operation 來建模,落到技術層面,則可很輕易地對應成以一個方法或函數來實現。例訂單查詢,可以透過一個幕後是 Java 方法的 Web service 來接受用戶請求,用戶端,也就是服務消費者,將訂單序號作為參數,放在請求裡面。在這種設計模式之下,主角是及物動詞,也就是對訂單(受詞)的查詢動作; 但如果要改用資源導向的觀念、也就是 REST 理念來設計的話,主角會是那千千萬萬筆的訂單,也就是名詞 - 每筆訂單都有一個獨特、專屬的 URI/URL 來識別, 據以對它們進行各別的查、增、刪、改。ATM 也舉過一個例子,她說如果用 REST 來設計燈光控制的應用,那你的房子裡面的每一個燈泡都必須有一個獨特的 URI,然後對每盞燈發送開/關的控制信號;而不是透過一個統一的燈光總控來進行控制。看一個自然語言的例子,要表達類似的意念,我們可以說:「我不(太)同意你的看法」,但也可以說「我和你的看法不同」,前者以動詞為重心的表達方式,較為強烈而單刀直入,後者以名詞為主題的表達方式,讓人的感覺較為婉轉,REST 在設計上的體現,也有這種婉轉的味道。
至於 SOA 的未來,是否將如 Burton Group 所預測,逐漸將向 REST 傾斜,而帶來 SOAP 和 WS-* 的逐漸式微?我的看法:REST 的無限上崗,絕對不是 IT 大眾之福。不可諱言,REST 的確在某些領域非常有價值,尤其是在邊際 (edge) 端的應用,像AJAX、mashups 等一般被歸類在 Web 2.0 領域的應用,往往和用戶有比較強的互動。至於在server 對 server 的領域,像服務之間的自動化呼叫,需要服務能自動探索、自我描述的能力,REST 本身並無這種機制(也許以後會有,這是另一個我想稍後另篇探討的話題),另外像需要配合 policy 做比較複雜的安控,這些還是交給 SOAP 和 WS-* 比較合適。
對科技概念擴大解釋或模糊解釋是一種很可怕的現象。SOA 被過分炒作,變成凡事都符合 SOA,凡事都支援 SOA 的情形,猶歷歷在目。真的很不想看到 REST 又走上這條路。看得更憤世嫉俗點,我們甚至可以說,有心炒作新東西,對其擴大解釋,甚至不惜混淆視聽的,幕後一定別有用心。不是分析師想提高自我聲望,沽名釣譽,就是可以從支持新技術的產品或服務中獲利。至於那些看不清楚事情的本質,便隨著旁人在口水戰中起哄幫腔者,恐怕只是成了被有心人利用的炮灰。