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: