Skip to content

Commit

Permalink
Ready implementation of microservices
Browse files Browse the repository at this point in the history
  • Loading branch information
piomin committed Jul 15, 2020
1 parent 8ad6256 commit 1677d38
Show file tree
Hide file tree
Showing 17 changed files with 203 additions and 25 deletions.
Expand Up @@ -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<String>) {
runApplication<DepartmentApp>(*args)
Expand Down
@@ -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<Department> = repository.findById(id)

@GetMapping("/{id}/with-employees")
fun findByIdWithEmployees(@PathVariable id: Int): Department? {
val optDepartment: Optional<Department> = repository.findById(id)
return if (optDepartment.isPresent) {
val department: Department = optDepartment.get()
val employees = restTemplate.getForObject("http://employee-service:8080/employees/department/{departmentId}",
Array<Employee>::class.java, department.id)
department.employees.addAll(employees!!)
department
} else null
}

@GetMapping()
fun findAll(): Iterable<Department> = repository.findAll()

@GetMapping("/organization/{organizationId}")
fun findByOrganizationId(@PathVariable organizationId: Int) =
repository.findByOrganizationId(organizationId)
}
Expand Up @@ -4,4 +4,7 @@ import javax.persistence.Entity
import javax.persistence.Id

@Entity
data class Department(@Id var id: Int, val name: String)
data class Department(@Id var id: Int = 0,
val name: String = "",
val organizationId: Int = 0,
@Transient val employees: MutableSet<Employee> = mutableSetOf())
@@ -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 = "")
@@ -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<Department, Int> {

fun findByOrganizationId(organizationId: Int)

}
Expand Up @@ -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:
Expand Down
5 changes: 5 additions & 0 deletions simple-microservices/employee-service/pom.xml
Expand Up @@ -40,6 +40,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>

<build>
Expand Down
@@ -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<Employee> = repository.findById(id)

@GetMapping
fun findAll(): Iterable<Employee> = repository.findAll()

@GetMapping("/organization/{organizationId}")
fun findByOrganizationId(@PathVariable organizationId: Int): Set<Employee> =
repository.findByOrganizationId(organizationId)

@GetMapping("/department/{departmentId}")
fun findByDepartmentId(@PathVariable departmentId: Int): Set<Employee> =
repository.findByDepartmentId(departmentId)
}
@@ -1,3 +1,12 @@
package pl.piomin.samples.kubernetes.employee.domain

class Employee
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)
@@ -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<Employee, Int> {

fun findByOrganizationId(organizationId: Int): Set<Employee>
fun findByDepartmentId(departmentId: Int): Set<Employee>
}
Expand Up @@ -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:
Expand Down
@@ -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<Organization> = repository.findById(id)

@GetMapping("/{id}/with-employees")
fun findByIdWithEmployees(@PathVariable id: Int): Organization? {
val optOrganization: Optional<Organization> = repository.findById(id)
return if (optOrganization.isPresent) {
val organization: Organization = optOrganization.get()
val employees = restTemplate.getForObject("http://employee-service:8080/employees/organization/{organizationId}",
Array<Employee>::class.java, organization.id)
organization.employees.addAll(employees!!)
organization
} else null
}

@GetMapping("/{id}/with-departments")
fun findByIdWithDepartments(@PathVariable id: Int): Organization? {
val optOrganization: Optional<Organization> = repository.findById(id)
return if (optOrganization.isPresent) {
val organization: Organization = optOrganization.get()
val departments = restTemplate.getForObject("http://department-service:8080/departments/organization/{organizationId}",
Array<Department>::class.java, organization.id)
organization.departments.addAll(departments!!)
organization
} else null
}

@GetMapping()
fun findAll(): Iterable<Organization> = repository.findAll()

}
@@ -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<Employee> = mutableSetOf())
@@ -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 = "")
Expand Up @@ -4,4 +4,7 @@ import javax.persistence.Entity
import javax.persistence.Id

@Entity
data class Organization(@Id var id: Int, val name: String)
data class Organization(@Id var id: Int,
val name: String,
@Transient val employees: MutableSet<Employee> = mutableSetOf(),
@Transient val departments: MutableSet<Department> = mutableSetOf())
@@ -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<Organization, Int> {
}
Expand Up @@ -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:
Expand Down

0 comments on commit 1677d38

Please sign in to comment.