Check Out Our Amazing ROADMAPS
/spring-boot-microservice-currency-conversion-service/pom.xml
<?xml version =" 1.0" encoding =" UTF-8" ?>
<project xmlns =" http:https://maven.apache.org/POM/4.0.0" xmlns : xsi =" http:https://www.w3.org/2001/XMLSchema-instance"
xsi : schemaLocation =" http:https://maven.apache.org/POM/4.0.0 http:https://maven.apache.org/xsd/maven-4.0.0.xsd" >
<modelVersion >4.0.0</modelVersion >
<parent >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-parent</artifactId >
<version >3.0.2</version >
<relativePath /> <!-- lookup parent from repository -->
</parent >
<groupId >com.in28minutes.springboot.microservice.example.currency-conversion</groupId >
<artifactId >spring-boot-microservice-currency-conversion</artifactId >
<version >0.0.1-SNAPSHOT</version >
<packaging >jar</packaging >
<name >spring-boot-microservice-currency-conversion</name >
<description >Microservices with Spring Boot and Spring Cloud - Currency Conversion Service</description >
<properties >
<java .version>17</java .version>
<spring-cloud .version>2022.0.0</spring-cloud .version>
</properties >
<dependencies >
<dependency >
<groupId >org.springframework.cloud</groupId >
<artifactId >spring-cloud-starter-netflix-eureka-client</artifactId >
</dependency >
<dependency >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-web</artifactId >
</dependency >
<dependency >
<groupId >org.springframework.cloud</groupId >
<artifactId >spring-cloud-starter-openfeign</artifactId >
</dependency >
<dependency >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-devtools</artifactId >
<scope >runtime</scope >
</dependency >
<dependency >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-test</artifactId >
<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 >
<build >
<plugins >
<plugin >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-maven-plugin</artifactId >
</plugin >
</plugins >
</build >
<repositories >
<repository >
<id >spring-milestones</id >
<name >Spring Milestones</name >
<url >https://repo.spring.io/milestone</url >
<snapshots >
<enabled >false</enabled >
</snapshots >
</repository >
</repositories >
<pluginRepositories >
<pluginRepository >
<id >spring-milestones</id >
<name >Spring Milestones</name >
<url >https://repo.spring.io/milestone</url >
<snapshots >
<enabled >false</enabled >
</snapshots >
</pluginRepository >
</pluginRepositories >
</project >
/spring-boot-microservice-currency-conversion-service/src/main/java/com/in28minutes/springboot/microservice/example/currencyconversion/CurrencyConversionBean.java
package com .in28minutes .springboot .microservice .example .currencyconversion ;
import java .math .BigDecimal ;
public record CurrencyConversionBean (Long id ,
String from ,
String to ,
BigDecimal conversionMultiple ,
BigDecimal quantity ,
BigDecimal totalCalculatedAmount ,
int port ) {
}
/spring-boot-microservice-currency-conversion-service/src/main/java/com/in28minutes/springboot/microservice/example/currencyconversion/CurrencyConversionController.java
package com .in28minutes .springboot .microservice .example .currencyconversion ;
import java .math .BigDecimal ;
import java .util .HashMap ;
import java .util .Map ;
import org .slf4j .Logger ;
import org .slf4j .LoggerFactory ;
import org .springframework .beans .factory .annotation .Autowired ;
import org .springframework .http .ResponseEntity ;
import org .springframework .web .bind .annotation .GetMapping ;
import org .springframework .web .bind .annotation .PathVariable ;
import org .springframework .web .bind .annotation .RestController ;
import org .springframework .web .client .RestTemplate ;
@ RestController
public class CurrencyConversionController {
private final Logger LOGGER = LoggerFactory .getLogger (this .getClass ());
@ Autowired
private CurrencyExchangeServiceProxy proxy ;
@ GetMapping ("/currency-converter/from/{from}/to/{to}/quantity/{quantity}" )
public CurrencyConversionBean convertCurrency (@ PathVariable String from ,
@ PathVariable String to ,
@ PathVariable BigDecimal quantity ) {
Map <String , String > uriVariables = new HashMap <>();
uriVariables .put ("from" , from );
uriVariables .put ("to" , to );
ResponseEntity <CurrencyConversionBean > responseEntity = new RestTemplate ().getForEntity (
"http:https://localhost:8000/currency-exchange/from/{from}/to/{to}" , CurrencyConversionBean .class ,
uriVariables );
CurrencyConversionBean response = responseEntity .getBody ();
return new CurrencyConversionBean (response .id (), from , to , response .conversionMultiple (), quantity ,
quantity .multiply (response .conversionMultiple ()), response .port ());
}
@ GetMapping ("/currency-converter-feign/from/{from}/to/{to}/quantity/{quantity}" )
public CurrencyConversionBean convertCurrencyFeign (@ PathVariable String from ,
@ PathVariable String to ,
@ PathVariable BigDecimal quantity ) {
CurrencyConversionBean response = proxy .retrieveExchangeValue (from , to );
LOGGER .info ("{}" , response );
return new CurrencyConversionBean (response .id (),
from ,
to ,
response .conversionMultiple (),
quantity ,
quantity .multiply (response .conversionMultiple ()),
response .port ());
}
}
/spring-boot-microservice-currency-conversion-service/src/main/java/com/in28minutes/springboot/microservice/example/currencyconversion/CurrencyExchangeServiceProxy.java
package com .in28minutes .springboot .microservice .example .currencyconversion ;
import org .springframework .cloud .openfeign .FeignClient ;
import org .springframework .web .bind .annotation .GetMapping ;
import org .springframework .web .bind .annotation .PathVariable ;
@ FeignClient (name = "forex-service" )
public interface CurrencyExchangeServiceProxy {
@ GetMapping ("/currency-exchange/from/{from}/to/{to}" )
CurrencyConversionBean retrieveExchangeValue (@ PathVariable ("from" ) String from ,
@ PathVariable ("to" ) String to );
}
/spring-boot-microservice-currency-conversion-service/src/main/java/com/in28minutes/springboot/microservice/example/currencyconversion/SpringBootMicroserviceCurrencyConversionApplication.java
package com .in28minutes .springboot .microservice .example .currencyconversion ;
import org .springframework .boot .SpringApplication ;
import org .springframework .boot .autoconfigure .SpringBootApplication ;
import org .springframework .cloud .client .discovery .EnableDiscoveryClient ;
import org .springframework .cloud .openfeign .EnableFeignClients ;
@ SpringBootApplication
@ EnableFeignClients ("com.in28minutes.springboot.microservice.example.currencyconversion" )
@ EnableDiscoveryClient
public class SpringBootMicroserviceCurrencyConversionApplication {
public static void main (String [] args ) {
SpringApplication .run (SpringBootMicroserviceCurrencyConversionApplication .class , args );
}
}
/spring-boot-microservice-currency-conversion-service/src/main/resources/application.properties
spring.application.name =currency-conversion-service
server.port =8100
eureka.client.service-url.default-zone =http:https://localhost:8761/eureka
/spring-boot-microservice-currency-conversion-service/src/test/java/com/in28minutes/springboot/microservice/example/currencyconversion/SpringBootMicroserviceCurrencyConversionApplicationTests.java
package com .in28minutes .springboot .microservice .example .currencyconversion ;
import org .junit .jupiter .api .Test ;
import org .junit .jupiter .api .extension .ExtendWith ;
import org .springframework .boot .test .context .SpringBootTest ;
import org .springframework .test .context .junit .jupiter .SpringExtension ;
@ ExtendWith (SpringExtension .class )
@ SpringBootTest
public class SpringBootMicroserviceCurrencyConversionApplicationTests {
@ Test
public void contextLoads () {
}
}
/spring-boot-microservice-eureka-naming-server/pom.xml
<?xml version =" 1.0" encoding =" UTF-8" ?>
<project xmlns =" http:https://maven.apache.org/POM/4.0.0" xmlns : xsi =" http:https://www.w3.org/2001/XMLSchema-instance"
xsi : schemaLocation =" http:https://maven.apache.org/POM/4.0.0 http:https://maven.apache.org/xsd/maven-4.0.0.xsd" >
<modelVersion >4.0.0</modelVersion >
<parent >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-parent</artifactId >
<version >3.0.2</version >
<relativePath /> <!-- lookup parent from repository -->
</parent >
<groupId >com.in28minutes.springboot.microservice.eureka.naming.server</groupId >
<artifactId >spring-boot-microservice-eureka-naming-server</artifactId >
<version >0.0.1-SNAPSHOT</version >
<packaging >jar</packaging >
<name >spring-boot-microservice-eureka-naming-server</name >
<description >Microservices with Spring Boot and Spring Cloud - Eureka Naming Server</description >
<properties >
<java .version>17</java .version>
<spring-cloud .version>2022.0.0</spring-cloud .version> <!-- aka Jubilee -->
</properties >
<dependencies >
<dependency >
<groupId >org.springframework.cloud</groupId >
<artifactId >spring-cloud-starter-netflix-eureka-server</artifactId >
</dependency >
<dependency >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-test</artifactId >
<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 >
<build >
<plugins >
<plugin >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-maven-plugin</artifactId >
</plugin >
</plugins >
</build >
<repositories >
<repository >
<id >spring-milestones</id >
<name >Spring Milestones</name >
<url >https://repo.spring.io/milestone</url >
<snapshots >
<enabled >false</enabled >
</snapshots >
</repository >
</repositories >
<pluginRepositories >
<pluginRepository >
<id >spring-milestones</id >
<name >Spring Milestones</name >
<url >https://repo.spring.io/milestone</url >
<snapshots >
<enabled >false</enabled >
</snapshots >
</pluginRepository >
</pluginRepositories >
</project >
/spring-boot-microservice-eureka-naming-server/src/main/java/com/in28minutes/springboot/microservice/eureka/naming/server/SpringBootMicroserviceEurekaNamingServerApplication.java
package com .in28minutes .springboot .microservice .eureka .naming .server ;
import org .springframework .boot .SpringApplication ;
import org .springframework .boot .autoconfigure .SpringBootApplication ;
import org .springframework .cloud .netflix .eureka .server .EnableEurekaServer ;
@ SpringBootApplication
@ EnableEurekaServer
public class SpringBootMicroserviceEurekaNamingServerApplication {
public static void main (String [] args ) {
SpringApplication .run (SpringBootMicroserviceEurekaNamingServerApplication .class , args );
}
}
/spring-boot-microservice-eureka-naming-server/src/main/resources/application.properties
spring.application.name =netflix-eureka-naming-server
server.port =8761
eureka.client.register-with-eureka =false
eureka.client.fetch-registry =false
/spring-boot-microservice-eureka-naming-server/src/test/java/com/in28minutes/springboot/microservice/eureka/naming/server/SpringBootMicroserviceEurekaNamingServerApplicationTests.java
package com .in28minutes .springboot .microservice .eureka .naming .server ;
import org .junit .jupiter .api .Test ;
import org .junit .jupiter .api .extension .ExtendWith ;
import org .springframework .boot .test .context .SpringBootTest ;
import org .springframework .test .context .junit .jupiter .SpringExtension ;
@ ExtendWith (SpringExtension .class )
@ SpringBootTest
public class SpringBootMicroserviceEurekaNamingServerApplicationTests {
@ Test
public void contextLoads () {
}
}
/spring-boot-microservice-forex-service/pom.xml
<?xml version =" 1.0" encoding =" UTF-8" ?>
<project xmlns =" http:https://maven.apache.org/POM/4.0.0" xmlns : xsi =" http:https://www.w3.org/2001/XMLSchema-instance"
xsi : schemaLocation =" http:https://maven.apache.org/POM/4.0.0 http:https://maven.apache.org/xsd/maven-4.0.0.xsd" >
<modelVersion >4.0.0</modelVersion >
<parent >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-parent</artifactId >
<version >3.0.2</version >
<relativePath /> <!-- lookup parent from repository -->
</parent >
<groupId >com.in28minutes.springboot.microservice.example.forex</groupId >
<artifactId >spring-boot-microservice-forex-service</artifactId >
<version >0.0.1-SNAPSHOT</version >
<packaging >jar</packaging >
<name >spring-boot-microservice-forex-service</name >
<description >Microservices with Spring Boot and Spring Cloud - Forex Service</description >
<properties >
<java .version>17</java .version>
<spring-cloud .version>2022.0.0</spring-cloud .version>
</properties >
<dependencies >
<dependency >
<groupId >org.springframework.cloud</groupId >
<artifactId >spring-cloud-starter-netflix-eureka-client</artifactId >
</dependency >
<dependency >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-data-jpa</artifactId >
</dependency >
<dependency >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-web</artifactId >
</dependency >
<dependency >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-devtools</artifactId >
<scope >runtime</scope >
</dependency >
<dependency >
<groupId >com.h2database</groupId >
<artifactId >h2</artifactId >
<scope >runtime</scope >
</dependency >
<dependency >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-test</artifactId >
<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 >
<build >
<plugins >
<plugin >
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-maven-plugin</artifactId >
</plugin >
</plugins >
</build >
<repositories >
<repository >
<id >spring-milestones</id >
<name >Spring Milestones</name >
<url >https://repo.spring.io/milestone</url >
<snapshots >
<enabled >false</enabled >
</snapshots >
</repository >
</repositories >
<pluginRepositories >
<pluginRepository >
<id >spring-milestones</id >
<name >Spring Milestones</name >
<url >https://repo.spring.io/milestone</url >
<snapshots >
<enabled >false</enabled >
</snapshots >
</pluginRepository >
</pluginRepositories >
</project >
/spring-boot-microservice-forex-service/src/main/java/com/in28minutes/springboot/microservice/example/forex/ExchangeValue.java
package com .in28minutes .springboot .microservice .example .forex ;
import java .math .BigDecimal ;
import jakarta .persistence .Column ;
import jakarta .persistence .Entity ;
import jakarta .persistence .Id ;
@ Entity
public class ExchangeValue {
@ Id
private Long id ;
@ Column (name = "currency_from" )
private String from ;
@ Column (name = "currency_to" )
private String to ;
private BigDecimal conversionMultiple ;
private int port ;
public ExchangeValue () {
}
public ExchangeValue (Long id , String from , String to , BigDecimal conversionMultiple ) {
super ();
this .id = id ;
this .from = from ;
this .to = to ;
this .conversionMultiple = conversionMultiple ;
}
public Long getId () {
return id ;
}
public String getFrom () {
return from ;
}
public String getTo () {
return to ;
}
public BigDecimal getConversionMultiple () {
return conversionMultiple ;
}
public int getPort () {
return port ;
}
public void setPort (int port ) {
this .port = port ;
}
}
/spring-boot-microservice-forex-service/src/main/java/com/in28minutes/springboot/microservice/example/forex/ExchangeValueRepository.java
package com .in28minutes .springboot .microservice .example .forex ;
import org .springframework .data .jpa .repository .JpaRepository ;
public interface ExchangeValueRepository extends JpaRepository <ExchangeValue , Long > {
ExchangeValue findByFromAndTo (String from , String to );
}
/spring-boot-microservice-forex-service/src/main/java/com/in28minutes/springboot/microservice/example/forex/ForexController.java
package com .in28minutes .springboot .microservice .example .forex ;
import org .springframework .beans .factory .annotation .Autowired ;
import org .springframework .core .env .Environment ;
import org .springframework .web .bind .annotation .GetMapping ;
import org .springframework .web .bind .annotation .PathVariable ;
import org .springframework .web .bind .annotation .RestController ;
@ RestController
public class ForexController {
@ Autowired
private Environment environment ;
@ Autowired
private ExchangeValueRepository repository ;
@ GetMapping ("/currency-exchange/from/{from}/to/{to}" )
public ExchangeValue retrieveExchangeValue (@ PathVariable String from ,
@ PathVariable String to ) {
ExchangeValue exchangeValue = repository .findByFromAndTo (from , to );
exchangeValue .setPort (Integer .parseInt (environment .getProperty ("local.server.port" )));
return exchangeValue ;
}
}
/spring-boot-microservice-forex-service/src/main/java/com/in28minutes/springboot/microservice/example/forex/SpringBootMicroserviceForexServiceApplication.java
package com .in28minutes .springboot .microservice .example .forex ;
import org .springframework .boot .SpringApplication ;
import org .springframework .boot .autoconfigure .SpringBootApplication ;
import org .springframework .cloud .client .discovery .EnableDiscoveryClient ;
@ SpringBootApplication
@ EnableDiscoveryClient
public class SpringBootMicroserviceForexServiceApplication {
public static void main (String [] args ) {
SpringApplication .run (SpringBootMicroserviceForexServiceApplication .class , args );
}
}
/spring-boot-microservice-forex-service/src/main/resources/application.properties
spring.application.name =forex-service
server.port =8000
# Enabling H2 Console
spring.h2.console.enabled =true
# Turn Statistics on
# spring.jpa.properties.hibernate.generate_statistics=true
# logging.level.org.hibernate.stat=debug
# Show all queries
spring.jpa.show-sql =true
spring.jpa.properties.hibernate.format_sql =true
logging.level.org.hibernate.type =trace
spring.datasource.url =jdbc:h2:mem:testdb
spring.data.jpa.repositories.bootstrap-mode =default
spring.jpa.defer-datasource-initialization =true
eureka.client.service-url.default-zone =http:https://localhost:8761/eureka
/spring-boot-microservice-forex-service/src/main/resources/data.sql
insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)
values(10001,'USD','INR',65,0);
insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)
values(10002,'EUR','INR',75,0);
insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)
values(10003,'AUD','INR',25,0);
/spring-boot-microservice-forex-service/src/test/java/com/in28minutes/springboot/microservice/example/forex/SpringBootMicroserviceForexServiceApplicationTests.java
package com .in28minutes .springboot .microservice .example .forex ;
import org .junit .jupiter .api .Test ;
import org .junit .jupiter .api .extension .ExtendWith ;
import org .springframework .boot .test .context .SpringBootTest ;
import org .springframework .test .context .junit .jupiter .SpringExtension ;
@ ExtendWith (SpringExtension .class )
@ SpringBootTest
public class SpringBootMicroserviceForexServiceApplicationTests {
@ Test
public void contextLoads () {
}
}