What is Playframework
Playframework是一個基於JVM進行Java和Scala的WEB開發的全棧式開發框架,裏面集成了許多開發模式的最佳實踐,以及當下流行的開發技術。程序員
對高可擴展性的應用,Play提供了可控的最小化的資源消耗(CPU, memory, threads)web
Why is Playframework
如下是我對框架優點的總結數據庫
- 對程序員更加友好
- 開發流程的改變:不須要從新編譯再啓動服務。取而代之的,只須要更改代碼後刷新頁面,框架會自動作這些事情
- 強大的命令行,新建工程、編譯、運行、測試、打包、發佈等經常使用功能都有對應的命令來執行。
- 以上兩點也意味着,框架裝好後,只須要一個編輯器就能夠開工了。(對於eclipse等IDE框架支持但不是必須)
- 性能
- play內在就是一個異步的框架,它會異步的非阻塞的處理全部請求(NIO基於netty、異步模型創建於akka之上)。無阻塞和異步解決了併發數目的瓶頸,最大化發揮系統的能力,也能夠更好的計劃後續的擴展。
- 不管是選用Java仍是Scala,都運行於JVM之上,可靠且穩定
How to use
安裝
- 下載 :http://downloads.typesafe.com/play/2.2.3/play-2.2.3.zip
- 安裝:解壓後 將play加入環境變量
first app
- 命令行模式下輸入 play new youappname, 而後再選擇一下語言,工程就建立好了
- 切換目錄到你的工程所在,輸入play,會彈出play的交互式命令行,輸入run啓動工程,run [port]指定端口,默認是9000.啓動後在瀏覽器中輸入localhost:9000,能夠看到歡迎頁面
- 若是你用的eclipse,在命令行執行:eclipse,建立工程文件
- 打開工程,咱們來瀏覽一下工程的結構
- app/:包含應用的核心代碼,內部拆分爲models、controllers、views三個目錄,這裏是放置源碼的地方
- conf/: 包含應用全部的配置文件,特別是主配置文件application.conf、路由定義文件、和國際化文件
- project/: 包含構建腳本,構建系統基於sbt
- public/ :包含全部公開資源,包括js,樣式和圖片的目錄。
- test/ :包含測試代碼
- 添加本身的請求和action:
- 在conf下的route 添加對應路由,配置到本身的action
- 實現這個action
Why play is highly-scalable
Play從上到下都是異步的,使用iteratees異步的處理流。由於play的核心從不阻塞,相對於傳統的web框架線程池被調整的很小。 所以,若是你打算寫一些阻塞IO的代碼,或是CPU密集型的處理代碼,你須要知道是哪一個線程池在承受運行壓力,而後相應的調整它。作阻塞IO的時候不去考慮這些極可能致使Play框架的性能很是低下。例如:每秒只能處理不多的請求,CPU卻只用了5%。對應的,若是調整得當,在普通硬件(好比MACPRO)條件下的測試代表Play能夠絕不費力的每秒鐘處理成百上千次請求。瀏覽器
注意:如下類型的IO是徹底不會阻塞的 (意味着沒有任何線程在阻塞等待)併發
- The Play WS API:Play內置的webservice調用lib
- 異步的數據庫驅動如ReactiveMongo
- 從Akka的actor中發送、收取消息
Play使用不一樣的線程池實現不一樣的目的:app
- Netty boss/worker thread pools - 這些線程是Netty用來處理Netty IO的,應用代碼不可使用此線程池中的線程執行代碼。
- Play Internal Thread Pool - 這是Play內部的線程池,線程數量默認與可用處理器數量相同,可在application.conf中配置這個數量。同上,不要用它。
- Play default thread pool - 這是全部應用代碼執行時默認使用的線程池,它是Akka調度的,能夠經過配置Akka的方式來配置它。默認每一個處理器一個線程。
- Akka thread pool - 這是Play的Akka插件使用的,能夠經過配置Akka的方式配置它。
針對不一樣的需求的常見配置以下:框架
- 純異步的
- 意味着每一個操做都沒有阻塞的情形發生,使用默認的配置就能夠了
- 高同步的
- 若是你的大部分action都是阻塞IO(好比讀數據庫),這種狀況下,Play與傳統的web框架差很少,須要大量的線程處理阻塞,因此得把默認使用的線程池調大
- 指定多個線程池
- 同上,大部分action都是阻塞的,但你想要控制同一時刻系統執行哪部分action多一些,哪部分action少一些,你能夠配置多個線程池,並制定他們的權重。