Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Spring BootでHello Worldのその先へ

2,629 views

Published on

Spring Fest 2018で発表した資料です。Spring BootからAmazon MQとMongoDBにアクセスする方法を紹介しています。

This document is the material of my presentation at Spring Fest 2018. I will show you how to access ActiveMQ and MongoDB with Spring Boot.

Published in: Software
  • Be the first to comment

Spring BootでHello Worldのその先へ

  1. 1. Spring BootでHello Worldのその先へ ソニーネットワークコミュニケーションズ株式会社 藤野 真聡 Copyright 2018 Sony Network Communications Inc. ウェブDBプレスのSpring Boot特集で伝えたかったこと&伝えきれなかったこと Spring Fest 2018 2018/10/31
  2. 2. 2018/11/12 自己紹介 News Suite(ソニーのニュースアプリ)のサーバーエンジニアとし てWebアプリケーションの開発と運用に日夜取り組んでいます。 得意な言語は、シェルスクリプトとJavaです。 藤野 真聡
  3. 3. 2018/11/13 [速習]Spring Bootのご紹介 2018/8/24発売のWEB+DB PRESS Vol.106に寄稿 ① Spring Bootの概要をざっくりと把握できる説明 ② Hello Worldの「次の1歩」を想定したサンプル 特徴 Webアプリケーションを作りながら体得してきた知見を、 誌面の許す限り盛り込む。 Spring Bootの素晴らしさを伝えたい
  4. 4. 2018/11/15 WEB+DB PRESSの特集で伝えたかったこと Hello Worldの「次の1歩」を想定したサンプルを2つ解説 「Spring BootでWebアプリケーションを作ることはこんなに簡単なんだよ」 Todo APP Qiita APP
  5. 5. 2018/11/16 WEB+DB PRESSの特集で伝えきれなかったこと ● Hello Worldレベル ● プロトタイプ開発レベル ウェブサービスを継続的に改善 (=グロースハック)していく ための、変化に強いWebアプリ ケーションの作り方 伝えきれなかったこと
  6. 6. 2018/11/17 Hello Worldのその先へ Getting Started Guides [速習] Spring Boot 本日のセッション ミドルウェアやデータ ベースと連携したWeb アプリケーション
  7. 7. 2018/11/18 本日のセッションで実現したいこと • ミドルウェアやデータベースと連携したWebアプリケーション開発 開発PC Vagrant browser httpd qiita-app H2Database 開発者 qiita ①クロール ②DB保存 ③APIリクエスト reverse_proxy 開発PC Spring Tool Suite Vagrant browser qiita-api qiita-cwawlingqiita-scheduling ActiveMQMongoDB 開発者 qiita①メッセージ送信 ②メッセージ受信 ③クロール ④DB保存 ⑤APIリクエスト V1.0.0 V2.0.0 マ イ ク ロ サー ビ ス 化
  8. 8. 2018/11/19 セッションの進め方 [準備編] • Webアプリケーションのバージョン番号を表示 • Webアプリケーションをモジュール分割 [開発編] • ActiveMQ: メッセージの送受信 • MongoDB: DBアクセス
  9. 9. 2018/11/110 セッションの進め方 [準備編] • Webアプリケーションのバージョン番号を表示 • Webアプリケーションをモジュール分割 [開発編] • ActiveMQ: メッセージの送受信 • MongoDB: DBアクセス
  10. 10. 2018/11/111 Webアプリケーションでバージョン番号を表示でやりたい事 Webアプリケーションにバージョン情報を表示するAPIを用意 http://localhost:8091/rest/version
  11. 11. 2018/11/112 バージョン番号を表示するAPIを作成する方法 configweb.rest domain QiitaAppVersionConfigVersionController QiitaAppVersion @RestController @ConfigurationProperties @Configuration «create» qiita.app.info.app-name=@project.name@ qiita.app.info.app-version=@project.version@ qiita.app.info.time-stamp=@maven.build.timestamp@ application.properties
  12. 12. 2018/11/113 QiitaAppVersionクラスの実装 @Getter @Setter @ConfigurationProperties(prefix = "qiita.app.info") public class QiitaAppVersion { @JsonProperty("app_name") private String appName; @JsonProperty("app_version") private String appVersion; @JsonProperty("build_time_stamp") private String timeStamp; }
  13. 13. 2018/11/114 QiitaAppVersionConfigクラスの実装 @Configuration public class QiitaAppVersionConfig { @Bean public QiitaAppVersion qiitaAppVersion() { return new QiitaAppVersion(); } }
  14. 14. 2018/11/115 VersionControllerクラスの実装 @RestController @RequestMapping("rest") @RequiredArgsConstructor public class VersionController { private final QiitaAppVersion qiitaAppVersion; @GetMapping(value = "version") public ResponseEntity<QiitaAppVersion> getVersion() { return ResponseEntity.ok().body(qiitaAppVersion); } }
  15. 15. 2018/11/116 Demo
  16. 16. 2018/11/117 セッションの進め方 [準備編] • Webアプリケーションのバージョン番号を表示 • Webアプリケーションをモジュール分割 [開発編] • ActiveMQ: メッセージの送受信 • MongoDB: DBアクセス
  17. 17. 2018/11/118 Webアプリケーションをモジュール分割 V1.0.0 V2.0.0 :5分割したモジュールから成果物を3つ作成マイクロサービス化
  18. 18. 2018/11/119 Mavenのpom.xmlによるモジュール分割する方法 $ tree -L 2 -P 'pom.xml' . ├── pom.xml ├── qiita-activemq │ ├── pom.xml │ └── src ├── qiita-api │ ├── pom.xml │ └── src ├── qiita-crawling │ ├── pom.xml │ └── src ├── qiita-mongo │ ├── pom.xml │ └── src └── qiita-scheduling ├── pom.xml └── src ディレクトリ構成 5分割したモジュール 子POM 親POM
  19. 19. 2018/11/120 Mavenのpom.xmlによるモジュール分割する方法 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>jp.gihyo.wbpress.qiita</groupId> <artifactId>qiita</artifactId> <version>2.0.0</version> <packaging>pom</packaging> <name>qiita</name> <description>Spring Boot: qiita-app</description> <parent>(…省略…)</parent> <properties>(…省略…)</properties> <dependencies>(…省略…)</dependencies> <modules> <module>qiita-api</module> <module>qiita-scheduling</module> <module>qiita-crawling</module> <module>qiita-mongo</module> <module>qiita-activemq</module> </modules> </project> pom.xml 5分割したモジュール
  20. 20. 2018/11/121 Mavenのpom.xmlによるモジュール分割する方法 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>jp.gihyo.wbpress.qiita</groupId> <artifactId>qiita</artifactId> <version>2.0.0</version> </parent> <groupId>jp.gihyo.wbpress.qiita.api</groupId> <artifactId>qiita-api</artifactId> <packaging>jar</packaging> <name>qiita-api</name> <description>Qiita API</description> <dependencies>(…省略…)</dependencies> <build>(…省略…)</build> </project> qiita-api/pom.xml 親POMを指定 子POMの設定
  21. 21. 2018/11/122 (参考)依存関係のグラフ
  22. 22. 2018/11/123 セッションの進め方 [準備編] • Webアプリケーションのバージョン番号を表示 • Webアプリケーションをモジュール分割 [開発編] • ActiveMQ: メッセージの送受信 • MongoDB: DBアクセス
  23. 23. 2018/11/124 ActiveMQで実現したいこと • ActiveMQの概要 • JMS(Java Message Service)を実装したメッセージングミドルウェア • 処理を非同期に行うことで、システム間を疎結合にすることが可能 Queue qiita-scheduling Producer qiita-crawling Consumer ①メッセージ送信 ②メッセージ受信
  24. 24. 2018/11/125 ActiveMQ: メッセージの送受信する方法 qiita-scheduling qiita-crawling qiita-activemq config domain QiitaScheduledService JmsOperations jmsOperations send(CrawlRequest crawlRequest) QiitaCrawlService receive(CrawlRequest crawlRequest) ActiveMQConverterConfig ActiveMQConfig CrawlRequest URI uri @Configuration @Configuration @Service @Service @JmsListener «use» «use»
  25. 25. 2018/11/126 QiitaScheduledServiceクラスの実装 @Service @RequiredArgsConstructor public class QiitaScheduledService { private final JmsOperations jmsOperations; public void send(CrawlRequest crawlRequest) { // ActiveMQに送信 jmsOperations.convertAndSend(ActiveMQConfig.REQUEST_QUEUE, crawlRequest); } } ActiveMQにメッセージ送信
  26. 26. 2018/11/127 QiitaCrawlServiceクラスの実装 @Slf4j @Service @RequiredArgsConstructor public class QiitaCrawlService { (..省略..) @JmsListener(// destination = ActiveMQConfig.REQUEST_QUEUE, containerFactory = "listenerContainerFactory") public void receive(CrawlRequest crawlRequest) throws QiitaAccessErrorException { // 1. ActiveMQから受信したリクエストを確認 log.info("QiitaCrawlService: crawlRequest=[{}]", crawlRequest); // 2. ActiveMQから受信したリクエストからURIを抽出 URI uri = crawlRequest.getUri(); (..省略..) } } ActiveMQからメッセージ受信
  27. 27. 2018/11/128 CrawlRequestクラスの実装 @NoArgsConstructor @AllArgsConstructor @Getter @Setter @ToString public class CrawlRequest { @JsonProperty("uri") URI uri; } メッセージ用データ
  28. 28. 2018/11/129 ActiveMQConverterConfigクラスの実装 @Configuration public class ActiveMQConverterConfig { @Bean public MessageConverter jacksonJmsMessageConverter() { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); converter.setTargetType(MessageType.TEXT); converter.setTypeIdPropertyName("_type"); return converter; } } ActiveMQのメッセージ に変換する設定
  29. 29. 2018/11/130 ActiveMQConfigクラスの実装 @Configuration @EnableJms public class ActiveMQConfig { public static final String REQUEST_QUEUE = "crawl-request-queue"; @Bean public JmsOperations jmsOperations(// ConnectionFactory connectionFactory, // MessageConverter jacksonJmsMessageConverter) { JmsTemplate template = new JmsTemplate(); template.setConnectionFactory(connectionFactory); template.setMessageConverter(jacksonJmsMessageConverter); return template; } @Bean public JmsListenerContainerFactory<?> listenerContainerFactory(// ConnectionFactory connectionFactory, // MessageConverter jacksonJmsMessageConverter) {// DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setMessageConverter(jacksonJmsMessageConverter); return factory; } } ActiveMQと通信する設定 メッセージ送信設定 メッセージ受信設定
  30. 30. 2018/11/131 Demo http://localhost:38161
  31. 31. 2018/11/132 セッションの進め方 [準備編] • Webアプリケーションのバージョン番号を表示 • Webアプリケーションをモジュール分割 [開発編] • ActiveMQ: メッセージの送受信 • MongoDB: DBアクセス
  32. 32. 2018/11/133 MongoDBで実現したいこと • MongoDBの概要 • スキーマレスのドキュメント指向データベース • JSONライクなドキュメントデータ(=BSON)として保存することが可能 qiita-api qiita-crawling ④データ取得 ③データ保存 BSON {} BSON {} コレクション JSON {} ドキュメント
  33. 33. 2018/11/134 MongoDB: DBアクセスを実現する方法 qiita-api qiita-crawling qiita-mongo repository domain QiitaApiService QiitaCrawlService QiitaRepository QiitaItem «use» «use»
  34. 34. 2018/11/135 QiitaCrawlServiceクラスの実装 @Slf4j @Service @RequiredArgsConstructor public class QiitaCrawlService { private final RestComponent restComponent; private final QiitaRepository qiitaRepository; (..省略..) public void receive(CrawlRequest crawlRequest) throws QiitaAccessErrorException { (..省略..) // 3. Qiitaの記事をクロール List<QiitaItem> qiitaItems = restComponent.crawlItems(uri); log.info("size of qiitaItems=[{}]", qiitaItems.size()); // 4. MongoDBに記事を保存 qiitaRepository.saveAll(qiitaItems); } } MongoDBにデータ保存
  35. 35. 2018/11/136 QiitaCrawlServiceクラスの実装 @Service @RequiredArgsConstructor public class QiitaApiService { private final QiitaRepository qiitaRepository; public List<QiitaItem> findItems(){ return qiitaRepository.findAll(); } } MongoDBからデータ取得
  36. 36. 2018/11/137 QiitaItemクラスの実装 @Document(collection = "item") @Getter @Setter @ToString @NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class QiitaItem { @Id String id; String title; String url; @JsonProperty("created_at") String createTime; @JsonProperty("updated_at") String updateTime; } MongoDBに保存するドキュメント
  37. 37. 2018/11/138 QiitaRepositoryインターフェースの実装 @Repository public interface QiitaRepository // extends MongoRepository<QiitaItem, String> { } MongoDBアクセス用リポジトリ
  38. 38. 2018/11/139 Demo
  39. 39. 2018/11/140 本日のセッションのまとめ • Hello Worldのその先へ! • 「変化に強いWebアプリケーション」の作り方を紹介 • ミドルウェアやデータベースと連携したWebアプリケーション 開発に挑戦 開発PC Spring Tool Suite Vagrant browser qiita-api qiita-cwawlingqiita-scheduling ActiveMQMongoDB 開発者 qiita①メッセージ送信 ②メッセージ受信 ③クロール ④DB保存 ⑤APIリクエスト みなさんの設計&開発に 役立つ情報を提供できれ ば幸いです。 ご清聴、ありがとうござ いました。
  40. 40. SONYはソニー株式会社の登録商標または商標です。 各ソニー製品の商品名・サービス名はソニー株式会社またはグループ各社の登録商標または商標です。その他の製品および会社名は、各社の商号、登録商標または商標です。
  41. 41. 2018/11/142 TIPS
  42. 42. 2018/11/143 TIPS01: Mavenの依存関係をグラフ化する方法 mvn ¥ org.fusesource.mvnplugins:maven-graph-plugin:reactor ¥ -Dhide-external=true 依存関係をグラフ化するMavenコマンド
  43. 43. 2018/11/144 TIPS02: Spring Tool SuiteでBeanを確認する方法 Open Beans Graph
  44. 44. SONYはソニー株式会社の登録商標または商標です。 各ソニー製品の商品名・サービス名はソニー株式会社またはグループ各社の登録商標または商標です。その他の製品および会社名は、各社の商号、登録商標または商標です。

×