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.
・ Système d'exploitation: Mac ・ DB: MySQL (mariaDB) ・ VM: Docker ・ Langue: Spring Boot (Java 8) -Outil de construction: Maven
https://docs.docker.com/docker-for-mac/install/ Veuillez télécharger et installer à partir de cette URL.
Téléchargez ici http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Cette fois, j'utilise 1.8.0-181.
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
Je vais l'installer avec brew home.
$ brew install mysql
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.
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)
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.
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.
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é.
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.
・ 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