diff --git a/API-Gateway/src/main/resources/application.yml b/API-Gateway/src/main/resources/application.yml
index 5a6ed7a..c25d1e1 100644
--- a/API-Gateway/src/main/resources/application.yml
+++ b/API-Gateway/src/main/resources/application.yml
@@ -43,6 +43,19 @@ spring:
uri: lb://fund-transfer-service
predicates:
- Path=/fund-transfers/**
+ httpclient:
+ connect-timeout: 5000
+ response-timeout: 10s
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: health,metrics,prometheus
+ metrics:
+ export:
+ prometheus:
+ enabled: true
security:
oauth2:
diff --git a/Account-Service/pom.xml b/Account-Service/pom.xml
index 3d4401c..d57f56b 100644
--- a/Account-Service/pom.xml
+++ b/Account-Service/pom.xml
@@ -22,6 +22,14 @@
org.springframework.boot
spring-boot-starter-actuator
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
org.springframework.boot
spring-boot-starter-data-jpa
diff --git a/Account-Service/src/main/java/org/training/account/service/configuration/CacheConfig.java b/Account-Service/src/main/java/org/training/account/service/configuration/CacheConfig.java
new file mode 100644
index 0000000..6ecefe1
--- /dev/null
+++ b/Account-Service/src/main/java/org/training/account/service/configuration/CacheConfig.java
@@ -0,0 +1,9 @@
+package org.training.account.service.configuration;
+
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableCaching
+public class CacheConfig {
+}
diff --git a/Account-Service/src/main/java/org/training/account/service/repository/AccountRepository.java b/Account-Service/src/main/java/org/training/account/service/repository/AccountRepository.java
index 8184b2b..bc696af 100644
--- a/Account-Service/src/main/java/org/training/account/service/repository/AccountRepository.java
+++ b/Account-Service/src/main/java/org/training/account/service/repository/AccountRepository.java
@@ -1,5 +1,6 @@
package org.training.account.service.repository;
+import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.training.account.service.model.AccountType;
import org.training.account.service.model.entity.Account;
@@ -23,6 +24,7 @@ public interface AccountRepository extends JpaRepository {
* @param accountNumber The account number to search for.
* @return An optional containing the found account, or an empty optional if no account was found.
*/
+ @Cacheable(value = "accounts", key = "#accountNumber")
Optional findAccountByAccountNumber(String accountNumber);
/**
@@ -31,5 +33,6 @@ public interface AccountRepository extends JpaRepository {
* @param userId the ID of the user
* @return an optional account object
*/
+ @Cacheable(value = "accounts", key = "'user:' + #userId")
Optional findAccountByUserId(Long userId);
}
diff --git a/Account-Service/src/main/resources/application.yml b/Account-Service/src/main/resources/application.yml
index 094aca9..16aaa5f 100644
--- a/Account-Service/src/main/resources/application.yml
+++ b/Account-Service/src/main/resources/application.yml
@@ -10,6 +10,12 @@ spring:
url: jdbc:mysql://localhost:3306/account_service
username: root
password: root
+ hikari:
+ maximum-pool-size: 20
+ minimum-idle: 5
+ idle-timeout: 300000
+ connection-timeout: 20000
+ max-lifetime: 1200000
jpa:
hibernate:
@@ -18,6 +24,40 @@ spring:
properties:
hibernate:
format_sql: true
+ jdbc:
+ batch_size: 20
+ order_inserts: true
+ order_updates: true
+ batch_versioned_data: true
+
+ cache:
+ type: redis
+ redis:
+ time-to-live: 600000
+
+ redis:
+ host: ${REDIS_HOST:localhost}
+ port: ${REDIS_PORT:6379}
+ timeout: 2000ms
+
+feign:
+ client:
+ config:
+ default:
+ connectTimeout: 5000
+ readTimeout: 10000
+ circuitbreaker:
+ enabled: true
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: health,metrics,prometheus
+ metrics:
+ export:
+ prometheus:
+ enabled: true
server:
port: 8081
diff --git a/Fund-Transfer/pom.xml b/Fund-Transfer/pom.xml
index e5edb09..1eb8434 100644
--- a/Fund-Transfer/pom.xml
+++ b/Fund-Transfer/pom.xml
@@ -22,6 +22,14 @@
org.springframework.boot
spring-boot-starter-actuator
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
org.springframework.boot
spring-boot-starter-data-jpa
diff --git a/Fund-Transfer/src/main/java/org/training/fundtransfer/configuration/CacheConfig.java b/Fund-Transfer/src/main/java/org/training/fundtransfer/configuration/CacheConfig.java
new file mode 100644
index 0000000..2d1ac07
--- /dev/null
+++ b/Fund-Transfer/src/main/java/org/training/fundtransfer/configuration/CacheConfig.java
@@ -0,0 +1,9 @@
+package org.training.fundtransfer.configuration;
+
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableCaching
+public class CacheConfig {
+}
diff --git a/Fund-Transfer/src/main/java/org/training/fundtransfer/repository/FundTransferRepository.java b/Fund-Transfer/src/main/java/org/training/fundtransfer/repository/FundTransferRepository.java
index 7db31b3..bb81045 100644
--- a/Fund-Transfer/src/main/java/org/training/fundtransfer/repository/FundTransferRepository.java
+++ b/Fund-Transfer/src/main/java/org/training/fundtransfer/repository/FundTransferRepository.java
@@ -1,5 +1,6 @@
package org.training.fundtransfer.repository;
+import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.training.fundtransfer.model.entity.FundTransfer;
@@ -14,6 +15,7 @@ public interface FundTransferRepository extends JpaRepository findFundTransferByTransactionReference(String referenceId);
/**
@@ -22,5 +24,6 @@ public interface FundTransferRepository extends JpaRepository findFundTransferByFromAccount(String accountId);
}
diff --git a/Fund-Transfer/src/main/java/org/training/fundtransfer/service/implementation/FundTransferServiceImpl.java b/Fund-Transfer/src/main/java/org/training/fundtransfer/service/implementation/FundTransferServiceImpl.java
index 2857c54..9359af0 100644
--- a/Fund-Transfer/src/main/java/org/training/fundtransfer/service/implementation/FundTransferServiceImpl.java
+++ b/Fund-Transfer/src/main/java/org/training/fundtransfer/service/implementation/FundTransferServiceImpl.java
@@ -5,6 +5,7 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import org.training.fundtransfer.exception.AccountUpdateException;
import org.training.fundtransfer.exception.GlobalErrorCode;
import org.training.fundtransfer.exception.InsufficientBalance;
@@ -52,6 +53,7 @@ public class FundTransferServiceImpl implements FundTransferService {
* @throws InsufficientBalance If the required amount to transfer is not available.
*/
@Override
+ @Transactional
public FundTransferResponse fundTransfer(FundTransferRequest fundTransferRequest) {
Account fromAccount;
diff --git a/Fund-Transfer/src/main/resources/application.yml b/Fund-Transfer/src/main/resources/application.yml
index 4e0abdd..d3516f8 100644
--- a/Fund-Transfer/src/main/resources/application.yml
+++ b/Fund-Transfer/src/main/resources/application.yml
@@ -11,13 +11,51 @@ spring:
url: jdbc:mysql://localhost:3306/fund_transfer_service
username: root
password: root
+ hikari:
+ maximum-pool-size: 20
+ minimum-idle: 5
+ idle-timeout: 300000
+ connection-timeout: 20000
+ max-lifetime: 1200000
jpa:
hibernate:
ddl-auto: update
-
show-sql: true
-
properties:
hibernate:
- format_sql: true
\ No newline at end of file
+ format_sql: true
+ jdbc:
+ batch_size: 20
+ order_inserts: true
+ order_updates: true
+ batch_versioned_data: true
+
+ cache:
+ type: redis
+ redis:
+ time-to-live: 600000
+
+ redis:
+ host: ${REDIS_HOST:localhost}
+ port: ${REDIS_PORT:6379}
+ timeout: 2000ms
+
+feign:
+ client:
+ config:
+ default:
+ connectTimeout: 5000
+ readTimeout: 10000
+ circuitbreaker:
+ enabled: true
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: health,metrics,prometheus
+ metrics:
+ export:
+ prometheus:
+ enabled: true
diff --git a/Sequence-Generator/src/main/resources/application.yml b/Sequence-Generator/src/main/resources/application.yml
index 5778569..437b7ee 100644
--- a/Sequence-Generator/src/main/resources/application.yml
+++ b/Sequence-Generator/src/main/resources/application.yml
@@ -6,6 +6,12 @@ spring:
url: jdbc:mysql://localhost:3306/sequence_generator
username: root
password: root
+ hikari:
+ maximum-pool-size: 20
+ minimum-idle: 5
+ idle-timeout: 300000
+ connection-timeout: 20000
+ max-lifetime: 1200000
jpa:
hibernate:
@@ -14,5 +20,20 @@ spring:
properties:
hibernate:
format_sql: true
+ jdbc:
+ batch_size: 20
+ order_inserts: true
+ order_updates: true
+ batch_versioned_data: true
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: health,metrics,prometheus
+ metrics:
+ export:
+ prometheus:
+ enabled: true
server:
port: 8083
diff --git a/Service-Registry/src/main/resources/application.yml b/Service-Registry/src/main/resources/application.yml
index b8bdc45..45d0a30 100644
--- a/Service-Registry/src/main/resources/application.yml
+++ b/Service-Registry/src/main/resources/application.yml
@@ -11,3 +11,13 @@ eureka:
spring:
application:
name: SERVICE-REGISTRY
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: health,metrics,prometheus
+ metrics:
+ export:
+ prometheus:
+ enabled: true
diff --git a/Transaction-Service/pom.xml b/Transaction-Service/pom.xml
index 6f70a80..e9adbf8 100644
--- a/Transaction-Service/pom.xml
+++ b/Transaction-Service/pom.xml
@@ -22,6 +22,14 @@
org.springframework.boot
spring-boot-starter-actuator
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
org.springframework.boot
spring-boot-starter-data-jpa
diff --git a/Transaction-Service/src/main/java/org/training/transactions/configuration/CacheConfig.java b/Transaction-Service/src/main/java/org/training/transactions/configuration/CacheConfig.java
new file mode 100644
index 0000000..4bd95f3
--- /dev/null
+++ b/Transaction-Service/src/main/java/org/training/transactions/configuration/CacheConfig.java
@@ -0,0 +1,9 @@
+package org.training.transactions.configuration;
+
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableCaching
+public class CacheConfig {
+}
diff --git a/Transaction-Service/src/main/java/org/training/transactions/repository/TransactionRepository.java b/Transaction-Service/src/main/java/org/training/transactions/repository/TransactionRepository.java
index a5bd09c..e150d6a 100644
--- a/Transaction-Service/src/main/java/org/training/transactions/repository/TransactionRepository.java
+++ b/Transaction-Service/src/main/java/org/training/transactions/repository/TransactionRepository.java
@@ -1,5 +1,6 @@
package org.training.transactions.repository;
+import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.training.transactions.model.entity.Transaction;
@@ -13,6 +14,7 @@ public interface TransactionRepository extends JpaRepository
* @param accountId the ID of the account
* @return a list of transactions
*/
+ @Cacheable(value = "transactions", key = "'account:' + #accountId")
List findTransactionByAccountId(String accountId);
/**
@@ -21,5 +23,6 @@ public interface TransactionRepository extends JpaRepository
* @param referenceId The reference ID to match against.
* @return The list of transactions that match the reference ID.
*/
+ @Cacheable(value = "transactions", key = "'ref:' + #referenceId")
List findTransactionByReferenceId(String referenceId);
}
diff --git a/Transaction-Service/src/main/resources/application.yml b/Transaction-Service/src/main/resources/application.yml
index b23b7bf..f383620 100644
--- a/Transaction-Service/src/main/resources/application.yml
+++ b/Transaction-Service/src/main/resources/application.yml
@@ -9,6 +9,12 @@ spring:
url: jdbc:mysql://localhost:3306/transaction_service
username: root
password: root
+ hikari:
+ maximum-pool-size: 20
+ minimum-idle: 5
+ idle-timeout: 300000
+ connection-timeout: 20000
+ max-lifetime: 1200000
jpa:
hibernate:
@@ -17,6 +23,40 @@ spring:
properties:
hibernate:
format_sql: true
+ jdbc:
+ batch_size: 20
+ order_inserts: true
+ order_updates: true
+ batch_versioned_data: true
+
+ cache:
+ type: redis
+ redis:
+ time-to-live: 600000
+
+ redis:
+ host: ${REDIS_HOST:localhost}
+ port: ${REDIS_PORT:6379}
+ timeout: 2000ms
+
+feign:
+ client:
+ config:
+ default:
+ connectTimeout: 5000
+ readTimeout: 10000
+ circuitbreaker:
+ enabled: true
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: health,metrics,prometheus
+ metrics:
+ export:
+ prometheus:
+ enabled: true
server:
- port: 8084
\ No newline at end of file
+ port: 8084
diff --git a/User-Service/pom.xml b/User-Service/pom.xml
index 75e9b29..63675fe 100644
--- a/User-Service/pom.xml
+++ b/User-Service/pom.xml
@@ -22,6 +22,14 @@
org.springframework.boot
spring-boot-starter-actuator
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
org.springframework.boot
spring-boot-starter-data-jpa
diff --git a/User-Service/src/main/java/org/training/user/service/config/CacheConfig.java b/User-Service/src/main/java/org/training/user/service/config/CacheConfig.java
new file mode 100644
index 0000000..d7f53c2
--- /dev/null
+++ b/User-Service/src/main/java/org/training/user/service/config/CacheConfig.java
@@ -0,0 +1,9 @@
+package org.training.user.service.config;
+
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableCaching
+public class CacheConfig {
+}
diff --git a/User-Service/src/main/java/org/training/user/service/repository/UserRepository.java b/User-Service/src/main/java/org/training/user/service/repository/UserRepository.java
index fc83ce6..a64d7b5 100644
--- a/User-Service/src/main/java/org/training/user/service/repository/UserRepository.java
+++ b/User-Service/src/main/java/org/training/user/service/repository/UserRepository.java
@@ -1,5 +1,6 @@
package org.training.user.service.repository;
+import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.training.user.service.model.entity.User;
@@ -13,5 +14,6 @@ public interface UserRepository extends JpaRepository {
* @param authId the authentication ID of the user
* @return an optional containing the user if found, otherwise empty
*/
+ @Cacheable(value = "users", key = "#authId")
Optional findUserByAuthId(String authId);
}
diff --git a/User-Service/src/main/resources/application.yml b/User-Service/src/main/resources/application.yml
index bded349..ba597f2 100644
--- a/User-Service/src/main/resources/application.yml
+++ b/User-Service/src/main/resources/application.yml
@@ -13,6 +13,12 @@ spring:
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${MYSQL_DB_NAME:user_service}
username: ${MYSQL_USER:root}
password: ${MYSQL_PASSWORD:root}
+ hikari:
+ maximum-pool-size: 20
+ minimum-idle: 5
+ idle-timeout: 300000
+ connection-timeout: 20000
+ max-lifetime: 1200000
jpa:
hibernate:
ddl-auto: update
@@ -20,6 +26,40 @@ spring:
properties:
hibernate:
format_sql: true
+ jdbc:
+ batch_size: 20
+ order_inserts: true
+ order_updates: true
+ batch_versioned_data: true
+
+ cache:
+ type: redis
+ redis:
+ time-to-live: 600000
+
+ redis:
+ host: ${REDIS_HOST:localhost}
+ port: ${REDIS_PORT:6379}
+ timeout: 2000ms
+
+feign:
+ client:
+ config:
+ default:
+ connectTimeout: 5000
+ readTimeout: 10000
+ circuitbreaker:
+ enabled: true
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: health,metrics,prometheus
+ metrics:
+ export:
+ prometheus:
+ enabled: true
app: