網站構建一個穩定、高效的后臺服務器程序是一件非常重要的事情。要達到這樣的目的,選擇一款快速、高效的后臺程序款框架是我們必須要考慮清楚的。一個后臺框架是一系列工具、代碼包以及其他軟件模塊的集合,利用這些基礎設置你就可以快速的開發出功能全面的服務器后臺程序。這些框架在設計之初就考慮到了將來的服務器程序要面臨的需求,并且提供了比較合理全面的解決方案。我們只需要根據我們的需求,對應到這些框架的不同模塊,利用這些模塊實現我們的業務代碼即可。
本人掌握了包含市面上大部分常用的編程語言以及相關的框架,也都使用過這些框架開發出了 server 程序。在2021年,我羅列出目前常用的幾個框架與大家分享交流。
編程語言:PHP
laravel是一個免費、開源的PHP開發框架,它是基于MVC程序結構設計的。對于常年使用PHP語言做項目的人來說,laravel是普遍的首選方案。我以前接手的一些項目,云服務器平臺是客戶早年就在使用的,比如GoDaddy、Hostinger 等等,這些云平臺對PHP語言的支持非常好,那么考慮到入鄉隨俗,要使用云服務里的PHP環境,那么用laravel就是非常合適的了。
laravel提供了權限管理、API 設計、后臺緩存、日志管理、測試等多種功能。它的文檔也非常的全面易懂。laravel 非常適合用來開發博客網站、門戶網站、電商網站的后臺。
不過時過境遷,由于現在更多更好的框架的出現,PHP語言以及laravel變得有些過時和年邁,很多人會暫時放棄PHP以及laravel,會嘗試使用其他的選擇。
編程語言:Python
我把這兩個框架放在一起進行說明。幾年前我在自學完Python語言后,就去尋找基于Python的服務器開發框架,flask和Django是兩個常用的。在玩過了這兩個框架之后,我明確的選擇了Flask。因為我個人的開發風格和習慣是前后端分離的,用Angular或者Vue去專心開發前端頁面,用框架細致的開發后端服務器的一些功能,前后端之間的通信和數據交換使用 Restful API 來實現。
Django也是一款比較強大的框架,但是它對前后端分離風格的開發者不太友好。在開發的時候很多時候需要將前端的HTML、JavaScript和后端的Python進行聯合開發,代碼可能會比較混亂。但是事情都有兩面性,反過來講Django的封裝性更好一些,很多功能都是拿來即用的,只要根據自己的需求稍加修改,就可以快速的實現一些功能,比如form表單。
而 Flask 是純粹的前后端分離的風格,屬于微型框架。你在用Flask寫代碼的時候,可以完全不需要考慮前端。可以專心的開發服務器程序。最后提供一些 API 訪問鏈接地址給前端即可。所以Flask 框架會比Django更小,使用flask也需要開發者去處理和開發更多的功能邏輯。
編程語言:JavaScript / TypeScript
得益于node.js的流行和廣泛使用,歷史悠久、可愛的JavaScript語言終于可以涉足到后臺服務器程序開發領域了。一般的,在安裝好node.js后,很少有人會直接用JavaScript原生的開發服務器代碼,而是會選擇一款框架。那么express.js和koa2就是目前比較流行的兩款框架了。
他們都可以用 JS 快速的開發出 API 程序,也都能通過安裝其他的模塊實現與后臺數據庫的連接。我個人在多年的編程經歷中,面對中小型的項目,對性能要求不高的時候,都會考慮使用這兩個框架。一般會很快的寫好 Restful API 程序和數據庫的CRUD程序。另外部他們兩個的部署也比較方便,Linux上裝好node.js,然后服務器程序文件放在一個地方,用 pm2 這種基于 node.js 的命令工具啟動即可向前端提供服務了。
這兩個框架其實是同一班人的作品。express.js問世的較早,koa2其實是express.js的改進,代碼更加精煉緊湊,都是不錯的選擇。
編程語言:Java
聚光燈照顧來,歡呼尖叫響起,superstar 到來了。沒錯,spring是這幾年服務器開發框架里的明星。基于Java這幾十年的穩健發展,已經有了太多的處理各種問題和需求的Java第三方包。再結合spring的優良品質,比如常見的權限控制、Restful API 開發、SQL/NoSQL 數據庫操作這種常見的功能以外,還可以想象一下利用spring結合hadoop生態來開發big data 應用,那會是另外一片天空了。
我個人在2020年指導了幾個本科大學生的畢業設計項目。他們告訴我,他們的老師不僅要求他們寫論文,還需要他們開發一個完整的Web項目,要有網站、服務器,后面還要掛個數據庫。值得注意的一點是,導師們要求他們必須用spring框架實現服務器。這些學生當然連前端三劍客 HTML/CSS/JavaScript 都還沒有玩會,后臺抽象的代碼更是小白一個。他們說導師也只是知道有這種技術,但是也沒法完全指導他們,所以我就有了雪中送炭的機會。
另外,現在很多中大型網站的后臺的主要業務邏輯,就是用java的spring來實現的,并結合其他技術向外提供服務。比如國內的一些電商平臺就是這樣的設計。
上面我只是列舉了幾個典型的方案,其實還有很多,我基本上都玩過。比如 hapi(JavaScript)、Golang(Go)、Slim(PHP)等等。大家可以根據自己的需求和實際情況,了解這些框架后進行選擇。
和擇偶很類似,選擇適合的才是明智之選。大家都說她好,包括你的父母都很欣賞那個人,但是你就是不喜歡。所以強扭的瓜不甜。下面是幾條選擇框架的方針,供大家參考:
送給大家一句話:
擇偶時,沒有最好的,只有合適的。選擇框架也是一樣的 !
歌Chrome產品管理主管阿弗尼?沙哈(Avni Shah)今天在I/O開發者大會上發布了新版Chrome,該產品將出現于名為Android L的新一代Android系統版本上。
與預期一樣,新版Chrome進行了一些功能升級。不過它并不只是進行了改進。對于它,谷歌還傳達了一個清晰而意義深遠的信息。該公司想要融合原生應用與網頁標簽。原生應用的終結可能比我們想象得還要快。
在Android L中,經過重新設計的應用切換器與iOS 7上的Safari非常相似。它會在某種卡片抽屜中顯示你最近打開過的應用。同時它也顯示原生應用以及活躍網頁標簽。每一個網頁標簽都有著與應用同等的價值。這是件大事。
同樣地,谷歌將其應用索引API(應用程序接口)擴展至所有的Android應用。在此之前,該公司就與特定的幾家公司展開了相關合作。例如,在谷歌搜索電影,搜索結果中會出現一個可直接打開IMDb應用中相關電影頁面的深度鏈接。這是一種從網頁到原生應用的無縫過渡。
了解這些后,不妨想象一下Android L會變成什么樣子。打開手機,在主屏幕上用谷歌語音搜索某樣東西,接著Chrome打開,點擊第一個搜索結果,你就可以打開原生應用。你可以轉到應用上閱讀你之前在Chrome上看到過的這篇文章。
在這一過程中,網頁應用與原生應用之間反復來回切換。不久之后,你會察覺不出自己是在網頁中還是在原生應用當中。
為什么說這一變化有意義呢?谷歌一直以來都是以網頁開發為先。該公司最早是通過它的搜索引擎取得成功。不過它之后的熱門產品很多都是網頁應用,如Gmail,Google Calendar日歷,Google Drive。谷歌可能仍然是網頁應用開發領域的王者。
而更重要的是,谷歌的大部分收入還是來自網頁廣告。該公司希望人們更長時間地呆在web上,從而看到更多的谷歌廣告。這一點在下一份季度財報中還不會發生改變。
因此,不管是從技術還是從業務角度來看,谷歌的未來都維系在web上。有幾位HTML5和網頁開發倡導者認為,Android最終可能會成為基于網頁應用的操作系統。這實際上也意味著原生應用的終結。
數家公司在這方面展開過嘗試——推WebOS的Palm和打造Firefox OS的Mozilla。它們都以失敗而告終,原因有多個方面——當時的系統級芯片還不夠強大,網頁運行不夠高效,它們的網頁開發者不夠出色。
最主要的原因還是時機問題。而谷歌這個適合步步為營地向這種新的應用模式轉型則并無不妥。現在的系統級芯片可能能夠運行功能齊備的筆記本電腦。谷歌一直在不知疲倦地改進JavaScript和HTML渲染引擎。當然,谷歌麾下也有成千上萬優秀的網頁開發者。
推廣網頁應用是個漫長的過程,可能要耗時數年。不過谷歌今天的行動可以說是明確向這一方向邁出的第一步。(譯:羽騰)
/ Google Android NDK 技術負責人 Dan Albert
最新版本的 Android 原生開發工具包 (NDK) Android NDK r16 Beta 1 現在可以下載了:
https://developer.android.google.cn/ndk/downloads/index.html
也可以通過 Android Studio 在 SDK 管理器中獲取此版本。
NDK r16 對我們來說是一個重大的里程碑,因為它是我們準備建議用戶開始遷移到 libc++ 的第一個版本!我們會在后面提供更多信息。
我們還更新了 libc++ 及其相關項目,因此,這個版本提升了對 C++1z 的支持。請注意,在 C++1z 成為 C++17 之前,包含的任何內容都有可能發生變化。
您可以在此處查看該版本的版本說明:
https://android.googlesource.com/platform/ndk/+/ndk-release-r16/CHANGELOG.md
NDK 有一個名為 libandroid_support 的庫,這個庫可以向后移植 libc++ 依賴、但舊版本不支持的 libc API。我們至今無法認可 libc++(在 NDK 中實現)的原因仍然是對這個庫缺乏信心。r16 的焦點是重新編寫了這個庫,以獲得更高的穩定性。
由于 libandroid_support 現在是一個比較小的庫,您的應用的行為應當更接近系統的行為。例如,libandroid_support 之前包含對部分 stdio 的替代實現。盡管一些功能向后移植到 ICS,不過,這也意味著替代實現中的任何錯誤都會出現在自從您的應用引入錯誤以來發布的 所有 OS 版本中。
在新版本的 libandroid_support 中,我們已將替代實現移除,因此您在較舊的設備上將無法使用某些功能(幾乎是一些沒人使用的功能,例如格式字符串中的 %a 支持),不過由于沒有這些功能,您使用 libc++ 的應用將變得更小、更可靠。
所以,為什么您應轉到 libc++ 呢?首先,其他 STL 今后將不再受支持。我們一直將 libc++ 用于自 Lollipop 以來的 Android 平臺,有一項變化讓我們的工程師感到非常興奮。我們在平臺中比在 NDK 中更早地完成了這種過渡,因為我們不需要 libandroid_support,并且可以僅更新 libc。
與 NDK 中當前可用的其他 STL 相比,libc++ 完全支持 C++11、C++14 和大多數的 C++1z!Stlport 自從 2008 年以來就沒有更新過了,gnustl(我們對 GNU 的 libstdc++ 的叫法,這是為了避免與 Bionic 的 libstdc++ 混淆,后者不是一種 STL)一直以來都不是很適合 Clang,尤其是在與 和 之類的編譯器內建函數緊密關聯的標頭中,更是如此。
我們很有可能讓 libc++ 成為下一個 NDK 版本的默認選擇,但是現在,如果您還沒用過,可以按照下面的說明操作,選擇啟用這種庫。
像其他 STL 一樣,libc++ 同時提供靜態庫和共享庫。使用哪一個取決于您的具體情況,但是如果您的應用中有且僅有一個共享庫,tl;dr 將使用靜態版本,并在所有其他情況下使用共享版本。
ndk-build
將以下內容添加至您的 Application.mk 文件中:
APP_STL :=c++_shared
CMake
調用 CMake 時請粘貼以下內容:
-DANDROID_STL=c++_shared
如果您正在通過 Gradle 使用 CMake,請將以下內容添加至您的 build.gradle 中:
externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" } }
獨立工具鏈
在創建獨立工具鏈時,請傳遞 --stl=libc++。
如果您已經閱讀我們的路線圖:
https://android.googlesource.com/platform/ndk/+/master/docs/Roadmap.md
想必了解我們計劃擴展 libandroid_support 以向后移植盡可能多的 libc/libm。每次跟大家說到這個問題,我們最多只是收到冷淡的回應。考慮到大家看起來不感興趣,而且這樣做也會讓庫增大(進而導致 APK 增大,這是每個人都非常感興趣的話題),我們不再打算擴展。
如果我們誤解了您的回應,或者您還沒有回應我們,并且希望我們擴展,請告訴我們:
https://github.com/android-ndk/ndk/issues/456
tl;dr:如果您想要保留舊 NDK 中的行為,請不要設置 _FILE_OFFSET_BITS=64。
在 NDK 中設置 _FILE_OFFSET_BITS=64 一直都沒什么用。此功能在棄用的標頭中已經移除。對于統一標頭,NDK 現在具有支持此功能的最新標頭。
您可以在您的應用中定義 _FILE_OFFSET_BITS=64 宏,以便在 32 位代碼中獲取對 64 位 off_t 的支持。將 off_t 設為 64 位(默認情況下,它在 32 位代碼中為 32 位)和使用 lseek64 調用隱式替換對 lseek 之類 API 的調用可以實現這種支持。
之前版本的 Android 沒有添加對 _FILE_OFFSET_BITS=64 的支持。lseek64 這個 API 一直在 bionic 中。大多數 API 在 Lollipop 中添加,其他的一些 API 則到后期版本才添加。
如果您針對的版本不支持正在使用的某個函數的 64 位 off_t 變體,并且已設置 _FILE_OFFSET_BITS=64,該函數將不可用。這與 r15 和 r15b 的行為不同(但與 r15c 的行為一致),在這兩個版本中,函數使用 32 位 off_t 錯誤公開,將被靜默截斷。
請注意,即使沒有不同名稱的 _FILE_OFFSET_BITS=64,64 位 off_t API 仍然可用。例如,請調用 lseek64,而不是 lseek。使用 off64_t,而不是 off_t。
最后,由于此功能對具有統一標頭的 NDK 來說是一項新功能,如果您只想返回到統一前的標頭行為,您要做的只是停止設置 _FILE_OFFSET_BITS=64。
如需了解有關 bionic 中 off_t ABI 詳細信息的更多信息,請參閱 Bionic 32 位 ABI 錯誤文檔:
https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md
查看更多文章,請關注『谷歌開發者』官方微信公眾號
*請認真填寫需求信息,我們會在24小時內與您取得聯系。