Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions client/external/mathrank-school/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.client.RestClient;

import io.github.resilience4j.ratelimiter.annotation.RateLimiter;
import jakarta.validation.constraints.NotNull;
import kr.co.mathrank.client.config.RestClientResponseDecorator;
import kr.co.mathrank.client.config.TimeoutConfiguredClient;
Expand All @@ -19,7 +20,9 @@
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class SchoolClient extends TimeoutConfiguredClient {
@Value("${neice.school.key:}")
Expand All @@ -39,6 +42,7 @@ public SchoolClient(final SchoolClientProperties schoolClientProperties) {
}

@Deprecated
@RateLimiter(name = "neiceApi", fallbackMethod = "fallBackSchoolInfo")
public Optional<SchoolInfo> getSchool(final String type, final String schoolCode) {
if (schoolCode == null || schoolCode.isBlank()) {
return Optional.empty();
Expand All @@ -58,11 +62,18 @@ public Optional<SchoolInfo> getSchool(final String type, final String schoolCode
return response.getSchoolInfo().isEmpty() ? Optional.empty() : Optional.of(response.getSchoolInfo().getFirst());
}

// fall back - #getSchool
private Optional<SchoolInfo> fallBackSchoolInfo(final String type, final String schoolCode, final Throwable t) {
log.warn("[SchoolClient.fallBackSchoolInfo] fallback called - type: {}, schoolCode: {}", type, schoolCode, t);
return Optional.empty();
}

public ClientResponse<Optional<SchoolInfo>> getSchoolResponse(final String type, final String schoolCode) {
return responseDecorator.wrap(() -> getSchool(type, schoolCode));
}

@Deprecated
@RateLimiter(name = "neiceApi", fallbackMethod = "fallBackGetSchools")
public SchoolResponse getSchools(String type, Integer pageIndex, Integer pageSize, String schoolName) {
return restClient.get()
.uri(uriBuilder -> uriBuilder.path("/hub/schoolInfo")
Expand All @@ -75,6 +86,11 @@ public SchoolResponse getSchools(String type, Integer pageIndex, Integer pageSiz
.body(SchoolResponse.class);
}

private SchoolResponse fallBackGetSchools(String type, Integer pageIndex, Integer pageSize, String schoolName, Throwable t) {
log.warn("[SchoolClient.fallBackGetSchools] fallback called - type: {}, pageIndex: {}, pageSize: {}, schoolName: {}", type, pageIndex, pageSize, schoolName, t);
return new SchoolResponse(null);
}

public ClientResponse<SchoolResponse> getSchoolsResponse(String type, Integer pageIndex, Integer pageSize, String schoolName) {
return responseDecorator.wrap(() -> this.getSchools(type, pageIndex, pageSize, schoolName));
}
Expand All @@ -88,6 +104,7 @@ public ClientResponse<SchoolResponse> getSchoolsResponse(String type, Integer pa
* @return 해당 도시의 학교 정보가 담긴 응답 객체
*/
@Deprecated
@RateLimiter(name = "neiceApi", fallbackMethod = "fallBackGetSchoolsByCityName")
public SchoolResponse getSchoolsByCityName(String type, String cityName) {
return restClient.get()
.uri(uriBuilder -> uriBuilder.path("/hub/schoolInfo")
Expand All @@ -101,6 +118,11 @@ public SchoolResponse getSchoolsByCityName(String type, String cityName) {
.body(SchoolResponse.class);
}

private SchoolResponse fallBackGetSchoolsByCityName(String type, String cityName, Throwable t) {
log.warn("[SchoolClient.fallBackGetSchoolsByCityName] fallback called - type: {}, cityName: {}", type, cityName, t);
return new SchoolResponse(null);
}

public ClientResponse<SchoolResponse> getSchoolsByCityNameResponse(String type, String cityName) {
return responseDecorator.wrap(() -> this.getSchoolsByCityName(type, cityName));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
@SpringBootTest(properties = """
client.school.read-timeout-seconds=10
client.school.connection-timeout-seconds=10
resilience4j.ratelimiter.instances.neiceApi.limit-refresh-period=1s
resilience4j.ratelimiter.instances.neiceApi.limit-for-period=100
resilience4j.ratelimiter.instances.neiceApi.timeout-duration=1s
""")
class SchoolClientTest {
@Autowired
Expand Down