Feb 17, 2012

TOTP authentication demo 開發工具與佈署環境(Heroku)

延續前篇 使用 TOTP 與 Google Authenticator 實作 Two-Factor authentication ,此篇說明使用到的工具與相關心得

Application
Back-end

  • Java
  • slf4j
  • Apache commons-codec
  • Spring framework 3.1
嘗試了些新版的功能
1. Java-based configuration 覺得一般使用沒比 XML schema-based 好用,做框架設計的時候會比較實用,動態組裝、設定樣版、模組化,不知道還能怎麼運用
2. Environment API 在啟動時依系統參數來區分"開發"或"佈署環境"的Profile,用於載入不同的 bean definition,若沒指定啟動參數則為 default 的 profile
e.g. JAVA_OPTS => -Dspring.profiles.active=heroku
Google 的 QRCode library,在這用來產生 QRCode image 傳遞 secret key
Redis Client 端的 Java Library
在這用來做 redis 的連線控制,避免階層操作下佔用多組連線
  • TOTP Algorithm
基於 RFC6238:TOTP: Time-Based One-Time Password Algorithm 附錄程式並做了些簡化

Front-end
  • Spring MVC
試用 Servlet 3.0 免宣告 web.xml 的功能,但從 Tomcat 搬到 Jetty 遇到些問題,在 Jetty 的根目錄(/) 會被 DefaultServlet 覆蓋, 導不到 spring mvc的DispatcherServlet,不想多加 Filter 只好換回 web.xml
Twitter 開發的前端工具庫





Environment
Common
Heroku 上有免費的 Redis 服務可以用,但有空間與連線數(10)限制,若使用 Connection Pool 要多留一個做遠端管理,否則當連線數滿了,就只能 stop application 來釋放
  • Maven
Heroku 佈署 Java application 預設要透過 Maven 來編譯、打包
  • Git
Git 是在 Heroku 用來 deployment 與 release management 的工具,先透過 Git 將原始程式上傳Heroku 後, Heroku 收到更新通知、讀取 pom.xml 進行編譯與打包

這個 demo application 也透過 Github 來 open source 

Development
  • Eclipse
  • Tomcat
  • JRebel
  • 是 Java 的 hotswap 工具, 免除重新佈署的等待,跨平台且並支援多數知名的Framework,使用上需附加於IDE、Maven、Ant,舉例來說對某 Controller 新增了一個 RequestMapping method,JRebel agent 在偵測到有新編譯的class file 後, 會將 class file 複制到 Tomcat 相對的 classpath 裡,並在JVM裡重載該 class file與重載instance,替換互相參照的 object reference,更新Spring MVC 的 url hander mapping 快取

    除了收費的 Enterprise 版本,也有免費的 Social 版本,基本上兩者的功能相同,只是Social版不能用在商業用途,用的時候要幫忙打廣告

Production
  • Jetty
在 Heroku 佈署程式必需是 standalone application,在開始開發的時候用的是 tomcat embedded 但Eclipse WTP 的佈署方式會產生Jar hell,改用 Jetty 除了避開衝突,另一個好處是 Jetty Ruuner 可以少寫 Main program,當作一般web application佈署
e.g.
java $JAVA_OPTS -jar target/dependency/jetty-runner.jar target/*.war

相關的佈署方式可以參考 Heroku 官方說明文件
http://devcenter.heroku.com/categories/java
使用 Heroku 的主要想借鏡其 auto scaling 的運作模式,然而單個 web dyno 免費也是誘因

平台好處就不多說,可以參考官方說明,如同其它的 Paas 平台,Heroku 也有一些使用限制,像是:
  • 30 秒 request timeout 
  • startup 超出 60 秒,重啟
  • shutdown 時間超出 10 秒,強制 kill process
  • 安全性問題 (e.g. 共用環境、原始碼上傳)
  • file system、database、mail server、monitoring、video streaming 等,需依靠外部的 Saas 支援
  • 執行環境限制(e.g. 沒windows、JNI、WebSockets、static ip)
  • SSL 加 $100 / month
  • 記憶體限制(512 M),使用量 1G 時警告,1.5G 直接重啟
  • 沒有 scale up 的選擇( 跑 Java 是需要些基本門檻的,許多JVM優化還是靠 memoery 與cpu 來撐)
  • data center 僅有美東,與台灣的連線差不多 RTT 200ms 
  • 單個web dyno 於 1小時內沒有 request 則會 idling ... 等接收到 reqeust 時才會重啟 application
  • application 的設計要能隨時被 shutdown,因此需要有較嚴格的容錯設計,此 scaling 策略比較簡易
  • Heroku 平台框架會不斷的衍進,也會捨棄部份舊有功能(e.g. Cedar stack 去掉了varnish 也更換 domain name)
  • Java 版的 newRelic 加入後,跑一陣子記憶體就會超出限制
  • 其它限制可以參考官方FAQ http://devcenter.heroku.com/tags/faq

Heroku 價格不太親切,單個 dyno 為 $0.05/1hr ,在AWS相對等級的 (micro instance) 則為 $0.02/1hr,但對startup而言,若是不想在草創初期投入基礎建設,那到可以考慮先用來擋突發的尖峰流量,末來再衡量實際需求,量身打造自身的運作環境

No comments: