From 587f43a8f8a448d1fcedd6eefdc6a19c42b550a6 Mon Sep 17 00:00:00 2001 From: Radu Date: Thu, 7 Apr 2022 17:46:15 +0300 Subject: [PATCH 1/2] Tema 5 Radu Alexandru --- .../example/discovery/DiscoveryServer.java | 2 ++ .../src/main/resources/discovery-server.yml | 7 ++++ .../com/eureka/persons/PersonsController.java | 35 +++++++++++++++++-- .../com/eureka/persons/PersonsServer.java | 2 ++ .../src/main/resources/persons-server.yml | 7 ++++ 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/eureka/discovery-server/src/main/java/com/example/discovery/DiscoveryServer.java b/eureka/discovery-server/src/main/java/com/example/discovery/DiscoveryServer.java index 15d783c..8a91eb8 100644 --- a/eureka/discovery-server/src/main/java/com/example/discovery/DiscoveryServer.java +++ b/eureka/discovery-server/src/main/java/com/example/discovery/DiscoveryServer.java @@ -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); diff --git a/eureka/discovery-server/src/main/resources/discovery-server.yml b/eureka/discovery-server/src/main/resources/discovery-server.yml index b55b43b..6e244be 100644 --- a/eureka/discovery-server/src/main/resources/discovery-server.yml +++ b/eureka/discovery-server/src/main/resources/discovery-server.yml @@ -4,6 +4,13 @@ spring: # Configure this Discovery Server #TODO here you add configurations for server +server: + port: 3000 +eureka: + client: + registerWithEureka: false + fetchRegistry: false + logging: pattern: console: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" diff --git a/eureka/persons-server/src/main/java/com/eureka/persons/PersonsController.java b/eureka/persons-server/src/main/java/com/eureka/persons/PersonsController.java index ff4acb5..f9cf45d 100644 --- a/eureka/persons-server/src/main/java/com/eureka/persons/PersonsController.java +++ b/eureka/persons-server/src/main/java/com/eureka/persons/PersonsController.java @@ -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; @@ -8,6 +9,8 @@ import org.springframework.web.bind.annotation.*; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; @RestController @@ -26,7 +29,17 @@ public PersonsController(PersonService personService) { @ResponseStatus(HttpStatus.OK) @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) public List list() { - return new ArrayList<>(); + List list = personService.findAll(); + + //sort by id + list.sort(new Comparator() { + @Override + public int compare(Person o1, Person o2) { + return o1.getId().compareTo(o2.getId()); + } + }); + + return list; } /** @@ -36,6 +49,11 @@ public List list() { @ResponseStatus(HttpStatus.CREATED) @PostMapping public void create(@RequestBody Person person, BindingResult result) { + if(result.hasErrors()){ + throw new PersonsException(HttpStatus.BAD_REQUEST, "Something went wrong!"); + } else{ + personService.save(person); + } } /** @@ -48,7 +66,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)); } /** @@ -62,6 +80,17 @@ public Person show(@PathVariable Long id) { @ResponseStatus(HttpStatus.NO_CONTENT) @PutMapping("/{id}") public void update(@RequestBody Person updatedPerson, @PathVariable Long id) { + + Person person = personService.findById(id).orElseThrow(() -> new NotFoundException(Person.class, id)); + + person.setUsername(updatedPerson.getUsername()); + person.setFirstName(updatedPerson.getFirstName()); + person.setLastName(updatedPerson.getLastName()); + person.setPassword(updatedPerson.getPassword()); + person.setHiringDate(updatedPerson.getHiringDate()); + person.setNewPassword(updatedPerson.getNewPassword()); + + personService.save(person); } /** @@ -73,5 +102,7 @@ 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))); } } \ No newline at end of file diff --git a/eureka/persons-server/src/main/java/com/eureka/persons/PersonsServer.java b/eureka/persons-server/src/main/java/com/eureka/persons/PersonsServer.java index f2098ae..c23be15 100644 --- a/eureka/persons-server/src/main/java/com/eureka/persons/PersonsServer.java +++ b/eureka/persons-server/src/main/java/com/eureka/persons/PersonsServer.java @@ -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); diff --git a/eureka/persons-server/src/main/resources/persons-server.yml b/eureka/persons-server/src/main/resources/persons-server.yml index b2b466d..b57926d 100644 --- a/eureka/persons-server/src/main/resources/persons-server.yml +++ b/eureka/persons-server/src/main/resources/persons-server.yml @@ -26,6 +26,13 @@ server: # Discovery Server Access #TODO here you add configurations for eureka client +eureka: + client: + serviceUrl: + defaultZone: http://192.168.81.11:3000/eureka/ + healthcheck: + enabled: true + info: app: name: persons-server From 9b10cdb6c2b4bf0f9ba38676660e31363b2f8f0c Mon Sep 17 00:00:00 2001 From: Radu Date: Wed, 4 May 2022 14:25:01 +0300 Subject: [PATCH 2/2] Tema api gateway - Radu Alexandru --- lab-6-api-gateway/api-gateway-project/pom.xml | 4 +++ .../ApiGatewayProjectApplication.java | 2 ++ .../src/main/resources/application.yml | 28 +++++++++++++++++ lab-6-api-gateway/service1/pom.xml | 9 ++++-- .../example/service1/Service1Application.java | 2 ++ .../example/service1/Service1Controller.java | 17 ++++++++++ .../src/main/resources/application.yml | 14 ++++++++- lab-6-api-gateway/service2/pom.xml | 17 ++++++++-- .../java/com/example/service2/Product.java | 24 ++++++++++++++ .../example/service2/Service2Application.java | 2 ++ .../example/service2/Service2Controller.java | 31 +++++++++++++++++++ .../src/main/resources/application.yml | 14 ++++++++- 12 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 lab-6-api-gateway/service1/src/main/java/com/example/service1/Service1Controller.java create mode 100644 lab-6-api-gateway/service2/src/main/java/com/example/service2/Product.java create mode 100644 lab-6-api-gateway/service2/src/main/java/com/example/service2/Service2Controller.java diff --git a/lab-6-api-gateway/api-gateway-project/pom.xml b/lab-6-api-gateway/api-gateway-project/pom.xml index 871ce8d..32dd4c0 100644 --- a/lab-6-api-gateway/api-gateway-project/pom.xml +++ b/lab-6-api-gateway/api-gateway-project/pom.xml @@ -43,6 +43,10 @@ reactor-test test + + org.springframework.cloud + spring-cloud-netflix-eureka-server + diff --git a/lab-6-api-gateway/api-gateway-project/src/main/java/com/example/apigatewayproject/ApiGatewayProjectApplication.java b/lab-6-api-gateway/api-gateway-project/src/main/java/com/example/apigatewayproject/ApiGatewayProjectApplication.java index e0f6114..c759fc1 100644 --- a/lab-6-api-gateway/api-gateway-project/src/main/java/com/example/apigatewayproject/ApiGatewayProjectApplication.java +++ b/lab-6-api-gateway/api-gateway-project/src/main/java/com/example/apigatewayproject/ApiGatewayProjectApplication.java @@ -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 ApiGatewayProjectApplication { public static void main(String[] args) { diff --git a/lab-6-api-gateway/api-gateway-project/src/main/resources/application.yml b/lab-6-api-gateway/api-gateway-project/src/main/resources/application.yml index aaad35d..514e21c 100644 --- a/lab-6-api-gateway/api-gateway-project/src/main/resources/application.yml +++ b/lab-6-api-gateway/api-gateway-project/src/main/resources/application.yml @@ -1,6 +1,34 @@ server: port: 8080 + address: 0.0.0.0 + #TODO use eureka to discover the URL for the service1 and service2 + + eureka: + client: + serviceUrl: + defaultZone: http://localhost:3000/eureka/ + register-with-eureka: true + fetch-registry: true + #TODO configure spring cloud gateway to route the request to downstream services (service1 and service2) based on the paths(/api/greeting, /product) + +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/** + #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) \ No newline at end of file diff --git a/lab-6-api-gateway/service1/pom.xml b/lab-6-api-gateway/service1/pom.xml index 478fe3f..1539d44 100644 --- a/lab-6-api-gateway/service1/pom.xml +++ b/lab-6-api-gateway/service1/pom.xml @@ -18,10 +18,10 @@ 2021.0.1 - + org.springframework.boot spring-boot-starter-actuator @@ -30,7 +30,10 @@ org.springframework.boot spring-boot-starter-web - + + org.springframework.cloud + spring-cloud-netflix-eureka-client + org.springframework.boot spring-boot-starter-test diff --git a/lab-6-api-gateway/service1/src/main/java/com/example/service1/Service1Application.java b/lab-6-api-gateway/service1/src/main/java/com/example/service1/Service1Application.java index 27128b5..65b1c23 100644 --- a/lab-6-api-gateway/service1/src/main/java/com/example/service1/Service1Application.java +++ b/lab-6-api-gateway/service1/src/main/java/com/example/service1/Service1Application.java @@ -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) { diff --git a/lab-6-api-gateway/service1/src/main/java/com/example/service1/Service1Controller.java b/lab-6-api-gateway/service1/src/main/java/com/example/service1/Service1Controller.java new file mode 100644 index 0000000..87a0083 --- /dev/null +++ b/lab-6-api-gateway/service1/src/main/java/com/example/service1/Service1Controller.java @@ -0,0 +1,17 @@ +package com.example.service1; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/api") +public class Service1Controller { + + @GetMapping("/greeting/{name}") + public String greeting(@PathVariable String name){ + System.out.println(name); + return "Hello "+ name; + } +} diff --git a/lab-6-api-gateway/service1/src/main/resources/application.yml b/lab-6-api-gateway/service1/src/main/resources/application.yml index 54b155f..61712e3 100644 --- a/lab-6-api-gateway/service1/src/main/resources/application.yml +++ b/lab-6-api-gateway/service1/src/main/resources/application.yml @@ -1,2 +1,14 @@ server: - port: 8081 \ No newline at end of file + port: 8081 + address: 0.0.0.0 + +spring: + application: + name: service1 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:3000/eureka/ + register-with-eureka: true + fetch-registry: true \ No newline at end of file diff --git a/lab-6-api-gateway/service2/pom.xml b/lab-6-api-gateway/service2/pom.xml index be06918..4f9570a 100644 --- a/lab-6-api-gateway/service2/pom.xml +++ b/lab-6-api-gateway/service2/pom.xml @@ -26,16 +26,27 @@ org.springframework.boot spring-boot-starter-web - - + + + org.springframework.cloud + spring-cloud-netflix-eureka-client + org.springframework.boot spring-boot-starter-test test + + org.hibernate + hibernate-core + + + org.projectlombok + lombok + diff --git a/lab-6-api-gateway/service2/src/main/java/com/example/service2/Product.java b/lab-6-api-gateway/service2/src/main/java/com/example/service2/Product.java new file mode 100644 index 0000000..a7436a4 --- /dev/null +++ b/lab-6-api-gateway/service2/src/main/java/com/example/service2/Product.java @@ -0,0 +1,24 @@ +package com.example.service2; + +import com.sun.istack.NotNull; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.persistence.Column; +import javax.persistence.Entity; + +@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; +} diff --git a/lab-6-api-gateway/service2/src/main/java/com/example/service2/Service2Application.java b/lab-6-api-gateway/service2/src/main/java/com/example/service2/Service2Application.java index 3c2fbd2..383d462 100644 --- a/lab-6-api-gateway/service2/src/main/java/com/example/service2/Service2Application.java +++ b/lab-6-api-gateway/service2/src/main/java/com/example/service2/Service2Application.java @@ -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) { diff --git a/lab-6-api-gateway/service2/src/main/java/com/example/service2/Service2Controller.java b/lab-6-api-gateway/service2/src/main/java/com/example/service2/Service2Controller.java new file mode 100644 index 0000000..8e431bf --- /dev/null +++ b/lab-6-api-gateway/service2/src/main/java/com/example/service2/Service2Controller.java @@ -0,0 +1,31 @@ +package com.example.service2; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.validation.BindingResult; +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 products = new ArrayList(); + + @ResponseStatus(HttpStatus.OK) + @PostMapping() + public void addProduct(@RequestBody Product product, @RequestHeader Map headers) { + for(Map.Entry header : headers.entrySet()) { + System.out.println(header); + } + products.add(product); + } + + @GetMapping() + public List getProducts() { + return products; + } +} diff --git a/lab-6-api-gateway/service2/src/main/resources/application.yml b/lab-6-api-gateway/service2/src/main/resources/application.yml index 4772153..5636502 100644 --- a/lab-6-api-gateway/service2/src/main/resources/application.yml +++ b/lab-6-api-gateway/service2/src/main/resources/application.yml @@ -1,3 +1,15 @@ server: - port: 8082 \ No newline at end of file + port: 8082 + address: 0.0.0.0 + +spring: + application: + name: service2 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:3000/eureka/ + register-with-eureka: true + fetch-registry: true \ No newline at end of file