LoginSignup
6
6

More than 5 years have passed since last update.

Finatra やるぞい (①セットアップ編)

Last updated at Posted at 2019-03-03

レポジトリ

Finatraとは

公式 から引用

Finatra is a Scala services framework built on top of TwitterServer and Finagle.

twitterが開発している tiwtterServerFinagle を土台にしてでできたフレームワークです。

セットアップ

めっちゃセットアップが楽です。コピペでローカルは立ち上がります。(例外があったらすみません)
こちらを参考にしました:https://qiita.com/TakashiOshikawa/items/53dcc42f0ab6c6377f7a
メモとしても書いていくので参考にしていくソースものっけていきます。(Githubのissueとか)

環境

  • MacOS X
  • Intellij IDEA (*)
  • sbt

(*) ターミナルからでも構築できます。

プロジェクト作成

2つ方法を紹介します。

intellijを使う

intelliJに Scalaプラグインを導入

intellijを開いて ⌘, を叩くと設定画面が出てくるので左上の検索窓にpluginsと入力してEnter
次に真ん中の検索窓にScalaと入力しEnter
でできましたこいつです。

スクリーンショット 2019-03-03 18.19.00.png

インストールクリックして右下のapplyを押せば完了。

再起動してプロジェクトを作成

この画面が表示されるので + Create New Project を押下。

スクリーンショット 2019-03-03 18.31.40.png

左側から scala を選択すると真ん中に選択肢が出てきます。

スクリーンショット 2019-03-03 18.39.47.png

stb を選択して Next を押下するとプロジェクトの名前やディレクトリを尋ねられるので適当に入力して進んでください。
するとエディタ画面になって勝手にディレクトリ構造ができています。

スクリーンショット 2019-03-03 18.40.59.png

ビルド定義

次にベースディレクトリ直下にある build.sbt に次のコードをコピペしてください。すでに出来ているコードもいりません。

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に以下のコードをコピペしてください。

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を叩いてみましょう。

スクリーンショット 2019-03-03 19.10.05.png

{"message":"Hello, World!"}と返ってきたら成功。

ちなみにヘッダは

header.txt
Date : Sun, 03 Mar 2019 07:00:03 GMT
Server : Finatra
Content-Length : 27
Content-Type : application/json; charset=utf-8

以上。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6