Skip to content
Merged
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
30 changes: 30 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Java CI with Maven

on:
push:
pull_request:

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Check Repository
uses: actions/checkout@v4

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: maven

- name: Build with Maven
working-directory: user-service
run: mvn -B clean verify

- name: Upload test results
uses: actions/upload-artifact@v4
with:
name: test-results
path: user-service/target/surefire-reports/
10 changes: 8 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ services:
interval: 10s
timeout: 10s
retries: 5

user-service:
image: user-service:latest
build:
Expand All @@ -78,6 +77,13 @@ services:
- KAFKA_BOOTSTRAP_SERVERS=kafka:9093
env_file:
- .env

redis:
image: redis:8.2.1
restart: on-failure
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
pgdata:
redis_data:
17 changes: 16 additions & 1 deletion user-service/user-service-impl/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>



<!-- Swagger -->
<dependency>
<groupId>org.springdoc</groupId>
Expand Down Expand Up @@ -132,5 +134,18 @@
<artifactId>spring-kafka</artifactId>
</dependency>

<!-- Cache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>3.5.6</version>
</dependency>

<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

</dependencies>
</project>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package ru.project.iakov.userservice.configuration;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import ru.project.iakov.userservice.domain.entity.User;

import java.time.Duration;

@EnableCaching
@Configuration
public class ConfigRedis {

@Bean
public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory connectionFactory,
ObjectMapper objectMapper) {
RedisTemplate<String, User> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);

redisTemplate.setKeySerializer(new StringRedisSerializer());

var serializer = new Jackson2JsonRedisSerializer<>(objectMapper,User.class);
redisTemplate.setValueSerializer(serializer);

redisTemplate.afterPropertiesSet();
return redisTemplate;
}

@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory,
ObjectMapper objectMapper) {
var jsonSerializer = new Jackson2JsonRedisSerializer<>(objectMapper, User.class);

RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(1))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jsonSerializer));

return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.transactionAware()
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.project.iakov.userservice.domain.entity.User;
Expand Down Expand Up @@ -31,6 +33,10 @@ public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
private final KafkaSender kafkaSender;

@Cacheable(
value = "user",
key = "#id"
)
@Override
public UserResponse findById(UUID id) {
User user = userRepository.findById(id)
Expand Down Expand Up @@ -80,6 +86,10 @@ public UserResponse createUser(UserRequest userRequest) {
return userMapper.toResponse(savedUser);
}

@CacheEvict(
value = "user",
key = "#id"
)
@Override
@Transactional
public UserResponse updateUser(UUID id, UserRequest userRequest) {
Expand All @@ -105,6 +115,10 @@ public UserResponse updateUser(UUID id, UserRequest userRequest) {
return userMapper.toResponse(updatedUser);
}

@CacheEvict(
value = "user",
key = "#id"
)
@Override
@Transactional
public void deleteUser(UUID id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ spring:
properties:
hibernate:
format_sql: true
data:
redis:
host: ${SPRING_REDIS_HOST:localhost}
port: ${SPRING_REDIS_PORT:6379}
cache:
type: redis
liquibase:
change-log: classpath:db/changelog/db.changelog-master.yaml
jackson:
Expand All @@ -28,7 +34,6 @@ spring:
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer

logging:
level:
ru.project.iakov.userservice.kafka: INFO
Expand Down
Loading