Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

import java.io.IOException;

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServer {

private static Logger logger = LoggerFactory.getLogger(DiscoveryServer.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,11 @@ logging:
root: INFO
org.springframework: DEBUG
com.apress.cems: DEBUG

server:
port: 3000

eureka:
client:
register-with-eureka: false
fetch-registry: false
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.eureka.persons;

import com.eureka.persons.ex.NotFoundException;
import com.eureka.persons.person.Person;
import com.eureka.persons.services.PersonService;
import org.springframework.http.HttpStatus;
Expand All @@ -8,6 +9,7 @@
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

@RestController
Expand All @@ -26,7 +28,15 @@ public PersonsController(PersonService personService) {
@ResponseStatus(HttpStatus.OK)
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public List<Person> list() {
return new ArrayList<>();
List<Person> persons = personService.findAll();
persons.sort(new Comparator<Person>() {
@Override
public int compare(Person person1, Person person2) {
return person1.getId().compareTo(person2.getId());
}
});

return persons;
}

/**
Expand All @@ -36,6 +46,10 @@ public List<Person> list() {
@ResponseStatus(HttpStatus.CREATED)
@PostMapping
public void create(@RequestBody Person person, BindingResult result) {
if (!result.hasErrors())
personService.save(person);
else
throw new PersonsException(HttpStatus.BAD_REQUEST, "It can't add a new person!");
}

/**
Expand All @@ -48,7 +62,7 @@ public void create(@RequestBody Person person, BindingResult result) {
@ResponseStatus(HttpStatus.OK)
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public Person show(@PathVariable Long id) {
return new Person();
return personService.findById(id).orElseThrow(() -> new NotFoundException(Person.class, id));
}

/**
Expand All @@ -62,6 +76,15 @@ public Person show(@PathVariable Long id) {
@ResponseStatus(HttpStatus.NO_CONTENT)
@PutMapping("/{id}")
public void update(@RequestBody Person updatedPerson, @PathVariable Long id) {
Person resultPerson = personService.findById(id).orElseThrow(() -> new NotFoundException(Person.class, id));
resultPerson.setFirstName(updatedPerson.getFirstName());
resultPerson.setLastName(updatedPerson.getLastName());
resultPerson.setUsername(updatedPerson.getUsername());
resultPerson.setPassword(updatedPerson.getPassword());
resultPerson.setHiringDate(updatedPerson.getHiringDate());
resultPerson.setNewPassword(updatedPerson.getNewPassword());

personService.save(resultPerson);
}

/**
Expand All @@ -73,5 +96,6 @@ public void update(@RequestBody Person updatedPerson, @PathVariable Long id) {
@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
personService.delete(personService.findById(id).orElseThrow(() -> new NotFoundException(Person.class, id)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import java.io.IOException;

@EntityScan(basePackages = "com.eureka.persons")
@SpringBootApplication
@EnableEurekaClient
public class PersonsServer {

private static Logger logger = LoggerFactory.getLogger(PersonsServer.class);
Expand Down
5 changes: 5 additions & 0 deletions eureka/persons-server/src/main/resources/persons-server.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ server:

# Discovery Server Access
#TODO here you add configurations for eureka client
eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka/
fetchRegistry: true

info:
app:
Expand Down
4 changes: 4 additions & 0 deletions lab-6-api-gateway/api-gateway-project/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class ApiGatewayProjectApplication {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,28 @@ server:
#TODO use eureka to discover the URL for the service1 and service2
#TODO configure spring cloud gateway to route the request to downstream services (service1 and service2) based on the paths(/api/greeting, /product)
#TODO for greeting endpoint add a route to accept requests to /greeting but before calling service1 it must append api before the greeting path (HINT: rewrite path filter)
#and method types (GET,POST)
#and method types (GET,POST)

eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka/
register-with-eureka: true
fetch-registry: true

spring:
application:
name: gateway
main:
web-application-type: reactive
cloud:
gateway:
routes:
- id: service1
uri: http://localhost:8081
predicates:
- Path=/api/greeting/**
- id: service2
uri: http://localhost:8082
predicates:
- Path=/product/**
26 changes: 13 additions & 13 deletions lab-6-api-gateway/service1/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@
<spring-cloud.version>2021.0.1</spring-cloud.version>
</properties>
<dependencies>
<!-- <dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
Expand All @@ -37,17 +37,17 @@
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class Service1Application {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.example.service1;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/api")
public class Service1Controller {

@ResponseStatus(HttpStatus.OK)
@GetMapping("/greeting/{name}")
public String greeting(@PathVariable String name, @RequestHeader Map<String, String> headers) {
System.out.println("Headers:");
for (Map.Entry<String, String> header : headers.entrySet()) {
System.out.println(header);
}
return "Hello " + name + "!";
}
}
13 changes: 12 additions & 1 deletion lab-6-api-gateway/service1/src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1,13 @@
server:
port: 8081
port: 8081

spring:
application:
name: service1

eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka/
register-with-eureka: true
fetch-registry: true
19 changes: 16 additions & 3 deletions lab-6-api-gateway/service2/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,24 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--<dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>-->

</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class Service2Application {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.example.service2;

import com.example.service2.product.Product;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/product")
public class Service2Controller {

private List<Product> products = new ArrayList<Product>();

@ResponseStatus(HttpStatus.OK)
@PostMapping()
public void addProduct(@RequestBody Product product, @RequestHeader Map<String, String> headers) {
for(Map.Entry<String,String> header : headers.entrySet()) {
System.out.println(header);
}
products.add(product);
}

@ResponseStatus(HttpStatus.OK)
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public List<Product> getProducts(@RequestHeader Map<String, String> headers) {
for(Map.Entry<String,String> header : headers.entrySet()) {
System.out.println(header);
}
return products;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.example.service2.product;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.jetbrains.annotations.NotNull;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Product {

@NotNull
@Column(nullable = false, unique = true)
private String name;

@NotNull
@Column(nullable = false, unique = true)
private int quantity;
}
14 changes: 13 additions & 1 deletion lab-6-api-gateway/service2/src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@

server:
port: 8082
port: 8082
spring:
application:
name: service2
main:
allow-bean-definition-overriding: true

eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka/
register-with-eureka: true
fetch-registry: true