분산캐싱 - 스프링 데이터 레포지토리 정의

This commit is contained in:
assu10
2020-10-02 23:19:03 +09:00
parent b2b3cc9b9c
commit 172667004a
8 changed files with 160 additions and 2 deletions

View File

@@ -206,6 +206,8 @@ HOW TO RUN
***- Spring Cloud Stream (EDA, 비동기 마이크로서비스 구성)***<br />
자세한 설명은 [Spring Cloud - Stream, 분산 캐싱 (1/2)](https://assu10.github.io/dev/2020/10/01/spring-cloud-stream/) 를 참고
```shell script
HOW TO RUN
@@ -220,6 +222,10 @@ C:\kafka_2.13-2.6.0\bin\windows>.\kafka-topics.bat --list --zookeeper localhost:
__consumer_offsets
mbChangeTopic
springCloudBus
-- 메시지 발행/수신 확인
[POST] http://localhost:8090/member/assu
```

View File

@@ -79,6 +79,22 @@
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
<!-- 분산 캐싱 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>

View File

@@ -1,11 +1,13 @@
package com.assu.cloud.eventservice;
import com.assu.cloud.eventservice.config.CustomConfig;
import com.assu.cloud.eventservice.event.model.MemberChangeModel;
import com.assu.cloud.eventservice.utils.CustomContextInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoRestTemplateFactory;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@@ -16,6 +18,8 @@ import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.web.client.RestTemplate;
@@ -33,6 +37,12 @@ public class EventServiceApplication {
private static final Logger logger = LoggerFactory.getLogger(EventServiceApplication.class);
private final CustomConfig customConfig;
public EventServiceApplication(CustomConfig customConfig) {
this.customConfig = customConfig;
}
/**
* 채널에서 받은 메시지를 MemberChangeModel 이라는 POJO 로 자동 역직렬화
* @param mbChange
@@ -41,6 +51,31 @@ public class EventServiceApplication {
public void loggerSink(MemberChangeModel mbChange) {
logger.info("======= Received an event for organization id {}", mbChange.getUserId());
}
/**
* 레디스 서버에 실제 DB 커넥션을 설정
* 레디스 인스턴스와 통신하려면 JedisConnectionFactory 를 빈으로 노출해야 함
* 이 커넥션을 사용해서 스프링 RedisTemplate 객체 생성
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName(customConfig.getRedisServer());
jedisConnectionFactory.setPort(customConfig.getRedisPort());
return jedisConnectionFactory;
}
/**
* 레디스 서버에 작업 수행 시 사용할 RedisTemplate 객체 생성
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
return redisTemplate;
}
/**
* 사용자 정의 RestTemplate 빈을 생성하여 토큰 삽입
* RestTemplate 기반 호출이 수행되기 전 후킹되는 메서드

View File

@@ -14,7 +14,13 @@ public class CustomConfig {
private String serviceIdZuul;
@Value("${signing.key}")
private String jwtSigningKey = "";
private String jwtSigningKey;
@Value("${redis.server}")
private String redisServer;
@Value("${redis.port}")
private int redisPort;
public String getYourName() {
return yourName;
@@ -27,4 +33,12 @@ public class CustomConfig {
public String getJwtSigningKey() {
return jwtSigningKey;
}
public String getRedisServer() {
return redisServer;
}
public int getRedisPort() {
return redisPort;
}
}

View File

@@ -0,0 +1,24 @@
package com.assu.cloud.eventservice.model;
import java.io.Serializable;
public class Member implements Serializable {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@@ -0,0 +1,10 @@
package com.assu.cloud.eventservice.repository;
import com.assu.cloud.eventservice.model.Member;
public interface MemberRedisRepository {
void saveMember(Member member);
void updateMember(Member member);
void deleteMember(String userId);
Member findMember(String userId);
}

View File

@@ -0,0 +1,49 @@
package com.assu.cloud.eventservice.repository;
import com.assu.cloud.eventservice.model.Member;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
@Repository
public class MemberRedisRepositoryImpl implements MemberRedisRepository {
private static final String HASH_NAME = "member"; // 회원 데이터가 저장되는 레디스 서버의 해시명
private RedisTemplate<String, Member> redisTemplate;
private HashOperations hashOperations; // HashOperation 클래스는 레디스 서버에 데이터 작업을 수행하는 스프링 헬퍼 메서드의 집합
public MemberRedisRepositoryImpl() {
super();
}
public MemberRedisRepositoryImpl(RedisTemplate<String, Member> redisTemplate) {
this.redisTemplate = redisTemplate;
}
@PostConstruct
public void init() {
hashOperations = redisTemplate.opsForHash();
}
@Override
public void saveMember(Member member) {
hashOperations.put(HASH_NAME, member.getId(), member);
}
@Override
public void updateMember(Member member) {
hashOperations.put(HASH_NAME, member.getId(), member);
}
@Override
public void deleteMember(String userId) {
hashOperations.delete(HASH_NAME, userId);
}
@Override
public Member findMember(String userId) {
return (Member) hashOperations.get(HASH_NAME, userId);
}
}

View File

@@ -12,4 +12,8 @@ spring:
kafka: # stream.kafka 는 해당 서비스를 카프카에 바인딩
binder:
zkNodes: localhost # zkNodes, brokers 는 스트림에게 카프카와 주키퍼의 네트워크 위치 전달
brokers: localhost
brokers: localhost
#redis
redis:
server: redis
port: 6379