QCon2018上海全球軟件開發大會上,來自阿里巴巴閒魚技術的新新爲你們帶來主題爲「Flutter & Dart三端一體化開發」的演講。做爲三端一體化的「佈道者」,展現後移動互聯網時代一種全新的開發模式,爲聽衆帶來進一步提升移動應用開發效率的思路。android
本次分享從「懶」和「效率」引入,分析Flutter的特色,簡單介紹閒魚經過Flutter統一iOS和Android兩端的移動應用開發的經歷。而後提出Dart Server「膠水層」的概念,「膠水層」是由客戶端開發作簡單數據拼裝的一個「薄」服務端,用Dart統一語言,再經過開發All-in-IDE(建立接口框架、快速隔離部署、本地測試、無衝突調度等)統一開發模式,讓寫服務端「膠水層」的體驗和寫客戶端基本一致,並嘗試經過服務集合和代碼生成等方式,不斷下降「膠水層」的學習成本,最後實現三端一體化開發的思考和實踐經歷。編程
提問環節
現場聽衆很是踊躍熱情,有很多同窗對Flutter的運用前景比較樂觀,並表示引入Flutter開發的強烈慾望。有同窗興奮的說,他們以前8個月的開發時間,選擇Flutter之後降成1.5個月,效率不只僅是成倍的提高。另外有很多同窗對Dart「膠水層」服務端和三端一體化開發這個新模式表示興趣。觀衆提問主要圍繞如下幾個點: (1)閒魚在Flutter的經驗:包括混合開發的問題;包大小優化;複用現有的Native基礎組件;複雜的動畫;怎樣鏈接OpenGL;數據流怎麼管理等等。 (2)Dart Server的一些疑問:和NodeJS的方案比較、Dart Server開發階段用Hot Reload快速部署,上線後代碼怎麼管理。 (3)閒魚一些技術的開源計劃:Dart Server Framework和工具集開源是否有具體日程,UI2Code是否有開源的計劃。後端
從提問反饋狀況咱們也得到下一步思考方向: Flutter再進一步深刻要作什麼? 膠水層是否從微服務到Serverless化? Dart Server Framework開源什麼,哪一些是適合閒魚本身的業務,哪一些是通用的?數據結構
內容摘要:
在閒魚APP中,咱們經過Flutter混合開發,實現商品詳情頁和發佈頁,從體驗來看,Flutter表現出很是接近Native的流暢性和交互效果。
在經過Flutter統一iOS和Android的兩端開發後,咱們想嘗試進一步提升開發效率,提出一我的寫三端的想法,可是客戶端寫服務端會有一些問題: (1)客戶端的開發方式和思惟方式和服務端開發有不少不一樣點。客戶端是本地程序,服務端是分佈式系統;客戶端開發注重細節和檢驗,服務端關注性能和容災。 (2)服務端的部署很麻煩,機器不少,運維也很麻煩,客戶端同窗很難掌握。 (3)這種作法純粹給客戶端同窗加工做量,影響需求進度。
咱們想讓客戶端同窗簡單的實現服務接口,像搭樂高積木同樣方便。 由此提出「膠水層」的概念,在客戶端和服務端中間加一層「膠水層」,它主要作的事情是調用後端服務,拼裝客戶端所須要的數據。 客戶端是Flutter,用的是Dart語言,爲了讓客戶端同窗快速上手,「膠水層」優先考慮Dart。
Dart Server實現「膠水層」業務邏輯,框架提供了高性能的HTTP服務、服務路由、代碼隔離、動態部署等基礎服務。經過C++擴展或Service Mesh接入原有的JAVA中間件。而原有的後端服務下沉爲領域服務,每一個具體的領域由固定的服務端同窗維護。 須要注意「膠水層多變、領域層少變」的原則,才能真正的提升開發效率。 咱們選用閒魚流量最大的商品詳情接口在線上實驗,運行三個多月,沒任何線上問題,內存佔用穩定。RT和最大QPS基本和原有JAVA服務持平。
只是統一先後端語言是不夠的,怎麼讓Flutter開發同窗快速上手。 (1)可否像寫客戶端程序同樣寫服務端膠水層?作到本地開發、運行、調試。 All-IN-IDE,經過IDE Plugins,支持一鍵建立接口框架,快速部署本地代碼到服務端,在開發機器直接調用遠程服務並把結果和日誌同步回來…… (2)怎樣才能快速的找到所須要的服務?可否像調用本地方法同樣調用後端服務? 在服務接口和方法加註解,經過註解生成文檔,能夠在文檔平臺上搜索查詢。 經過本身實現的JAVA2Dart的代碼轉換工具,能夠把一個定義了接口和數據結構的Jar包轉成Dart代碼,同步也生成服務註冊和發現的代碼。 (3)在寫代碼的時候基本可否不考慮埋運維數據? 在代碼生成中預埋了日誌和降級開關。
移級部署是經過Dart Isolate來實現。
經過不一樣技術棧的同窗實驗。 沒有任何Dart基礎的Java後端開發和有Flutter基礎的移動應用開發同窗,基本均可以在1小時內搭好環境並把Hello World寫好部署,最多半天能夠寫一個帶有真正業務涵義的接口上線。 由於Dart Server是單線程異步開發模型,很容易寫出高性能的併發請求代碼。 客戶端同窗對後端服務理解要必定的過程,因此接口設計清晰很重要。
三端一體化開發的模式,一我的寫了iOS、Android和它們所依賴的服務接口。 (1)之前在客戶端拿到後端實現協議數據後,通常還要作從數據模型到視圖模型的轉換,如今不須要了,能夠定義符合客戶端展現需求的數據結構,在膠水層實現數據填充。因爲先後端都是Dart語言,定義的數據結構代碼是通用的,不存在兼容問題,不須要引入第三方協議定義語言。 (2)原來在客戶端寫的一些業務邏輯,能夠根據須要轉移到膠水層。 (3)Flutter實現iOS和Android兩端UI。能夠經過動態Widget管理框架,配合膠水層下發模板數據,讓Flutter有必定的UI動態性。 三端一體化開發的一些好處: (1)減小先後端溝通成本,減小因協同引發的時間等待成本。 (2)開發更加靈活,部分邏輯在服務端實現讓客戶端擴展性更好。 (3)一體化開發、全鏈路日誌、無衝突調試,讓錯誤排查成本下降。 (4)能夠更關注領域服務的性能、通用性等問題。
將來能夠經過機器學習作到UI2Flutter,客戶端開發只須要寫交互邏輯和膠水層數據拼裝,作到開發半自動化。
加入閒魚,一塊兒玩些「酷」的
閒魚技術團隊是一隻短小精悍的工程技術團隊。咱們不只關注於業務問題的有效解決,同時咱們在推進打破技術棧分工限制(android/iOS/Html5/Server 編程模型和語言的統一)、計算機視覺技術在移動終端上的前沿實踐工做。做爲閒魚技術團隊的軟件工程師,您有機會去展現您全部的才能和勇氣,在整個產品的演進和用戶問題解決中證實技術發展是改變生活方式的動力。 簡歷投遞:guicai.gxy@alibaba-inc.com併發