レポジトリ
Finatraとは
公式 から引用
Finatra is a Scala services framework built on top of TwitterServer and Finagle.
twitterが開発している tiwtterServer と Finagle を土台にしてでできたフレームワークです。
セットアップ
めっちゃセットアップが楽です。コピペでローカルは立ち上がります。(例外があったらすみません)
こちらを参考にしました:https://qiita.com/TakashiOshikawa/items/53dcc42f0ab6c6377f7a
メモとしても書いていくので参考にしていくソースものっけていきます。(Githubのissueとか)
環境
- MacOS X
- Intellij IDEA (*)
- sbt
(*) ターミナルからでも構築できます。
プロジェクト作成
2つ方法を紹介します。
intellijを使う
intelliJに Scalaプラグインを導入
intellijを開いて ⌘,
を叩くと設定画面が出てくるので左上の検索窓にplugins
と入力してEnter
次に真ん中の検索窓にScala
と入力しEnter
。
でできましたこいつです。
インストールクリックして右下のapplyを押せば完了。
再起動してプロジェクトを作成
この画面が表示されるので + Create New Project
を押下。
左側から scala を選択すると真ん中に選択肢が出てきます。
stb
を選択して Next
を押下するとプロジェクトの名前やディレクトリを尋ねられるので適当に入力して進んでください。
するとエディタ画面になって勝手にディレクトリ構造ができています。
ビルド定義
次にベースディレクトリ直下にある build.sbt
に次のコードをコピペしてください。すでに出来ているコードもいりません。
lazy val root = (project in file(".")).
settings(
name := "twitter-clone",
scalaVersion := "2.12.8",
libraryDependencies ++= dervy,
resolvers ++= resolve
)
lazy val dervy = {
Seq(
"com.twitter" %% "finatra-http" % "19.2.0"
)
}
lazy val test = {
Seq("com.twitter" %% "finatra-http" % "19.2.0" % "test" classifier "tests")
}
lazy val resolve = {
Seq(
Resolver.sonatypeRepo("releases"),
"Twitter Maven" at "https://maven.twttr.com"
)
}
これで保存すると右下にSync dependency
とかなんかニョキッと出てくるのでSync(同期)する方を押してください。IntelliJが勝手にfinatraの依存関係を注入(同期)してくれます。
次の項目は飛ばしてください。
sbt new する
好きなディレクトリで
sbt new robinske/hello-finatra.g8
プロジェクト名を聞かれますがここも好きにしてください。
するとこんな感じ。
himatra/
├── build.sbt
├── project
│ └── build.properties
└── src
└── main
├── resources
│ └── logback.xml
└── scala
└── Server.scala
サーバーの起動、ルーティング処理を追加
./src/main/scara/main.scala
に以下のコードをコピペしてください。
import com.twitter.finagle.Http
import com.twitter.finagle.http.Request
import com.twitter.finagle.stats.NullStatsReceiver
import com.twitter.finagle.tracing.NullTracer
import com.twitter.finatra.http.filters.HttpResponseFilter
import com.twitter.finatra.http.routing.HttpRouter
import com.twitter.finatra.http.{Controller, HttpServer}
object Main extends FinatraBenchmarkServer
class FinatraBenchmarkServer extends HttpServer {
// 色々な設定項目はBaseHttpServerを参照
// override def defaultFinatraHttpPort: String = ":9000"
// override def defaultHttpServerName: String = "0.0.0.0"
override def configureHttpServer(server: Http.Server) = {
server
.withCompressionLevel(0)
.withStatsReceiver(NullStatsReceiver)
.withTracer(NullTracer)
}
override def configureHttp(router: HttpRouter): Unit = {
router
.filter[HttpResponseFilter[Request]]
.add[FinatraBenchmarkController]
}
}
class FinatraBenchmarkController extends Controller {
private[this] val helloWorldResponseText = "Hello, World!"
get("/json") { request: Request =>
Map("message" -> "Hello, World!")
}
get("/plaintext") { request: Request =>
helloWorldResponseText
}
}
保存したらsbt shell (なかったら画面左下のそれっぽいとこをクリックして出てくる。) で
sbt:project-name> run -http.port=:9000 -http.name=:localhost
を叩く。
[info] Running Main -http.port=:9000 -http.name=:localhost
と出てきたらOK
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.とか出てくるけど無視してオッケーです。
確認
自分はPostmanを使っています。cURLだとダメでした。
http://localhost:9000/json
を叩いてみましょう。
{"message":"Hello, World!"}
と返ってきたら成功。
ちなみにヘッダは
Date : Sun, 03 Mar 2019 07:00:03 GMT
Server : Finatra
Content-Length : 27
Content-Type : application/json; charset=utf-8
以上。