From 1677d38749e95c40fb5e499723c9644461fe79d1 Mon Sep 17 00:00:00 2001 From: piomin Date: Wed, 15 Jul 2020 14:31:00 +0200 Subject: [PATCH] Ready implementation of microservices --- .../kubernetes/department/DepartmentApp.kt | 13 +++++- .../controller/DepartmentController.kt | 46 +++++++++++++++++-- .../department/domain/Department.kt | 5 +- .../kubernetes/department/domain/Employee.kt | 6 +++ .../repository/DepartmentRepository.kt | 10 ++++ .../src/main/resources/application.yml | 9 ++-- simple-microservices/employee-service/pom.xml | 5 ++ .../employee/controller/EmployeeController.kt | 25 ++++++++-- .../kubernetes/employee/domain/Employee.kt | 11 ++++- .../employee/repository/EmployeeRepository.kt | 10 ++++ .../src/main/resources/application.yml | 9 ++-- .../controller/OrganizationController.kt | 46 +++++++++++++++++-- .../organization/domain/Department.kt | 6 +++ .../organization/domain/Employee.kt | 6 +++ .../organization/domain/Organization.kt | 5 +- .../repository/OrganizationRepository.kt | 7 +++ .../src/main/resources/application.yml | 9 ++-- 17 files changed, 203 insertions(+), 25 deletions(-) create mode 100644 simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/domain/Employee.kt create mode 100644 simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/repository/DepartmentRepository.kt create mode 100644 simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/repository/EmployeeRepository.kt create mode 100644 simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Department.kt create mode 100644 simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Employee.kt create mode 100644 simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/repository/OrganizationRepository.kt diff --git a/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/DepartmentApp.kt b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/DepartmentApp.kt index f7bbac0..5e296b0 100644 --- a/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/DepartmentApp.kt +++ b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/DepartmentApp.kt @@ -2,9 +2,20 @@ package pl.piomin.samples.kubernetes.department import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication +import org.springframework.boot.web.client.RestTemplateBuilder +import org.springframework.context.annotation.Bean +import org.springframework.web.client.RestTemplate +import java.time.Duration @SpringBootApplication -class DepartmentApp +class DepartmentApp { + + @Bean + fun restTemplate(): RestTemplate = + RestTemplateBuilder() + .setReadTimeout(Duration.ofMillis(1000L)) + .build() +} fun main(args: Array) { runApplication(*args) diff --git a/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/controller/DepartmentController.kt b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/controller/DepartmentController.kt index b8ea5e5..cf48afc 100644 --- a/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/controller/DepartmentController.kt +++ b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/controller/DepartmentController.kt @@ -1,9 +1,49 @@ package pl.piomin.samples.kubernetes.department.controller -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController +import org.springframework.web.bind.annotation.* +import org.springframework.web.client.RestTemplate +import pl.piomin.samples.kubernetes.department.domain.Department +import pl.piomin.samples.kubernetes.department.domain.Employee +import pl.piomin.samples.kubernetes.department.repository.DepartmentRepository +import java.util.* @RestController @RequestMapping("/departments") -class DepartmentController { +class DepartmentController(val repository: DepartmentRepository, + val restTemplate: RestTemplate) { + + @PostMapping + fun add(@RequestBody department: Department): Department = repository.save(department) + + @PostMapping("/with-employees") + fun addWithEmployees(@RequestBody department: Department): Department { + val departmentSaved: Department = repository.save(department) + department.employees.forEach { + restTemplate.postForObject("http://employee-service:8080/employees", + it, Employee::class.java) + } + return departmentSaved + } + + @GetMapping("/{id}") + fun findById(@PathVariable id: Int): Optional = repository.findById(id) + + @GetMapping("/{id}/with-employees") + fun findByIdWithEmployees(@PathVariable id: Int): Department? { + val optDepartment: Optional = repository.findById(id) + return if (optDepartment.isPresent) { + val department: Department = optDepartment.get() + val employees = restTemplate.getForObject("http://employee-service:8080/employees/department/{departmentId}", + Array::class.java, department.id) + department.employees.addAll(employees!!) + department + } else null + } + + @GetMapping() + fun findAll(): Iterable = repository.findAll() + + @GetMapping("/organization/{organizationId}") + fun findByOrganizationId(@PathVariable organizationId: Int) = + repository.findByOrganizationId(organizationId) } \ No newline at end of file diff --git a/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/domain/Department.kt b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/domain/Department.kt index 328a904..0235659 100644 --- a/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/domain/Department.kt +++ b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/domain/Department.kt @@ -4,4 +4,7 @@ import javax.persistence.Entity import javax.persistence.Id @Entity -data class Department(@Id var id: Int, val name: String) \ No newline at end of file +data class Department(@Id var id: Int = 0, + val name: String = "", + val organizationId: Int = 0, + @Transient val employees: MutableSet = mutableSetOf()) \ No newline at end of file diff --git a/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/domain/Employee.kt b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/domain/Employee.kt new file mode 100644 index 0000000..578bdc2 --- /dev/null +++ b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/domain/Employee.kt @@ -0,0 +1,6 @@ +package pl.piomin.samples.kubernetes.department.domain + +data class Employee(var id: Int = 0, + val firstName: String = "", + val lastName: String = "", + val position: String = "") \ No newline at end of file diff --git a/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/repository/DepartmentRepository.kt b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/repository/DepartmentRepository.kt new file mode 100644 index 0000000..c775d2c --- /dev/null +++ b/simple-microservices/department-service/src/main/kotlin/pl/piomin/samples/kubernetes/department/repository/DepartmentRepository.kt @@ -0,0 +1,10 @@ +package pl.piomin.samples.kubernetes.department.repository + +import org.springframework.data.repository.CrudRepository +import pl.piomin.samples.kubernetes.department.domain.Department + +interface DepartmentRepository: CrudRepository { + + fun findByOrganizationId(organizationId: Int) + +} \ No newline at end of file diff --git a/simple-microservices/department-service/src/main/resources/application.yml b/simple-microservices/department-service/src/main/resources/application.yml index 0540361..184e9c0 100644 --- a/simple-microservices/department-service/src/main/resources/application.yml +++ b/simple-microservices/department-service/src/main/resources/application.yml @@ -2,14 +2,15 @@ spring: application: name: department-service datasource: - url: jdbc:postgresql://postgresql:5432/${POSTGRES_DATABASE} - username: ${POSTGRES_USER} - password: ${POSTGRES_PASSWORD} + url: jdbc:h2:mem:testdb + driverClassName: org.h2.Driver + username: sa + password: password hikari: connection-timeout: 2000 initialization-fail-timeout: 0 jpa: - database-platform: org.hibernate.dialect.PostgreSQLDialect + database-platform: org.hibernate.dialect.H2Dialect management: endpoints.web.exposure.include: '*' endpoint: diff --git a/simple-microservices/employee-service/pom.xml b/simple-microservices/employee-service/pom.xml index 374b6d9..3c7c291 100644 --- a/simple-microservices/employee-service/pom.xml +++ b/simple-microservices/employee-service/pom.xml @@ -40,6 +40,11 @@ org.springframework.boot spring-boot-starter-data-jpa + + com.h2database + h2 + runtime + diff --git a/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/controller/EmployeeController.kt b/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/controller/EmployeeController.kt index d344fb2..4ed7508 100644 --- a/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/controller/EmployeeController.kt +++ b/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/controller/EmployeeController.kt @@ -1,9 +1,28 @@ package pl.piomin.samples.kubernetes.employee.controller -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController +import org.springframework.web.bind.annotation.* +import pl.piomin.samples.kubernetes.employee.domain.Employee +import pl.piomin.samples.kubernetes.employee.repository.EmployeeRepository +import java.util.* @RestController @RequestMapping("/employees") -class EmployeeController { +class EmployeeController(val repository: EmployeeRepository) { + + @PostMapping + fun add(@RequestBody employee: Employee): Employee = repository.save(employee) + + @GetMapping("/{id}") + fun findById(@PathVariable id: Int): Optional = repository.findById(id) + + @GetMapping + fun findAll(): Iterable = repository.findAll() + + @GetMapping("/organization/{organizationId}") + fun findByOrganizationId(@PathVariable organizationId: Int): Set = + repository.findByOrganizationId(organizationId) + + @GetMapping("/department/{departmentId}") + fun findByDepartmentId(@PathVariable departmentId: Int): Set = + repository.findByDepartmentId(departmentId) } \ No newline at end of file diff --git a/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/domain/Employee.kt b/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/domain/Employee.kt index e2fa46f..58f2de4 100644 --- a/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/domain/Employee.kt +++ b/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/domain/Employee.kt @@ -1,3 +1,12 @@ package pl.piomin.samples.kubernetes.employee.domain -class Employee \ No newline at end of file +import javax.persistence.Entity +import javax.persistence.Id + +@Entity +data class Employee(@Id var id: Int = 0, + val firstName: String = "", + val lastName: String = "", + val position: String = "", + val organizationId: Int = 0, + val departmentId: Int = 0) \ No newline at end of file diff --git a/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/repository/EmployeeRepository.kt b/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/repository/EmployeeRepository.kt new file mode 100644 index 0000000..30754ab --- /dev/null +++ b/simple-microservices/employee-service/src/main/kotlin/pl/piomin/samples/kubernetes/employee/repository/EmployeeRepository.kt @@ -0,0 +1,10 @@ +package pl.piomin.samples.kubernetes.employee.repository + +import org.springframework.data.repository.CrudRepository +import pl.piomin.samples.kubernetes.employee.domain.Employee + +interface EmployeeRepository: CrudRepository { + + fun findByOrganizationId(organizationId: Int): Set + fun findByDepartmentId(departmentId: Int): Set +} \ No newline at end of file diff --git a/simple-microservices/employee-service/src/main/resources/application.yml b/simple-microservices/employee-service/src/main/resources/application.yml index 5e0d949..707f874 100644 --- a/simple-microservices/employee-service/src/main/resources/application.yml +++ b/simple-microservices/employee-service/src/main/resources/application.yml @@ -2,14 +2,15 @@ spring: application: name: employee-service datasource: - url: jdbc:postgresql://postgresql:5432/${POSTGRES_DATABASE} - username: ${POSTGRES_USER} - password: ${POSTGRES_PASSWORD} + url: jdbc:h2:mem:testdb + driverClassName: org.h2.Driver + username: sa + password: password hikari: connection-timeout: 2000 initialization-fail-timeout: 0 jpa: - database-platform: org.hibernate.dialect.PostgreSQLDialect + database-platform: org.hibernate.dialect.H2Dialect management: endpoints.web.exposure.include: '*' endpoint: diff --git a/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/controller/OrganizationController.kt b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/controller/OrganizationController.kt index d4da495..5018abd 100644 --- a/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/controller/OrganizationController.kt +++ b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/controller/OrganizationController.kt @@ -1,9 +1,49 @@ package pl.piomin.samples.kubernetes.organization.controller -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController +import org.springframework.web.bind.annotation.* +import org.springframework.web.client.RestTemplate +import pl.piomin.samples.kubernetes.organization.domain.Department +import pl.piomin.samples.kubernetes.organization.domain.Employee +import pl.piomin.samples.kubernetes.organization.domain.Organization +import pl.piomin.samples.kubernetes.organization.repository.OrganizationRepository +import java.util.* @RestController @RequestMapping("/organizations") -class OrganizationController { +class OrganizationController(val repository: OrganizationRepository, + val restTemplate: RestTemplate) { + + @PostMapping + fun add(@RequestBody organization: Organization): Organization = repository.save(organization) + + @GetMapping("/{id}") + fun findById(@PathVariable id: Int): Optional = repository.findById(id) + + @GetMapping("/{id}/with-employees") + fun findByIdWithEmployees(@PathVariable id: Int): Organization? { + val optOrganization: Optional = repository.findById(id) + return if (optOrganization.isPresent) { + val organization: Organization = optOrganization.get() + val employees = restTemplate.getForObject("http://employee-service:8080/employees/organization/{organizationId}", + Array::class.java, organization.id) + organization.employees.addAll(employees!!) + organization + } else null + } + + @GetMapping("/{id}/with-departments") + fun findByIdWithDepartments(@PathVariable id: Int): Organization? { + val optOrganization: Optional = repository.findById(id) + return if (optOrganization.isPresent) { + val organization: Organization = optOrganization.get() + val departments = restTemplate.getForObject("http://department-service:8080/departments/organization/{organizationId}", + Array::class.java, organization.id) + organization.departments.addAll(departments!!) + organization + } else null + } + + @GetMapping() + fun findAll(): Iterable = repository.findAll() + } \ No newline at end of file diff --git a/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Department.kt b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Department.kt new file mode 100644 index 0000000..7fa7c85 --- /dev/null +++ b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Department.kt @@ -0,0 +1,6 @@ +package pl.piomin.samples.kubernetes.organization.domain + +data class Department(var id: Int = 0, + val name: String = "", + val organizationId: Int = 0, + val employees: MutableSet = mutableSetOf()) \ No newline at end of file diff --git a/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Employee.kt b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Employee.kt new file mode 100644 index 0000000..a2c2f62 --- /dev/null +++ b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Employee.kt @@ -0,0 +1,6 @@ +package pl.piomin.samples.kubernetes.organization.domain + +data class Employee(var id: Int = 0, + val firstName: String = "", + val lastName: String = "", + val position: String = "") \ No newline at end of file diff --git a/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Organization.kt b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Organization.kt index fcef521..0afcf5f 100644 --- a/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Organization.kt +++ b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/domain/Organization.kt @@ -4,4 +4,7 @@ import javax.persistence.Entity import javax.persistence.Id @Entity -data class Organization(@Id var id: Int, val name: String) \ No newline at end of file +data class Organization(@Id var id: Int, + val name: String, + @Transient val employees: MutableSet = mutableSetOf(), + @Transient val departments: MutableSet = mutableSetOf()) \ No newline at end of file diff --git a/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/repository/OrganizationRepository.kt b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/repository/OrganizationRepository.kt new file mode 100644 index 0000000..7572e15 --- /dev/null +++ b/simple-microservices/organization-service/src/main/kotlin/pl/piomin/samples/kubernetes/organization/repository/OrganizationRepository.kt @@ -0,0 +1,7 @@ +package pl.piomin.samples.kubernetes.organization.repository + +import org.springframework.data.repository.CrudRepository +import pl.piomin.samples.kubernetes.organization.domain.Organization + +interface OrganizationRepository: CrudRepository { +} \ No newline at end of file diff --git a/simple-microservices/organization-service/src/main/resources/application.yml b/simple-microservices/organization-service/src/main/resources/application.yml index 506e5b0..638ae02 100644 --- a/simple-microservices/organization-service/src/main/resources/application.yml +++ b/simple-microservices/organization-service/src/main/resources/application.yml @@ -2,14 +2,15 @@ spring: application: name: organization-service datasource: - url: jdbc:postgresql://postgresql:5432/${POSTGRES_DATABASE} - username: ${POSTGRES_USER} - password: ${POSTGRES_PASSWORD} + url: jdbc:h2:mem:testdb + driverClassName: org.h2.Driver + username: sa + password: password hikari: connection-timeout: 2000 initialization-fail-timeout: 0 jpa: - database-platform: org.hibernate.dialect.PostgreSQLDialect + database-platform: org.hibernate.dialect.H2Dialect management: endpoints.web.exposure.include: '*' endpoint: