1、案例分析
在常日迭代中发现在调用三方查询用户卡列表的接口有接近4s的耗时。而在支付过程中很容易导致接口的超时。当时排查到对应的问题以后,秉着最小改动原则使用外观模式包装一层。
2、oldService
public interface ICardAssetService {
List<CardDTO> queryUserCardAsset();
}
@Service
public class CardAssetService implements ICardAssetService {
@Override
public List<CardDTO> queryUserCardAsset() {
//todo 这边直接调用三方服务
ArrayList<CardDTO> cardDTOS = new ArrayList<>();
CardDTO cardDTO = new CardDTO();
cardDTOS.add(cardDTO);
System.out.println("调用三方接口成功");
return cardDTOS;
}
}
@SpringBootTest
class ProjectApplicationTests {
// 最开始外部服务使用的是@Autowired注解
@Autowired
private ICardAssetService cardAssetService;
@Test
void contextLoads() {
cardAssetService.queryUserCardAsset();
}
}
结果:
3、新增 CacheCardAssetService
@Service("cardAssetService")
public class CacheCardAssetService implements ICardAssetService {
@Autowired
private ICardAssetService cardAssetService;
@Override
public List<CardDTO> queryUserCardAsset() {
// 1. 缓冲中查询卡信息
List<CardDTO> cardDTOS = queryCardAssetFromCache();
// 2. 未命中缓存则调用外部服务查询
if (CollectionUtils.isEmpty(cardDTOS)) {
cardDTOS = cardAssetService.queryUserCardAsset();
setCardAssetToCache(cardDTOS);
}
return cardDTOS;
}
private List<CardDTO> queryCardAssetFromCache() {
ArrayList<CardDTO> cardDTOS = new ArrayList<>();
cardDTOS.add(new CardDTO());
return cardDTOS;
}
private void setCardAssetToCache(List<CardDTO> cardDTOS) {
System.out.println("设置成功");
}
}
package com.coding.project;
import javax.annotation.Resource;
import com.coding.project.card.service.ICardAssetService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ProjectApplicationTests01 {
@Resource
private ICardAssetService cardAssetService;
@Test
void contextLoads() {
cardAssetService.queryUserCardAsset();
}
}
\
注意的是我们在注入bean对象时,使用的是@Resource 。而在cacheService使用了@Autowired注解。外部服务所有的注入方式都需要由@Autowired改为@Resource 的方式注入bean。
巧妙地运用Autowired使用的是byType的方式注入。Resource使用的是byName的方式注入