Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
-
Upload
- -
Category
Technology
-
view
1.534 -
download
3
Transcript of Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk
Spring Boot +
Doma +
AngularJS で作るERP
~ JavaQneバージョン ~JavaQne 2015 Fukuoka
2015/01/24
自己紹介• 名前: 松崎 学
• Twitter: matsumana
• blog: http://matsumana.info
• 所属: 株式会社キャム http://cam-net.co.jp/
• 職業: ソフトウェアエンジニア (プログラマ、ITインフラエンジニア)
• ITインフラ勉強会@福岡、MySQL Casual Fukuoka 主催
今日お話する事
• サービスの特徴と、それを支える技術の概要 ・サービスの歴史 インフラ編 ・サービスの歴史 フレームワーク編 ・現在のアプリの開発環境
• Spring Boot, Doma, AngularJSを選んだ理由と実際に使ってみた感想
まず始めに
ERPとは何か?企業全体を経営資源の有効活用の観点から 統合的に管理し、経営の効率化を図るための 手法・概念のこと。 ERPが一般的に扱うものは企業における 製造・物流・販売・調達・人事・財務会計である。 ERPパッケージはこれらの基幹業務に関する 業務活動の情報管理を支援する。
Wikipediaより http://ja.wikipedia.org/wiki/企業資源計画
基幹システムとは何か?
企業の情報システムのうち、業務内容と直接に関わる販売や 在庫管理、財務などを扱うもの。 あるいは、単に、業務やサービスの中核となる重要なシステム。
IT用語辞典 e-Wordsより http://e-words.jp/w/E59FBAE5B9B9E7B3BBE382B7E382B9E38386E383A0.html
例えばERPでカバーする サブシステムには
次のようなものがあります
• 受発注
• 購買債務
• 販売債権
• 製造
• 在庫
• 原価
• 財務会計
• 管理会計
• 人事
• 給与
• 勤怠
• などなど
• サービス(SaaS)として提供マルチテナントなアプリ顧客のオンプレミス環境ではなく、弊社が構築・運用しているインフラ環境(AWS) でアプリを稼働させている
• インフラ費用は全て弊社負担インフラ費用増 = 利益減少ないリソースでリクエストを捌く事が非常に重要
• OSやブラウザのバージョンアップ対応は無償
サービスの特徴
サービスの歴史 インフラ編
• 2007~ 国内データセンター
• 2013~ AWS
インフラの 全体概要図
http://goo.gl/cTexvM
• サーバやミドルウェアは必ず障害が発生する前提で考えたインフラ構成とアーキテクチャ
• 一部に障害が発生してもサービスが止まらないように各レイヤーは冗長構成にする
• サービスが止まるような障害の場合でも出来るだけ早く復旧出来るようにする
インフラ構成のポイント
使用しているソフトウェア• Webサーバ: Apache 2.2
• APサーバ: Seasar2 → Tomcat 6 Java EE 6 → GlassFish 3.1.2.2 Spring Boot → Tomcat 8
• DBサーバ: PostgreSQL 9.3
• 監視: Zabbix 2.0・EC2インスタンスのリソース監視、可視化、 アラート通知・Java GatewayでJVMを監視、可視化、アラート通知
Zabbix Java Gateway を使ってJMX経由で ヒープを可視化したら
こんな感じ
Jenkinsをどんな感じで 使っているかについては 別の資料があるので 抜粋してご紹介します
http://www.slideshare.net/itokami1123/jenkins-java-spring20140609
GitHUB Jenkins
ソースのバージョン管理はGitを使用してます。
GitHub上のリポジトリにソースを集約してます。
PUSH( ∵ ( ∵ ( ∵
\プルリク・プルリク/
GitHUB Jenkins
GitHubからを5分毎にポーリングして
マージしたソースをJenkinsに取得しています。
PULL( ∵ ( ∵ ( ∵
\Git plugin!/
* /5 * * * *
GitHUB Jenkins
Jenkinsの状態(ビルド開始など)をHipChatで通知します。
HipChatは他にもGitHubの状態などにも使ってます。
通知
( ∵ ( ∵ ( ∵
\ Jenkins HipChat Plugin /
\ コンパイルはじまった! /
GitHUB Jenkins
ビルドジョブを実行します。緊急でビルドだけしたい時も考え
てテストジョブは分けてます。
( ∵ ( ∵ ( ∵
\ ビルドなう! /
maven
mvn install -DskipTests=true
ビルド ジョブ
JSHintやCheckstyleで品質管理
GitHUB Jenkins
ビルドジョブ終了をキッカケにテストジョブを実行~。
テストジョブ終了をキッカケにデプロイテストを実行~。
( ∵ ( ∵ ( ∵
ビルド ジョブ
テスト ジョブ
\ 上流から下流ジョブ /
デプロイテスト状況を結果通知
/ちゃんと動いてる!\
GitHUB Jenkins
ステージング環境やプロダクト環境に配備するJOBは手動で
実行しています。(課題の切りのよいタイミングで行う為)
( ∵ ( ∵ ( ∵
ステージング ジョブ
ステージング環境
\ 結合試験! /
課題管理はJIRA使ってます。
手動で起動
ログ収集はFluentd
• AWS (EC2, S3, Route53, SES, RDS, VPC)
• GitHub
• レスポンスタイム可視化: New Relic
• ログ分析: Google BigQuery
• 通知: HipChat
使用しているサービス
次はアプリのお話
サービスの歴史 フレームワーク編
• 2007~ Seasar2 (Teeda + S2Dao) ※現在も稼働中
• 2012~ Java EE 6 (JSF + JPA) ※現在も稼働中
• 2014~ Spring Boot + Doma + AngularJS
アーキテクチャを 選定する上で重要なポイント• ERPはミッションクリティカルかつ、ライフサイクルが長い (世間では10年間とか使われる事もある) 弊社では同じアプリを10年使い続けるのではなく 定期的に作り直す事にしています (いわゆる式年遷宮) 10年前の製品に現在どのくらい魅力があると思いますか?
• 画面の操作性、入力効率、サクサク感を重視
• インフラのコストを抑える (少ないサーバリソースで多くのリクエストを捌く)
サービスを長い間 開発・運用してると
色んな問題が 出てくるものです
• IEの互換モードでしか動かないアプリ(2007年のサービスローンチ時点ではIEは7だったし Chromeも存在しなかった)
• 時代遅れ感が出てきたUI(最近はリッチなWebサイトやスマホアプリが 普及して顧客の目も肥えてきている)
• APサーバやサードパーティコンポーネント(PrimeFaces)のバグに遭遇OSSなので自分で直すという選択肢はあるが、それに割くリソースを確保できなかった
• APサーバのリソース消費が高い
• アプリのもっさり感
2014年1月から 新アーキテクチャでの アプリ開発を開始
いくつかのアーキテクチャの候補を考え
試作アプリを作り 検討を重ねて採用したのが
Spring Boot+
Doma+
AngularJS
なぜSpring Boot?• 組み込みAPサーバでお手軽
• Tomcat/Jettyで必要十分だった。リソース消費も少ない
• Spring Bootなら各種設定や依存ライブラリの指定も楽
• Springもバージョンアップ時の互換性を重視しているので長く使える事が期待できる (Groovy, Grailsみたいにならなければ・・・)
なぜDoma?• JPAに馴染めなかったキャッシュ、N+1問題、エンティティ管理状態(JPAで扱いやすいテーブル設計になってない気もした)
• SQLは自分で書く、SQLは外部ファイルに書くというS2Daoのスタイルに慣れているし、Domaはより便利になっている
• 依存ライブラリが無いので導入しやすい
なぜAngularJS?
• AngularJSについては、この後@itoKami1123さんに話してもらうので割愛
現在のアプリの 開発環境
• 開発はLinux上でやってます
• vagrant upしてリモートデスクトップでログイン
• Windowsで開発し、本番がLinuxだと それに起因するバグを出してしまう事がある・文字コード問題・改行コード問題・パス区切り文字問題・レポートのレイアウト崩れ問題(JasperReports)など
• 必要な開発ツールのごった煮感が半端なくて、セットアップが大変なのでチームのメンバーにVirtualBoxとVagrantを インストールしてもらい、boxファイルとChefのcookbookを配布※ホストOSとゲストOSでクリップボードの共有が おかしいので、ちょっと不便です・・・
プロビジョニングしている ソフトウェア (1)
• Java8
• Maven
• Node.js
• PostgreSQL 9.3
• Fluentd (td-agent)
プロビジョニングしている ソフトウェア (2)
• Chromium
• Mozc
• LibreOffice
• oh-my-zsh
• xrdp
Spring Boot, Domaを 使ってみた感想
Spring Boot / Spring• Seasar2とJava EE 6を使ってきたので、Springのコンテナ機能(DI, トランザクション, AOPなど)は理解しやすかった
• テストライブラリが充実していて良い感じ
• アプリの起動が早く快適に開発できる
• サーバのリソース消費が少ない
Doma• SQLでゴリゴリ書きたい派には、とてもオススメ
• 依存ライブラリが無いのも、とてもいい感じ
• 便利機能がいっぱい・Java8対応・コンパイル時チェック ・SQLファイル内の変数チェック ・SQLファイルの存在チェック・ページング (Limit, Offset, 総レコード件数)
他にも沢山あります。詳しくはドキュメントを http://doma.readthedocs.org/ja/latest/
モジュール構成 (概要)
• マルチモジュール構成
• Javaのビルドルーツ: Maven
• フロントエンドのタスクツール: Grunt maven-grunt-pluginを使ってMavenから起動される jshint, karma(Jasmine), concat, cssmin, uglifyを実行する
Spring BootやDomaに 関するブログを
いくつか書いてます
• Spring BootでO/Rマッパーの比較
• Spring Bootのコネクションプーリングの比較
• Spring Bootのアプリケーションサーバの比較
• Spring BootでISUCON4予選のJava実装を作った
• Spring Bootで現在捌いているリクエスト数を取得する
• Spring + Domaで実装したアプリのユニットテスト
http://matsumana.info/blog/categories/spring/
次のような場合は Java EE(JSF)を 選択した方が 良いのかも
(個人的な意見です)
• 閉じた環境で特定のユーザのみが使用するシステム
• 保守サポートが必要な場合
• フロントフレームワークに絡んだ改修予算が確保できない場合
ここまでのまとめ
• 標準技術だから。流行っているから。ではなくきちんと検討・検証して自分達にあうものを選びましょう
次は @itoKami1123さんによる
AngularJSの話です
スライドはこちらhttp://www.slideshare.net/itokami1123/20140124-angular-js