-
Notifications
You must be signed in to change notification settings - Fork 45
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
setup redis as cache and SNS subscriber to support CDN
- Loading branch information
Showing
12 changed files
with
151 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package com.myapp.config; | ||
|
||
import org.springframework.beans.factory.annotation.Autowired; | ||
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.RedisCacheManager; | ||
import org.springframework.data.redis.core.RedisTemplate; | ||
|
||
/** | ||
* I want to use {@link org.springframework.cloud.aws.cache.config.annotation.EnableElastiCache} | ||
* which supports cluster for prod environment. But it has a problem shown on https://github.com/spring-cloud/spring-cloud-aws/issues/93 . | ||
* As a result, I use a single redis server through RedisCacheManager. | ||
*/ | ||
@Configuration | ||
@EnableCaching | ||
public class CacheConfig { | ||
|
||
@Bean | ||
@Autowired | ||
public CacheManager cacheManager(RedisTemplate<Object, Object> redisTemplate) { | ||
return new RedisCacheManager(redisTemplate); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
34 changes: 34 additions & 0 deletions
34
src/main/java/com/myapp/controller/AssetManifestSubscriber.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package com.myapp.controller; | ||
|
||
import com.myapp.service.AssetManifestService; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.web.bind.annotation.RequestBody; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RequestMethod; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
@RestController | ||
@RequestMapping("/sns/Micropost-AssetManifest-Updated") | ||
public class AssetManifestSubscriber { | ||
|
||
@SuppressWarnings("UnusedDeclaration") | ||
private static final Logger logger = LoggerFactory.getLogger(AssetManifestSubscriber.class); | ||
|
||
private final AssetManifestService assetManifestService; | ||
|
||
@Autowired | ||
public AssetManifestSubscriber(AssetManifestService assetManifestService) { | ||
this.assetManifestService = assetManifestService; | ||
} | ||
|
||
|
||
@RequestMapping(method = RequestMethod.POST) | ||
public void handleNotificationMessage(@RequestBody String body) { | ||
logger.info(body); | ||
assetManifestService.invalidateCache(); | ||
} | ||
|
||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.myapp.dto; | ||
|
||
import java.util.HashMap; | ||
import java.util.Optional; | ||
|
||
public class AssetManifest extends HashMap<String, String> { | ||
@Override | ||
public String get(Object key) { | ||
return Optional.ofNullable(super.get(key)).orElse(key.toString()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
package com.myapp.service; | ||
|
||
import com.fasterxml.jackson.databind.ObjectMapper; | ||
import com.myapp.config.AppConfig; | ||
import com.myapp.dto.AssetManifest; | ||
import okhttp3.OkHttpClient; | ||
import okhttp3.Request; | ||
import okhttp3.Response; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.cache.annotation.CacheEvict; | ||
import org.springframework.cache.annotation.Cacheable; | ||
import org.springframework.stereotype.Service; | ||
|
||
import java.io.IOException; | ||
|
||
@Service | ||
public class AssetManifestService { | ||
|
||
@SuppressWarnings("unused") | ||
private static final Logger logger = LoggerFactory.getLogger(AssetManifestService.class); | ||
|
||
private final AppConfig appConfig; | ||
|
||
@Autowired | ||
public AssetManifestService(AppConfig appConfig) { | ||
this.appConfig = appConfig; | ||
} | ||
|
||
@Cacheable("assetManifest") | ||
public AssetManifest fetchAssetManifest() { | ||
final OkHttpClient client = new OkHttpClient(); | ||
final Request request = new Request.Builder() | ||
.url(appConfig.getAssetManifestUrl()) | ||
.build(); | ||
try { | ||
final Response response = client.newCall(request).execute(); | ||
final String jsonStr = response.body().string(); | ||
return new ObjectMapper().readValue(jsonStr, AssetManifest.class); | ||
} catch (IOException e) { | ||
logger.info("manifest does not exist. fallback to default assets."); | ||
return new AssetManifest(); // fallback | ||
} | ||
} | ||
|
||
@CacheEvict("assetManifest") | ||
public void invalidateCache() { | ||
logger.info("the cache of asset manifest was invalidated."); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters