마이크로서비스 Schema 분리 설계 (테이블 분리, 외래키 참조관계, 조인, 데이터 정합성 보장)
Member 정보 LocalCaching
publicclassMemberNicknameApiController {
privatefinalMemberService memberService;
@ApiOperation(value = "닉네임 불러오기" , notes = "닉네임을 불러와서 다른 서비스에 바인딩 하기 위해서")
@GetMapping("/api/memberInfo/{userId}")
@Cacheable(key = "#userId" , cacheNames = "memberCaching")
publicMemberInfoResponseServerDto returnNickname(@PathVariable String userId){
log.info("호출");
if(memberService.getUserId(userId) ==null){
returnnull;
}
MemberInfoResponseServerDto memberInfo = memberService.getMemberInfo(userId);
returnmemberInfo;
}
@ApiOperation(value = "닉네임 불러오기" , notes = "닉네임을 불러와서 다른 서비스에 바인딩 하기 위해서")
@GetMapping("/api/memberInfo")
@Cacheable(cacheNames = "memberCaching")
publicList<MemberInfoResponseServerDto> returnNicknameList(){
log.info("호출");
List<MemberInfoResponseServerDto> memberInfos = memberService.getMemberInfos();
returnmemberInfos;
}
}
Client Service 끼리 통신하기 위해 만든 API
@Service
@RequiredArgsConstructor
@Slf4j
publicclassMemberService {
privatestatic finalStringAuthServerURL= "http://localhost:8100";
publicMemberInfoResponseServerDto getNicknameImage(String userId) {
RestTemplate restTemplate =newRestTemplate();
MemberInfoResponseServerDto memberInfo = restTemplate.getForObject(
AuthServerURL+"/internal/member/api/memberInfo/{userId}",
MemberInfoResponseServerDto.class, userId);
returnmemberInfo;
}
public List<MemberInfoResponseServerDto> getNicknameImages() {
RestTemplate restTemplate =newRestTemplate();
MemberInfoResponseServerDto[] memberInfos = restTemplate.getForObject(
AuthServerURL+"/internal/member/api/memberInfo",
MemberInfoResponseServerDto[].class);
assertmemberInfos !=null;
returnList.of(memberInfos);
}
}
MVC 에서는 RestTemplate 를 통해서 서비스간 통신을 한다.
Post 글을 List로 반환 할 때 Post 마다 memberInfo 호출 하는 것은 AuthServer 에 상당한 트래픽을 요구
이 경우에는 모든 memberInfo 를 가져와서 Blog서버에서 filter 처리를 하도록 하였음 ( 부하 분산을 위해서 , SELECT 문 1개)