분산캐싱 - 스프링 데이터 레포지토리 정의
This commit is contained in:
@@ -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
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 기반 호출이 수행되기 전 후킹되는 메서드
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -12,4 +12,8 @@ spring:
|
||||
kafka: # stream.kafka 는 해당 서비스를 카프카에 바인딩
|
||||
binder:
|
||||
zkNodes: localhost # zkNodes, brokers 는 스트림에게 카프카와 주키퍼의 네트워크 위치 전달
|
||||
brokers: localhost
|
||||
brokers: localhost
|
||||
#redis
|
||||
redis:
|
||||
server: redis
|
||||
port: 6379
|
||||
Reference in New Issue
Block a user