[JAVA] Écrivons comment créer une API avec SpringBoot + Docker à partir de 0

introduction

J'ai essayé de créer une API simple avec Spring Boot et Docker. Il n'y avait pas beaucoup d'articles qui expliquaient à partir de zéro, alors je vais en faire un moi-même et le poster. Cependant, honnêtement, j'ai peu de connaissances sur Api et Docker, alors veuillez signaler toute erreur! Aussi, pardonnez-moi car il est supposé qu'il sera construit sur Mac cette fois.

Environnement de production

・ Système d'exploitation: Mac ・ DB: MySQL (mariaDB) ・ VM: Docker ・ Langue: Spring Boot (Java 8) -Outil de construction: Maven

Installation de chaque outil

Installer Docker

https://docs.docker.com/docker-for-mac/install/ Veuillez télécharger et installer à partir de cette URL. Méthode de téléchargement Docker 1.png Dockerインストール方法2.png

Installation de Java

Téléchargez ici http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Cette fois, j'utilise 1.8.0-181.

Installez Maven

Tout ce qui concerne en particulier la version Maven est bien, mais cette fois j'utiliserai 3.5.2. Veuillez vous référer ici. Comment installer une version spécifique de Maven

Installez MySQL

Je vais l'installer avec brew home.

$ brew install mysql

Installation de STS (Spring Tool Suite)

STS (Spring Tool Suite) est un IDE de type Eclipse qui inclut spring. Cette fois, nous allons l'utiliser pour créer un projet. https://spring.io/tools/sts/all Installons à partir d'ici.

Maintenant que nous avons tout ce dont nous avons besoin, nous pouvons commencer la production.

Production

Créez une API pour CRUD une entité avec un utilisateur (nom, email).

L'API à créer est la suivante.

GET / api / users => Obtenir tous les utilisateurs (getUsers) GET / api / users / {id} => Obtenir un utilisateur avec identifiant (getUser) POST / api / users => Ajouter un utilisateur (createUser) PUT / api / users / {id} => Mise à jour de l'utilisateur (updateUser) DELETE / api / users / {id} => Supprimer l'utilisateur avec l'identifiant (deleteUser)

** Créer un projet avec STS **

file -> new -> Spring Starter Project Je vais faire un projet avec. Cette fois, je vais le faire avec le nom du projet " sampleApi ".

Créez un projet en sélectionnant jpa, web, lombok, mysql dans Spring Initializr.

Préparation

Créer une entité, un référentiel, un service.

Entity

@Data
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String email;
}

Pour faire simple, Entity est un endroit pour stocker les valeurs à enregistrer / mettre à jour dans la base de données, ou pour stocker les valeurs obtenues à partir de la base de données. La table de la base de données à échanger avec @Table est spécifiée. Nous créerons cette table, etc. plus tard.

Repository


@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

Ce référentiel est la classe qui communique directement avec BD.

Service


@Service
@Transactional
public class UserService {
    @Autowired
    UserRepository userRepository;

    public User findUser(Long id){
        return userRepository.findOne(id);
    }

    public List<User> findUsers(){
        return userRepository.findAll();
    }

    public User save(User user) {
        return userRepository.save(user);
    }

    public void delete(Long id) {
        userRepository.delete(id);
    }
}

Le traitement de la logique métier est effectué dans cette classe de service. Vous recevez la valeur du contrôleur décrit ci-dessous et demandez au référentiel de la traiter.

Controller Créez un contrôleur pour échanger des utilisateurs. Décrivez le processus correspondant à la requête HTTP. Si vous remplacez User par le nom de la ressource, vous pouvez l'utiliser pour d'autres ressources. Je n'ai pas spécifié le code de réponse cette fois, mais si vous souhaitez l'implémenter strictement, il peut être préférable de le spécifier?

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    UserService userService;

    @RequestMapping(method = RequestMethod.GET)
    public List<User> getUsers() {
        return userService.findUsers();
    }

    @RequestMapping(method=RequestMethod.GET, value="{id}")
    public User getUser(@PathVariable("id") Long id) {
        return userService.findUser(id);
    }

    @RequestMapping(method=RequestMethod.POST)
    public User createUser(@Validated @RequestBody User user) {
        return userService.save(user);
    }

    @RequestMapping(method=RequestMethod.PUT, value="{id}")
    public User updateUser(@PathVariable("id") Long id, @RequestBody User user) {
        user.setId(id);
        return userService.save(user);
    }

    @RequestMapping(method=RequestMethod.DELETE, value="{id}")
    public void deleteUser(@PathVariable("id") Long id) {
        userService.delete(id);
    }

}

@ RestController est une annotation pour créer l'API Rest, et il sera possible d'échanger avec @ Controller + @ ResponseBody + JSON. spring-boot-starter-web gère ce que Jackson reçoit et ce qu'il affiche.

Docker C'est un docker. Je suis toujours ambigu, je vais donc l'écrire brièvement. Tout d'abord, les fichiers «docker-compose.yml» et «Dockerfile» sont nécessaires pour lancer le conteneur Docker, créez donc ces deux fichiers directement sous le dossier du projet.

Après l'avoir créé, j'écrirai le contenu du fichier ** Tout d'abord, " docker-compose.yml "**


version: '3'
services:
  db:
    image: mariadb:10.2
    restart: always
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: hogeuser
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: sampleapi_development
    ports:
      - "3306:3306"
    volumes:
      - ./docker/tmp/mysql:/var/lib/mysql
      - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
volumes:
  data:
    driver: local

C'est une description pour démarrer le serveur de base de données. Il crée également une base de données lorsque vous démarrez le serveur. C'est ici


MYSQL_ROOT_PASSWORD: password
MYSQL_USER: hogeuser
MYSQL_PASSWORD: password
MYSQL_DATABASE: sampleapi_development

À partir du haut, il s'agit du mot de passe de l'autorité racine, du nom d'utilisateur du serveur, du mot de passe et du nom de la base de données.

** Puis " Dockerfile "**


FROM openjdk:jdk-alpine
VOLUME /tmp
RUN mkdir /app
WORKDIR /app
ENV JAVA_OPTS=""
ENV JAR_TARGET "sampleApi-1.0.0-SNAPSHOT.jar"
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar build/libs/sampleApi-1.0.0-SNAPSHOT.jar" ]

Concernant docker-compose.yml, je pense que cela fonctionne en copiant, mais pour Dockerfile, il est nécessaire de changer un peu" sampleApi-1.0.0-SNAPSHOT.jar "de ʻENV et ʻENTRY POINT. Il s'agit d'une description qui cible le fichier jar généré lors de la construction du projet, mais le nom de fichier généré par le projet sera différent. Veuillez le réécrire en vous référant à ce qui suit.

Je pense qu'il y a "pom.xml" dans le projet, donc c'est dedans


<artifactId>sampleApi</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>

Je pense qu'il existe une telle description. Comme vous pouvez le voir, regardez le contenu de ce "ʻartifactId", " version"et"packeging`" et réécrivez-le.

Ensuite, remplissez le contenu de "ʻapplication.properties`". Le fichier ici est dans "src / main / resources". Remplissez ce qui suit:


spring.datasource.url=jdbc:mysql://localhost:3306/sampleapi_development
spring.datasource.username=hogeuser
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

C'est ce dont vous avez besoin pour connecter le projet et la base de données, et décrit le nom d'utilisateur et le nom de la base de données créés dans "docker-compose.yml" ci-dessus.

Maintenant que la création est terminée, nous allons réellement la démarrer. Tout d'abord, utilisez la commande pour vous déplacer juste en dessous du projet.

$ cd ~/sampleApi

Commençons Docker. Tapez ce qui suit:

$ docker-compose up --build

S'il n'y a pas d'erreurs, c'est réussi.

Lançons maintenant l'application. J'ai pensé, mais je n'ai pas encore créé le contenu (table) de la base de données, donc je vais le créer. Vous devez accéder au serveur de base de données lancé par Docker. Tout d'abord, tapez ce qui suit pour vérifier le nom du serveur.


$ docker-compose ps
     Name                   Command             State           Ports          
------------------------------------------------------------------------------
sampleapi_db_1   docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp 

Maintenant que vous connaissez le nom du serveur, entrons.


$ docker exec -it sampleapi_db_1 bash
root@c71a21817893:/# mysql -h localhost -P 3306 -u hogeuser -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 20
Server version: 10.2.16-MariaDB-1:10.2.16+maria~bionic mariadb.org binary distribution

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

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

MariaDB [(none)]>  

Vérifiez si la base de données a été créée.


MariaDB [(none)]> show databases;
+-----------------------+
| Database              |
+-----------------------+
| information_schema    |
| sampleapi_development |
+-----------------------+
2 rows in set (0.06 sec)

MariaDB [(none)]> 

Il n'y a pas de problème

Faisons une table.

Cliquez ici pour créer une déclaration

CREATE TABLE users ( id int NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, email varchar(255) NOT NULL, PRIMARY KEY (id) ); Cependant, je ne pense pas que cela puisse être fait tel quel, il est donc nécessaire de changer de base de données. Commençons et créons avec la commande suivante.


//Changer de base de données
MariaDB [(none)]> use sampleapi_development;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [sampleapi_development]> CREATE TABLE users (
    ->     id int NOT NULL AUTO_INCREMENT,
    ->     name varchar(255) NOT NULL,
    ->     email varchar(255) NOT NULL,
    ->     PRIMARY KEY (id)
    -> );
Query OK, 0 rows affected (0.02 sec)

MariaDB [sampleapi_development]> INSERT INTO users(id, name, email) VALUES(1, 'ishii', '[email protected]');
Query OK, 1 row affected (0.01 sec)

Comme il est plus facile de comprendre s'il y a des données, je les ai ajoutées avec une instruction INSERT.

Lancer l'application

Maintenant que le contenu a été créé, commençons l'application. Ouvrez STS et faites un clic droit sur le projet. Run as → Spring Boot App Commençons.

Vérifiez si l'API fonctionne.

$ curl localhost:8080/api/users
[{"id":1,"name":"ishii","email":"[email protected]"}]

Vous pouvez l'obtenir correctement

Je vais ajouter un utilisateur

$ curl -XPOST -H "Content-Type:application/json" http://localhost:8080/api/users -d '{
  "name":"ishii2","email":"[email protected]"
}'
{"id":2,"name":"ishii2","email":"[email protected]"}

Aucun problème!

Au fait, pour déposer docker

$ docker-compose down

Vous pouvez le laisser tomber en faisant. Il est recommandé de déposer correctement le docker après avoir joué.

finalement

Pour les bases de données, je pense qu'il est vraiment préférable d'utiliser la migration. Cependant, cette fois, j'essaye de créer des données directement parce que je n'ai pas été capable de courir autant et l'article est devenu gonflé. J'aimerais aussi pouvoir écrire ici.

Site référencé

・ Construction d'API https://ishiis.net/2016/09/08/spring-boot-rest-api/ ・ Docker https://qiita.com/ken0909/items/a3f8594ce677bbc7c4c2 ・ Accédez à la base de données dans l'application docker https://qiita.com/M_Nagata/items/120831bb4e4a3deace13


Ce qui précède est de savoir comment créer une API avec Docker + Spring que j'ai créée et vue. C'est un article moche, mais merci de l'avoir regardé jusqu'au bout. J'étudie actuellement les rails, donc j'espère pouvoir écrire un article à ce sujet dans le futur.

Recommended Posts

Écrivons comment créer une API avec SpringBoot + Docker à partir de 0
Mettre à jour MySQL de 5.7 à 8.0 avec Docker
Comment démarrer Camunda avec Docker
Comment partager des fichiers avec Docker Toolbox
[SpringBoot] Comment écrire un test de contrôleur
Comment exécuter Blazor (C #) avec Docker
Comment créer un environnement Rails 6 avec Docker
Rendre l'environnement SpringBoot1.5 + Gradle4.4 + Java8 + Docker compatible avec Java11
Comment obtenir un heapdump à partir d'un conteneur Docker
Comment réduire l'image de Spring Boot Docker
Paramètre pour quitter le conteneur Docker avec VScode
Comment utiliser l'API Java avec des expressions lambda
Comment donner votre image à quelqu'un avec Docker
Comment écrire du code de test avec la certification de base
Comment créer une API avec GraphQL et Rails
Comment sortir un fichier de ressources avec spring-boot
[Rails] Comment créer un environnement avec Docker
Comment écrire des rails
Comment installer Docker
Comment faire un pot ombré
Comment écrire docker-compose
Comment écrire Mockito
Comment écrire un fichier de migration
Comment créer l'application Docker + Springboot (pour l'apprentissage de base)
Comment écrire Scala du point de vue de Java
Comment déployer à partir d'une image Docker locale vers Heroku
Comment créer un environnement Docker avec Gradle pour IntelliJ
Comment créer une fonction de messagerie LINE avec Ruby
Indiquez comment apprendre de Docker à AKS sur AWS
[Environnement Docker] Comment gérer ActiveSupport :: MessageEncryptor :: InvalidMessage
Comment sortir le standard d'un tableau avec for Each
Comment supprimer des images non balisées en masse avec Docker
Comment obtenir JDK etc. depuis Oracle avec CLI
Implémentons une fonction pour limiter le nombre d'accès à l'API avec SpringBoot + Redis
Comment utiliser l'API Chain
Comment écrire du bon code
Java - Comment créer JTable
Comment écrire une migration du type Rails datetime au type date
Comment rédiger un commentaire java
Rendre Docker déroutant avec Pokemon et le rendre plus facile à attacher
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ Express ~
[Refactoring] Comment écrire le routage
Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions
Comment définir nginx de Docker
Faisons une API simple avec EC2 + RDS + Spring boot ①
Comment numéroter (nombre) avec html.erb
Comment mettre à jour avec activerecord-import