GoogleCloudで汎用Database構築4 - kubernetes & SpringBoot  & intelliJ その1 -

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

# 経緯
[PJでGKEを使用する方向になった](http://qiita.com/tstakano-yj/items/21f78336a8a3aae50f82)ので以前いじっていた記憶と自分用メモを参考に再度kubernetesをいじってみる。
今回はとりあえず、備忘録として、

 1. アプリケーション雛形作成
 1. DockerImage作成
 1. imageの保存
 1. deploy

までを残しておく。

## 前段
今回はweb proxyのようなものを作っていくのだが、現時点ではαのCloudFunctions等を使ってもきれいに実現できると思う。
ただ、経験上おそらく進めていくうちに、validationは？とか、可視化するためのtoolは？みたいなことになってきそうな気がしていて、ある程度自由度が高く拡張ができてほしいので試しにdockerアプリケーションをkubernetesで管理するような方法を取った。まだプロトを作っていく段階なので今後の方向転換は十分有り得る。

また、現状デプロイするアプリケーションは

- SpringBoot
- ApacheCamel

で考えている。ApacheCamelとPojoでAPIとなるRouteを作成し、可視化ツールとしてはthymeleafとSpringのコントローラーで内部的にはCamelと同じPojoを呼ぶような感じにすると、極力コードも少なくなってきれいかなと。
今回はSpringBootアプリケーションの雛形の作成を行い、それを使う。そこにApacheCamelで次回以降、肉付けしていこうと思う。

## アプリケーション雛形作成
maven archetypeで作っったり、IDEからnew projectしてpomを書き換えてもいいのだが、せっかく記事に残すので試したことのない方法でやってみようかなと思い、spring.ioで出している[SPRING INITIALIZR](http://start.spring.io/)を使用する。

まさに今回のような雛形を作成するサービス
[SPRING INITIALIZR](http://start.spring.io/)
あまり説明するようなところはない直感的なサービスなので説明は割愛する。裏ではmaven archetypeで作ってるんだろうな。。。
以下の構成で作成。
<img width="725" alt="スクリーンショット 2016-11-02 22.29.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/583b2b1d-a88f-c4e2-0bfc-d07de0f05702.png">

dependencyは以下。spring-boot-starter-jettとか入れたかったが、候補に出てこなかったのでとりあえず以下で作成。（後ほど気付いたが、下の方に細かい設定ができる箇所があった。）
<img width="582" alt="スクリーンショット 2016-11-02 22.03.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/5c669d84-a66b-4657-7947-b6551ab27490.png">

Eclipse neonにimportしてみたが、なんかエラーがでる。。。
STS（SpringToolSuit）を入れていないことにも気づき、エラーの解消等も今回は面倒なので、有償版のIntelliJを使用した。

なんか、同じことができる。やってみよう。
<img width="981" alt="スクリーンショット 2016-11-02 23.02.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/2be288f0-882f-9df4-9e7d-fad349c1383f.png">

<img width="604" alt="スクリーンショット 2016-11-02 23.07.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/f8887d07-a025-e033-6408-2c2cb8a7ec7b.png">
画像はjarだけど、この時点でPackagingはwarにしておいたほうがいいですね。

<img width="865" alt="スクリーンショット 2016-11-02 23.09.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/0aa25960-391d-8c3c-8b99-7cafe1161ef2.png">

以下の構成で作成する。

- java 1.8系
- SpringBoot 1.3.6.RELEASE
- 成果物はwar
- intelliJ

やはりいくつかエラー出るが、pomは修正して以下の通り。

```
<?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.co.yahoo.zeolite.agent</groupId>
	<artifactId>storeagent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<name>storeagent</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.3.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<version>1.3.6.RELEASE</version>
				<configuration>
					<mainClass>jp.co.yahoo.zeolite.agent.StoreagentApplication</mainClass>
					<layout>WAR</layout>
					<executable>true</executable>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

```

- Fully executable jarsにしたいのでexecutable trueにする。
- intelliJでMaven経由で立ち上げるときはspring-boot:run ゴールを実行する。
<img width="683" alt="スクリーンショット 2016-11-02 23.50.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/438fbfda-32d2-2e22-21fa-57bf6946e967.png">

普通に立ち上がった。mvn packageでwarを作成して今回は作成完了。

### webコンテナをembedded tomcatからembedded jettyへ切り替え
デフォルトだとembedded tomcatが立ち上がるので、jettyに切り替えてみる。

pomに下記を追加

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>

<img width="999" alt="スクリーンショット 2016-11-02 23.57.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/f5533e07-86b3-3fc4-a6b3-25b20f6db58c.png">

切り替わった。

# 次回

かなり赤裸々に社内のバックエンドを公開しているので少し心配になってきた。
上司もチーム内も公認なのでこのまますすめてみよう。
次回は上記のアプリケーションをDockerImageにしてみる。