[JAVA] Google Cloud Platform with Spring Boot 2.0.0

Overview

This is a summary article that you learned from deploying a web application developed using Spring Boot to Google Cloud Platform (GCP) and accessing it from a browser. The first half of the page is about building the environment such as Compute Engine and Cloud SQL required to execute the web application, and the second half is the development content of the web application.

environment

Local PC

GCP

reference

Environment

The environment was built in the following order.

  1. Install Cloud SDK on your local PC
  2. Create a project on GCP
  3. Create a service account for your VM instance
  4. Create a bucket in Cloud Storage
  5. Create a DB instance in Cloud SQL
  6. Create a VM instance on Compute Engine
  7. Add firewall rules

A simple contrast with AWS

I had experience with AWS, but since GCP is a beginner, I made a comparison table of major services.

service GCP AWS Use in this article
Computing Compute Engine EC2 Ubuntu, 1 instance
Database Cloud SQL RDS MySQL, 1 instance
storage Cloud Storage S3 Create 1 bucket
Block storage Persistent disk EBS No additional use
network Cloud Virtual Network VPC Add one firewall rule
Load balancer Cloud Load Balancing ELB None
CDN Cloud CDN CloudFront None
Access control Cloud IAM IAM Add one service account
CLI Cloud SDK CLI Almost never used

Install Cloud SDK on your local PC

Cloud SDK> Documentation> Install Cloud SDK

Of the methods described in the official documentation, I used the "versioned archive" method. In this article, I used the browser-based GCP Console to work, so I don't use the Cloud SDK very much.

** Install **

Download the Windows version archive file and extract it to a suitable location. Since python 2.7.x is required to run the Cloud SDK, install it separately or use the python bundle version.

Run the installation script in the extracted directory. Normally, the installation script adds the bin directory to the environment variable path, but it seems that it may fail, so set it manually in that case.

> install.bat

Cloud SDK initialization

Cloud SDK> Documents> Initialize Cloud SDK

Initialize the SDK. When you execute the following command, the browser will be launched and you will be asked to authenticate with your Google account. (It seems that you can flag the --console-only flag to start the console-based approval flow)

> gcloud init

Confirmation of authenticated account information

You can check the authenticated account information with the following command. The Cloud SDK allows you to use multiple accounts, but only one is active at any given time.

> gcloud auth list
        Credentialed Accounts
ACTIVE  ACCOUNT
*       ********.********.********@gmail.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

Checking components

Cloud SDK> Documentation> SDK Component Management

After installing the Cloud SDK, you can use command line tools called some components. The main ones are the gcloud tool that operates GCP and the gsutil tool that operates Cloud Storage.

You can check the installed / uninstalled components with the following command.

> gcloud components list
Your current Cloud SDK version is: 194.0.0
The latest available version is: 194.0.0

+-------------------------------------------------------------------------------------------------------------+
|                                                  Components                                                 |
+---------------+------------------------------------------------------+--------------------------+-----------+
|     Status    |                         Name                         |            ID            |    Size   |
+---------------+------------------------------------------------------+--------------------------+-----------+
| Not Installed | App Engine Go Extensions                             | app-engine-go            | 153.2 MiB |
| Not Installed | Cloud Bigtable Command Line Tool                     | cbt                      |   4.2 MiB |
| Not Installed | Cloud Bigtable Emulator                              | bigtable                 |   3.7 MiB |
| Not Installed | Cloud Datalab Command Line Tool                      | datalab                  |   < 1 MiB |
| Not Installed | Cloud Datastore Emulator                             | cloud-datastore-emulator |  17.9 MiB |
| Not Installed | Cloud Datastore Emulator (Legacy)                    | gcd-emulator             |  38.1 MiB |
| Not Installed | Cloud Pub/Sub Emulator                               | pubsub-emulator          |  33.4 MiB |
| Not Installed | Emulator Reverse Proxy                               | emulator-reverse-proxy   |  14.5 MiB |
| Not Installed | Google Container Registry's Docker credential helper | docker-credential-gcr    |   2.4 MiB |
| Not Installed | gcloud Alpha Commands                                | alpha                    |   < 1 MiB |
| Not Installed | gcloud Beta Commands                                 | beta                     |   < 1 MiB |
| Not Installed | gcloud app Java Extensions                           | app-engine-java          | 118.9 MiB |
| Not Installed | gcloud app PHP Extensions                            | app-engine-php           |  19.1 MiB |
| Not Installed | gcloud app Python Extensions                         | app-engine-python        |   6.2 MiB |
| Not Installed | gcloud app Python Extensions (Extra Libraries)       | app-engine-python-extras |  27.8 MiB |
| Not Installed | kubectl                                              | kubectl                  |  12.3 MiB |
| Installed     | BigQuery Command Line Tool                           | bq                       |   < 1 MiB |
| Installed     | Cloud SDK Core Libraries                             | core                     |   7.4 MiB |
| Installed     | Cloud Storage Command Line Tool                      | gsutil                   |   3.4 MiB |
+---------------+------------------------------------------------------+--------------------------+-----------+
To install or remove components at your current SDK version [194.0.0], run:
  $ gcloud components install COMPONENT_ID
  $ gcloud components remove COMPONENT_ID

To update your SDK installation to the latest version [194.0.0], run:
  $ gcloud components update

If a new version of the SDK has been released, you can update it with the following command. Note that if the current directory is on the installation directory, the update will fail.

> gcloud components update

Creating a project

Create all the VM instances (Compute Engine), database (Cloud SQL), and storage (Cloud Storage) required to run the web application in the project.

Open the GCP Console and create a new project.

p0.png

Make a note of the project ID as it will be issued when the project is created. You can find the project ID in the project information on the Console dashboard.

p1.png

Next, I need to enable billing for the project, but I used it because a free trial slot was available.

Set the published project ID so that it can also be operated with the gcloud tool.

> gcloud config set project <project id>
Update property [core/project].

Creating a service account

Compute Engine> Documents> Service Accounts

Create a service account to run the VM instance. Select IAM & Permissions-> Service Accounts-> Create Service Account from the left menu of the GCP Console.

The account shown in the list is the default service account that is automatically created when you start using Compute Engine (it is created when you first open Compute Engine in the Console menu after creating a project, so it may not be displayed depending on the timing. It may be). You can use this account, but since this account has a wide range of permissions, create a dedicated account with the minimum required permissions.

Click Create Service Account to get started.

sa0.png

Click Roles to assign the following roles:

sa1b.png

By the way, a role is a collection of one or more authorities. For example, the role of "Storage Object Viewer" above has four privileges as shown in the figure.

pr0.png

Once created, it will appear in the list.

sa2.png

If you want to add a role to your service account, open IAM & Administration-> IAM in the GCP Console. It's a little confusing, but click the pencil icon (any) in your service account.

By the way, the first member shown on this page is the default member that Compute Engine automatically creates.

Compute Engine default service account For historical reasons, all projects have a default Compute Engine service account that can be identified using this email. [PROJECT_NUMBER][email protected]

The second member is a special account owned by Google. This account is never used by users and must not be changed or deleted.

Google API service account Apart from the default service account, every project enabled by Compute Engine has a Google API service account that can be identified using this email. [PROJECT_NUMBER]@cloudservices.gserviceaccount.com

The third member is my google account, which has full access to all resources as the role is owned. The fourth member is the member for executing the VM instance added this time.

sa3b.png

Click Add Another Role. You can also modify or delete existing roles.

sa4b.png

Create a bucket in Cloud Storage

Create a bucket to put the locally built jar files. Select Storage-> Browser-> Create New Bucket from the left menu of the GCP Console.

Click the Create Bucket button to get started.

s0.png

I chose Regional as the default storage class. I thought it would be okay to use "Nearline" or "Coldline" because I only put the jar file temporarily, but I stopped it because it seems that if I delete it early (delete it before the minimum retention period), I will be charged.

s1.png

** Storage class characteristics **

This is a characteristic as of March 2018.

Once the bucket is created, it will appear in the list.

s2.png

Upload an appropriate file to check the operation.

It is also possible to edit the authority for each bucket as shown in the figure. Since you have assigned "Storage Object Viewer" and "Storage Object Creator" to the service account for the VM instance you created earlier, that service account is displayed in the permissions of this bucket.

s3.png

Create a DB instance in Cloud SQL

Create a DB instance (MySQL 5.7) of the database used by the web application. Select SQL from the left menu in the GCP Console.

Click the Create Instance button to get started.

db0.png

Select MySQL as the database engine.

db1.png

Select the second generation.

db2.png

Enter your instance ID and password. Then click the configuration option.

db3.png

Some configuration is possible by adding the flag of the setting option.

db31.png

It seems that the flag can only be set by the selection formula and the items prepared in advance (at least from the GCP Console).

db31b.png

The machine type and storage settings are as shown in the figure below. The machine type selected is the lowest performing type for development.

db32.png

Once the instance is created, it will appear in the list. Make a note of the "instance connection name" displayed on the screen as you will use it later.

db4.png

Enable Google Cloud SQL API

You need to enable "Google Cloud SQL API" to connect to MySQL from your VM instance. This figure is already with the API enabled and wasn't visible at first. "Google Cloud SQL" is displayed above, but I cannot connect even if this is enabled. Click Enable APIs and Services to enable the API.

a0b.png

If you enter "Google Cloud SQL" in the search field and search, "Google Cloud SQL API" will be displayed.

a1.png

Click Enable to enable it.

a3.png

Create a VM instance on Compute Engine

Create a VM instance to run your web application. Select Compute Engine-> VM Instances from the left menu in the GCP Console.

Click the Create button to get started.

vm0.png

Enter the specifications of the VM instance you want to create.

vm1b.png

Enter startup script with additional settings

vm2.png

** Contents of startup script **

In the startup script, you can describe the initialization process you want to perform immediately after starting the instance. In this example, openjdk, mysql-client and google-fluentd are installed. I've commented it out, but you can also get the metadata from the metadata server and set it in an environment variable.

#! /bin/bash

set -e
set -v

# Talk to the metadata server to get the project id
#export PROJECTID=$(curl -s "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google")
#export BUCKET=$(curl -s "http://metadata.google.internal/computeMetadata/v1/project/attributes/MY_BUCKET" -H "Metadata-Flavor: Google")

#echo "Project ID: ${PROJECTID}  Bucket: ${BUCKET}"

# Install dependencies from apt
sudo apt-get update
sudo apt-get --only-upgrade install -yq google-cloud-sdk
sudo apt-get install -yq openjdk-8-jdk

# Make Java8 the default
sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

# MySQL
sudo apt-get install -yq mysql-client

# Install logging monitor. The monitor will automatically pickup logs sent to syslog.
curl -sSO "https://dl.google.com/cloudagents/install-logging-agent.sh"
sudo bash install-logging-agent.sh

echo "Startup Complete"

Enter "web-app" for the networking network tag. This tag will be used later in the addition of firewall rules. Finally, click the "Create" button.

vm6.png

Once the VM instance is created, it will appear in the list. You can access this VM instance by accessing the external IP. However, it is an ephemeral (temporary) IP address. You can also reserve and assign a static IP address separately.

vm3.png

Connect with SSH

Select Show gcloud commands from the connection's SSH pull-down.

vm4.png

The gcloud command line required to connect is displayed.

vm5b.png

When you execute the command line shown in the figure from the Windows prompt, the terminal software will automatically start up and connect to the VM instance.

> gcloud compute --project "project-********" ssh --zone "us-east1-b" "web-app-instance-1"

The Cloud SDK is already installed on the VM instance.

$ gcloud components list
Your current Cloud SDK version is: 194.0.0
The latest available version is: 194.0.0

┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                                  Components                                                 │
├───────────────┬──────────────────────────────────────────────────────┬──────────────────────────┬───────────┤
│     Status    │                         Name                         │            ID            │    Size   │
├───────────────┼──────────────────────────────────────────────────────┼──────────────────────────┼───────────┤
│ Not Installed │ App Engine Go Extensions                             │ app-engine-go            │ 151.9 MiB │
│ Not Installed │ Cloud Bigtable Command Line Tool                     │ cbt                      │   4.5 MiB │
│ Not Installed │ Cloud Bigtable Emulator                              │ bigtable                 │   3.7 MiB │
│ Not Installed │ Cloud Datalab Command Line Tool                      │ datalab                  │   < 1 MiB │
│ Not Installed │ Cloud Datastore Emulator                             │ cloud-datastore-emulator │  17.9 MiB │
│ Not Installed │ Cloud Datastore Emulator (Legacy)                    │ gcd-emulator             │  38.1 MiB │
│ Not Installed │ Cloud Pub/Sub Emulator                               │ pubsub-emulator          │  33.4 MiB │
│ Not Installed │ Emulator Reverse Proxy                               │ emulator-reverse-proxy   │  14.5 MiB │
│ Not Installed │ Google Container Local Builder                       │ container-builder-local  │   3.8 MiB │
│ Not Installed │ Google Container Registry\'s Docker credential helper│ docker-credential-gcr    │   3.3 MiB │
│ Not Installed │ gcloud app Java Extensions                           │ app-engine-java          │ 118.9 MiB │
│ Not Installed │ gcloud app PHP Extensions                            │ app-engine-php           │           │
│ Not Installed │ gcloud app Python Extensions                         │ app-engine-python        │   6.2 MiB │
│ Not Installed │ gcloud app Python Extensions (Extra Libraries)       │ app-engine-python-extras │  27.8 MiB │
│ Not Installed │ kubectl                                              │ kubectl                  │  12.3 MiB │
│ Installed     │ BigQuery Command Line Tool                           │ bq                       │   < 1 MiB │
│ Installed     │ Cloud SDK Core Libraries                             │ core                     │   7.4 MiB │
│ Installed     │ Cloud Storage Command Line Tool                      │ gsutil                   │   3.4 MiB │
│ Installed     │ gcloud Alpha Commands                                │ alpha                    │   < 1 MiB │
│ Installed     │ gcloud Beta Commands                                 │ beta                     │   < 1 MiB │
└───────────────┴──────────────────────────────────────────────────────┴──────────────────────────┴───────────┘
To install or remove components at your current SDK version [194.0.0], run:
  $ gcloud components install COMPONENT_ID
  $ gcloud components remove COMPONENT_ID

To update your SDK installation to the latest version [194.0.0], run:
  $ gcloud components update

Check Java version

$ java -version
openjdk version "1.8.0_162"
OpenJDK Runtime Environment (build 1.8.0_162-8u162-b12-1~deb9u1-b12)
OpenJDK 64-Bit Server VM (build 25.162-b12, mixed mode)

Check the version of MySQL Client

$ mysql --version
mysql  Ver 15.1 Distrib 10.1.26-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Check Logging

Check if the "log write" assigned by IAM and google-fluentd installed by startup-script are working effectively.

$ ps -aux | grep google-fluentd

Write a confirmation log. Open "Logging"-> "Logs" in the Console and check if the following message is in the log of this VM instance.

$ logger "test log message"

Access MySQL from a VM instance

Cloud SQL> Documents> MySQL> Connect MySQL Client from Compute Engine

There are several ways to connect from a Compute Engine VM instance to a Cloud SQL DB instance, but this article used cloud_sql_proxy.

Install cloud_sql_proxy.

$ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
$ chmod +x cloud_sql_proxy

Start the proxy on the TCP socket. The character string specified for instances is "instance connection name".

$ ./cloud_sql_proxy -instances=project-********:us-east1:mysql-********-********=tcp:3306 &
[1] 1415
2018/03/28 05:03:00 Listening on 127.0.0.1:3306 for project-********:us-east1:mysql-********-*********
2018/03/28 05:03:00 Ready for new connections

Check if you can connect with the MySQL client.

$ mysql -h 127.0.0.1 -u root -p
Enter password:
2018/03/28 05:03:20 New connection for "project-********:us-east1:mysql-********-*********"
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 178
Server version: 5.7.14-google-log (Google)

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>
Demo database

Create a database to be used in the web application.

CREATE DATABASE IF NOT EXISTS demo_db
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'demo_user'@'%'
  IDENTIFIED BY 'demo_pass'
  PASSWORD EXPIRE NEVER;

GRANT ALL ON demo_db.* TO 'demo_user'@'%';
DROP TABLE IF EXISTS memo;

CREATE TABLE IF NOT EXISTS memo (
  id BIGINT AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  description TEXT NOT NULL,
  done BOOLEAN NOT NULL DEFAULT FALSE,
  updated TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
  PRIMARY KEY (id)
)
ENGINE = INNODB,
CHARACTER SET = utf8mb4,
COLLATE utf8mb4_general_ci;
INSERT INTO memo (id, title, description, done, updated) VALUES
  (1, 'memo shopping', 'memo1 description', false, '2018-01-04 12:01:00'),
  (2, 'memo job', 'memo2 description', false, '2018-01-04 13:02:10'),
  (3, 'memo private', 'memo3 description', false, '2018-01-04 14:03:21'),
  (4, 'memo job', 'memo4 description', false, '2018-01-04 15:04:32'),
  (5, 'memo private', 'memo5 description', false, '2018-01-04 16:05:43'),
  (6, 'memo travel', 'memo6 description', false, '2018-01-04 17:06:54'),
  (7, 'memo travel', 'memo7 description', false, '2018-01-04 18:07:05'),
  (8, 'memo shopping', 'memo8 description', false, '2018-01-04 19:08:16'),
  (9, 'memo private', 'memo9 description', false, '2018-01-04 20:09:27'),
  (10,'memo hospital', 'memoA description', false, '2018-01-04 21:10:38')
;

Make sure you can log in with demo_user.

$ mysql -h 127.0.0.1 -D demo_db -u demo_user -p
Connect from a local PC (Windows)

** Connect using gcloud **

You can also connect to your DB instance with the gcloud tool instead of the MySQL Client. The information used at this time is the ID of the DB instance, not the instance connection name.

> gcloud sql connect <db instance id> -u root
Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password: ********

** Connect using cloud_sql_proxy **

Cloud SQL> Documentation> MySQL> Quick Start When Using Proxy for Local Tests

A Windows version of cloud_sql_proxy is provided. The connection method is the same as connecting from a VM instance.

> cloud_sql_proxy_x64.exe -instances=project-********:us-east1:mysql-********=tcp:3306

Access storage from a VM instance

Use the gsutil tool to see if the bucket objects are visible.

$ gsutil ls gs://<my_bucket_name>
gs://<my_bucket_name>/test.txt

Check if you can download the file from the bucket.

$ gsutil cp gs://<my_bucket_name>/test.txt .
Copying gs://<my_bucket_name>/test.txt...
/ [1 files][    6.0 B/    6.0 B]
Operation completed over 1 objects/6.0 B.

Check if you can upload the file to the bucket.

$ echo "test" > test2.xt
$ gsutil test2.txt gs://<my_bucket_name>
Copying file://test2.txt [Content-Type=text/plain]...
/ [1 files][    6.0 B/    6.0 B]
Operation completed over 1 objects/6.0 B.

Add firewall rules

Since the web application listens on port 9000, add a rule to pass 9000. Select VPC Network-> Firewall Rules from the left menu of the GCP Console.

Click Create Firewall Rule to get started.

f0.png

For the target tag, enter the network tag that was set when the VM instance was created. Specifying a tag determines what this rule applies to.

f1.png

Web application running on GCP

The procedure for executing a web application developed using Spring Boot on a VM instance is as follows.

Build on local PC and generate jar file

> mvn clean package

Upload the generated jar file to the bucket

> gsutil cp .\target\demo-gcp-spring2-0.0.1-SNAPSHOT.jar gs://<my_bucket_name>

Download the jar file from the bucket to the VM instance

$ gsutil cp gs://<my_bucket_name>/demo-gcp-spring2-0.0.1-SNAPSHOT.jar .

Run the jar file on the VM instance

$ java -jar demo-gcp-spring2-0.0.1-SNAPSHOT.jar

Access with a browser

http://<External IP of the VM instance>:9000/<Application API>

** Send jar file **

Compute Engine> Documents> Transfer Files to Instances

The jar file is sent to the VM instance via a bucket, but you can also use the gcloud compute scp command.

> gcloud compute scp <local_file_name> <instance_id>:/tmp

Application specifications

A REST API that returns one or more data in the memo table with json.

API to get 1

/app/memo/{id}

** Response example **

{
    "id": 1,
    "title": "memo shopping",
    "description": "memo1 description",
    "done": false,
    "updated": "2018-01-04T12:01:00"
}

API to get multiple records

/app/memo/list?size=3

** Response example **

[
    {
        "id": 1,
        "title": "memo shopping",
        "description": "memo1 description",
        "done": false,
        "updated": "2018-01-04T12:01:00"
    },
    {
        "id": 2,
        "title": "memo job",
        "description": "memo2 description",
        "done": false,
        "updated": "2018-01-04T13:02:10"
    },
    {
        "id": 3,
        "title": "memo private",
        "description": "memo3 description",
        "done": false,
        "updated": "2018-01-04T14:03:21"
    }
]

Supplement

Cloud Storage JSON API

Cloud Storage> Documentation> Google Cloud Storage JSON API Overview

How to get bucket information from a VM instance using curl. API authentication uses OAuth 2.0.

Obtain the access token required for authentication. This token is output from the service account of the VM instance.

$ gcloud auth list
                             Credentialed Accounts
ACTIVE  ACCOUNT
*       compute-engine-web-application@project-********.iam.gserviceaccount.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
$ gcloud auth print-access-token
<access_token>

Specify the obtained access token in the Authorization header. This / b / <bucket> / o JSON API returns a list of objects in the bucket specified by \ <bucket >.

$ curl 'https://www.googleapis.com/storage/v1/b/<bucket>/o' \
  -H 'Authorization: Bearer <access_token>' \
  -H 'Accept: application/json' \
  --compressed

Recommended Posts

Google Cloud Platform with Spring Boot 2.0.0
Download with Spring Boot
Create Spring Cloud Config Server with security with Spring Boot 2.0
Generate barcode with Spring Boot
Hello World with Spring Boot
Implement GraphQL with Spring Boot
Get started with Spring boot
Hello World with Spring Boot!
Run LIFF with Spring Boot
SNS login with Spring Boot
File upload with Spring Boot
Spring Boot starting with copy
Spring Boot starting with Docker
Hello World with Spring Boot
Set cookies with Spring Boot
Use Spring JDBC with Spring Boot
Add module with Spring Boot
Getting Started with Spring Boot
Create microservices with Spring Boot
Send email with spring boot
Use Basic Authentication with Spring Boot
gRPC on Spring Boot with grpc-spring-boot-starter
Create an app with Spring Boot 2
Hot deploy with Spring Boot development
Database linkage with doma2 (Spring boot)
Spring Boot programming with VS Code
Until "Hello World" with Spring Boot
Inquiry application creation with Spring Boot
Get validation results with Spring Boot
Use Java 11 with Google Cloud Functions
Oauth2 authentication with Spring Cloud Gateway
[Google Cloud] Getting Started with Docker
Create an app with Spring Boot
Check date correlation with Spring Boot
I tried GraphQL with Spring Boot
[Java] LINE integration with Spring Boot
Beginning with Spring Boot 0. Use Spring CLI
I tried Flyway with Spring Boot
Message cooperation started with Spring Boot
Spring Boot gradle build with Docker
Processing at application startup with Spring Boot
Send regular notifications with LineNotify + Spring Boot
Perform transaction confirmation test with Spring Boot
HTTPS with Spring Boot and Let's Encrypt
Start web application development with Spring Boot
Launch Nginx + Spring Boot application with docker-compose
I tried Lazy Initialization with Spring Boot 2.2.0
Implement CRUD with Spring Boot + Thymeleaf + MySQL
Asynchronous processing with Spring Boot using @Async
Implement paging function with Spring Boot + Thymeleaf
(IntelliJ + gradle) Hello World with Spring Boot
Use cache with EhCashe 2.x with Spring Boot
Form class validation test with Spring Boot
Configure microservices with Spring Cloud (4): API Gateway
Run WEB application with Spring Boot + Thymeleaf
Achieve BASIC authentication with Spring Boot + Spring Security
Challenge Spring Boot
Spring Boot Form
Spring Boot Memorandum
gae + spring boot
Create a website with Spring Boot + Gradle (jdk1.8.x)