Skip to content

Commit 51e15af

Browse files
committed
Docker compose configure & elastic, redis, mongo, postgres support added
1 parent 91764cc commit 51e15af

File tree

36 files changed

+794
-30
lines changed

36 files changed

+794
-30
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
package io.javatab.microservices.api.core.course;
22

3-
public record Course(int courseId, String courseName, String author, String content, int reviewId) {
3+
public record Course(int courseId, String courseName, String author, String content, int voteId) {
44
}

docker/docker-compose.yml

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ services:
88
mem_limit: 512m
99
environment:
1010
- SPRING_PROFILES_ACTIVE=docker
11+
depends_on:
12+
mongodb:
13+
condition: service_healthy
1114

1215
search:
1316
build: ../microservices/search-service
@@ -16,6 +19,9 @@ services:
1619
mem_limit: 512m
1720
environment:
1821
- SPRING_PROFILES_ACTIVE=docker
22+
depends_on:
23+
elasticsearch:
24+
condition: service_healthy
1925

2026
student:
2127
build: ../microservices/student-service
@@ -24,6 +30,9 @@ services:
2430
mem_limit: 512m
2531
environment:
2632
- SPRING_PROFILES_ACTIVE=docker
33+
depends_on:
34+
postgres:
35+
condition: service_healthy
2736

2837
vote:
2938
build: ../microservices/vote-service
@@ -32,6 +41,9 @@ services:
3241
mem_limit: 512m
3342
environment:
3443
- SPRING_PROFILES_ACTIVE=docker
44+
depends_on:
45+
redis:
46+
condition: service_healthy
3547

3648
course-composite:
3749
build: ../microservices/course-composite-service
@@ -41,4 +53,63 @@ services:
4153
ports:
4254
- "8080:8080" # Only this service will be exposed to outside containers so no port binding for above images
4355
environment:
44-
- SPRING_PROFILES_ACTIVE=docker
56+
- SPRING_PROFILES_ACTIVE=docker
57+
58+
mongodb:
59+
image: mongo:4.4.2
60+
mem_limit: 512m
61+
ports:
62+
- "27017:27017"
63+
command: mongod
64+
healthcheck:
65+
test: "mongo --eval 'db.stats().ok'"
66+
interval: 5s
67+
timeout: 2s
68+
retries: 60
69+
70+
postgres:
71+
image: postgres:alpine3.15
72+
mem_limit: 512m
73+
ports:
74+
- "5432:5432"
75+
environment:
76+
- POSTGRES_DATABASE=test
77+
- POSTGRES_USER=user
78+
- POSTGRES_PASSWORD=pwd
79+
healthcheck:
80+
test: [ "CMD-SHELL", "pg_isready -U user" ]
81+
interval: 10s
82+
timeout: 5s
83+
retries: 5
84+
85+
redis:
86+
image: redis:6.2.6-alpine
87+
restart: always
88+
ports:
89+
- "6379:6379"
90+
healthcheck:
91+
test: [ "CMD-SHELL", "redis-cli ping | grep PONG" ]
92+
interval: 5s
93+
timeout: 2s
94+
retries: 60
95+
96+
elasticsearch:
97+
image: elasticsearch:7.12.1
98+
ports:
99+
- "9300:9300"
100+
- "9200:9200"
101+
environment:
102+
- node.name=elasticsearch
103+
- discovery.type=single-node
104+
- cluster.name=docker-cluster
105+
- bootstrap.memory_lock=true
106+
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
107+
ulimits:
108+
memlock:
109+
soft: -1
110+
hard: -1
111+
healthcheck:
112+
test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
113+
interval: 5s
114+
timeout: 2s
115+
retries: 60

microservices/course-service/pom.xml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<description>Demo project for Spring Boot</description>
1616
<properties>
1717
<java.version>17</java.version>
18+
<testcontainers.version>1.16.2</testcontainers.version>
1819
</properties>
1920
<dependencies>
2021
<dependency>
@@ -25,6 +26,16 @@
2526
<groupId>org.springframework.boot</groupId>
2627
<artifactId>spring-boot-starter-webflux</artifactId>
2728
</dependency>
29+
<dependency>
30+
<groupId>org.springframework.boot</groupId>
31+
<artifactId>spring-boot-starter-data-mongodb</artifactId>
32+
</dependency>
33+
34+
<dependency>
35+
<groupId>org.mapstruct</groupId>
36+
<artifactId>mapstruct</artifactId>
37+
<version>1.3.1.Final</version>
38+
</dependency>
2839
<!--Internal Dep-->
2940
<dependency>
3041
<groupId>io.javatab.microservices.api</groupId>
@@ -46,8 +57,30 @@
4657
<artifactId>reactor-test</artifactId>
4758
<scope>test</scope>
4859
</dependency>
60+
<dependency>
61+
<groupId>org.testcontainers</groupId>
62+
<artifactId>mongodb</artifactId>
63+
<scope>test</scope>
64+
</dependency>
65+
<dependency>
66+
<groupId>org.testcontainers</groupId>
67+
<artifactId>junit-jupiter</artifactId>
68+
<scope>test</scope>
69+
</dependency>
4970
</dependencies>
5071

72+
<dependencyManagement>
73+
<dependencies>
74+
<dependency>
75+
<groupId>org.testcontainers</groupId>
76+
<artifactId>testcontainers-bom</artifactId>
77+
<version>${testcontainers.version}</version>
78+
<type>pom</type>
79+
<scope>import</scope>
80+
</dependency>
81+
</dependencies>
82+
</dependencyManagement>
83+
5184
<build>
5285
<plugins>
5386
<plugin>

microservices/course-service/src/main/java/io/javatab/microservices/core/course/CourseServiceApplication.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.context.ConfigurableApplicationContext;
56
import org.springframework.context.annotation.ComponentScan;
67

78
@SpringBootApplication
89
@ComponentScan("io.javatab") // To enable Spring Boot's autoconfiguration feature to detect Spring Beans in the api and util projects, we also need to add a @ComponentScan annotation to the main application class, which includes the packages of the api and util projects:
910
public class CourseServiceApplication {
1011

1112
public static void main(String[] args) {
12-
SpringApplication.run(CourseServiceApplication.class, args);
13+
ConfigurableApplicationContext ctx = SpringApplication.run(CourseServiceApplication.class, args);
14+
String mongoUri = ctx.getEnvironment().getProperty("spring.data.mongodb.host");
15+
System.out.println("Connected to Mongo: " + mongoUri);
1316
}
1417

1518
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package io.javatab.microservices.core.course.persistence;
2+
3+
import org.apache.commons.lang3.builder.EqualsBuilder;
4+
import org.apache.commons.lang3.builder.HashCodeBuilder;
5+
import org.springframework.data.mongodb.core.index.Indexed;
6+
import org.springframework.data.mongodb.core.mapping.Document;
7+
import org.springframework.data.annotation.Id;
8+
import org.springframework.data.annotation.Version;
9+
10+
@Document(collection = "courses")
11+
public class CourseEntity {
12+
13+
@Id
14+
private String id;
15+
16+
@Version
17+
private Integer version;
18+
19+
@Indexed(unique = true)
20+
private int courseId;
21+
22+
private String courseName;
23+
24+
private String author;
25+
26+
private int voteId;
27+
28+
private String content;
29+
30+
public CourseEntity() {
31+
}
32+
33+
public CourseEntity(int courseId, String courseName, String author, int voteId, String content) {
34+
this.courseId = courseId;
35+
this.courseName = courseName;
36+
this.author = author;
37+
this.voteId = voteId;
38+
this.content = content;
39+
}
40+
41+
public String getId() {
42+
return id;
43+
}
44+
45+
public void setId(String id) {
46+
this.id = id;
47+
}
48+
49+
public Integer getVersion() {
50+
return version;
51+
}
52+
53+
public void setVersion(Integer version) {
54+
this.version = version;
55+
}
56+
57+
public int getCourseId() {
58+
return courseId;
59+
}
60+
61+
public void setCourseId(int courseId) {
62+
this.courseId = courseId;
63+
}
64+
65+
public String getCourseName() {
66+
return courseName;
67+
}
68+
69+
public void setCourseName(String courseName) {
70+
this.courseName = courseName;
71+
}
72+
73+
public String getAuthor() {
74+
return author;
75+
}
76+
77+
public void setAuthor(String author) {
78+
this.author = author;
79+
}
80+
81+
public int getVoteId() {
82+
return voteId;
83+
}
84+
85+
public void setVoteId(int voteId) {
86+
this.voteId = voteId;
87+
}
88+
89+
public String getContent() {
90+
return content;
91+
}
92+
93+
public void setContent(String content) {
94+
this.content = content;
95+
}
96+
97+
@Override
98+
public boolean equals(Object o) {
99+
if (this == o) return true;
100+
101+
if (o == null || getClass() != o.getClass()) return false;
102+
103+
CourseEntity entity = (CourseEntity) o;
104+
105+
return new EqualsBuilder().append(courseId, entity.courseId).append(voteId, entity.voteId).append(id, entity.id).append(version, entity.version).append(courseName, entity.courseName).append(author, entity.author).append(content, entity.content).isEquals();
106+
}
107+
108+
@Override
109+
public int hashCode() {
110+
return new HashCodeBuilder(17, 37).append(id).append(version).append(courseId).append(courseName).append(author).append(voteId).append(content).toHashCode();
111+
}
112+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package io.javatab.microservices.core.course.persistence;
2+
3+
import org.springframework.data.repository.CrudRepository;
4+
5+
public interface CourseRepository extends CrudRepository<CourseEntity, String> {
6+
}

microservices/course-service/src/main/resources/application.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,10 @@ logging:
55
level:
66
root: INFO
77
io.javatab.microservices: DEBUG
8+
9+
10+
11+
---
12+
spring.config.activate.on-profile: docker
13+
server.port: 8080
14+
spring.data.mongodb.host: mongodb
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package io.javatab.microservices.core.course;
22

3-
import org.junit.jupiter.api.Test;
43
import org.springframework.boot.test.context.SpringBootTest;
54

6-
@SpringBootTest
7-
class CourseServiceImplApplicationTests {
5+
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
86

9-
@Test
10-
void contextLoads() {
11-
}
7+
@SpringBootTest(webEnvironment = RANDOM_PORT)
8+
class CourseServiceImplApplicationTests extends MongoDbTestBase {
129

1310
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.javatab.microservices.core.course;
2+
3+
import org.springframework.test.context.DynamicPropertyRegistry;
4+
import org.springframework.test.context.DynamicPropertySource;
5+
import org.testcontainers.containers.MongoDBContainer;
6+
7+
public abstract class MongoDbTestBase {
8+
private static MongoDBContainer database = new MongoDBContainer("mongo:4.4.2");
9+
10+
static {
11+
database.start();
12+
}
13+
14+
@DynamicPropertySource
15+
static void setProperties(DynamicPropertyRegistry registry) {
16+
registry.add("spring.data.mongodb.host", database::getContainerIpAddress);
17+
registry.add("spring.data.mongodb.port", () -> database.getMappedPort(27017));
18+
registry.add("spring.data.mongodb.database", () -> "test");
19+
}
20+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.javatab.microservices.core.course;
2+
3+
4+
import io.javatab.microservices.core.course.persistence.CourseEntity;
5+
import io.javatab.microservices.core.course.persistence.CourseRepository;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
10+
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
11+
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
14+
@DataMongoTest(
15+
excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class
16+
)
17+
public class PersistenceTests extends MongoDbTestBase {
18+
19+
@Autowired
20+
private CourseRepository repository;
21+
private CourseEntity savedEntity;
22+
23+
@BeforeEach
24+
void setUp() {
25+
repository.deleteAll();
26+
CourseEntity entity = new CourseEntity(1, "Course Name", "Author", 4, "Content");
27+
savedEntity = repository.save(entity);
28+
assertEquals(entity, savedEntity);
29+
}
30+
31+
@Test
32+
void create() {
33+
CourseEntity newEntity = new CourseEntity(1, "Course Name", "Author", 4, "Content");
34+
repository.save(newEntity);
35+
36+
CourseEntity foundEntity = repository.findById(newEntity.getId()).get();
37+
assertEquals(newEntity.getId(), foundEntity.getId());
38+
assertEquals(2, repository.count());
39+
}
40+
}

0 commit comments

Comments
 (0)