Xem toàn bộ series bài viết hướng dẫn xây dựng ứng dụng Questions Management tại đây.
Như mình đã nói, ứng dụng Questions Management của chúng ta sẽ được xây dựng theo mô hình Microservices với nhiều layer khác nhau. Những service liên quan đến phần thao tác với database MongoDB sẽ được gom nhóm thành những Core Service. Trong bài viết này, chúng ta sẽ cùng nhau khởi tạo Core Service đầu tiên liên quan đến việc quản lý các Category mà các câu hỏi sẽ thuộc về các bạn nhé!
Đầu tiên, mình sẽ sử dụng Spring Tool Suite để tạo mới một Spring Boot project tên là core-category-service. Các bạn có thể tham khảo thêm bài viết này để biết cách tạo Spring Boot project nhé! Đối với core-category-service, có mấy điểm mà mình cần lưu ý với các bạn như sau:
Ở cửa sổ New Spring Starter Project, sau khi điền thông tin về project của chúng ta, phần Location các bạn cần trỏ đến thư mục mà chúng ta đã tạo trong bài viết trước như sau:
Ở đây, thư mục /Users/khanh/Documents/questions-management/ là thư mục của project mà mình đã tạo trong bài viết trước. Mình đã thêm một thư mục core bên trong thư mục này để chứa tất cả các project liên quan đến Core Service. Và như các bạn thấy, phần Packaging, mình chọn Jar thay vì War. 🙂
Ở phần chọn các dependencies cần sử dụng cho project core-category-service, chúng ta sẽ sử dụng những dependencies sau các bạn nhé:
- Reactive Web: xem thêm Giới thiệu về Spring WebFlux
- Reactive MongoDB: xem thêm Reactive REST APIs với Spring Data MongoDB Reactive và Spring WebFlux
- Lombok: xem thêm Giới thiệu về Project Lombok
- DevTools: xem thêm Giới thiệu về công cụ DevTools trong Spring Boot
Kết quả như sau:
Tiếp theo, mình sẽ chỉnh sửa lại project này một xí để nó sử dụng parent project mà mình đã tạo trong bài viết trước.
Đầu tiên, các bạn hãy xem nội dung của tập tin pom.xml trong project mà chúng ta vừa tạo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
<?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>com.huongdanjava.qm</groupId> <artifactId>core-category-service</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>core-category-service</name> <description>Core Category Service for Questions Management</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.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-data-mongodb-reactive</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
Ở đây, mình sẽ move phần <parent> và phần <properties> trong tập tin pom.xml này vào tập tin pom.xml của parent project để những service sau của ứng dụng Questions Management có thể sử dụng lại những phần này hoặc nếu trong tương lai, chúng ta muốn tăng version của Spring Boot thì chúng ta chỉ cần thay đổi ở parent project mà thôi.
Nội dung của tập tin pom.xml trong parent project bây giờ sẽ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<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>com.huongdanjava.qm</groupId> <artifactId>questions-management</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>Questions Management</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.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> </project> |
Lúc này, mình sẽ khai báo để sử dụng parent project cho project core-category-service như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?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> <artifactId>core-category-service</artifactId> <name>core-category-service</name> <description>Core Category Service for Questions Management</description> <parent> <groupId>com.huongdanjava.qm</groupId> <artifactId>questions-management</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
Đến đây thì chúng ta có thể khai báo project core-category-service là một module trong parent project như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<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>com.huongdanjava.qm</groupId> <artifactId>questions-management</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>Questions Management</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.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> <modules> <module>core/core-category-service</module> </modules> </project> |