@Service public class ProxyService { String domain = "example.com"; private final static Logger logger = LogManager.getLogger(ProxyService.class); @Retryable(exclude = { HttpStatusCodeException.class}, include = Exception.class, backoff = @Backoff(delay = 5000, multiplier = 4.0), maxAttempts = 4) public ResponseEntity<String> processProxyRequest(String body, HttpMethod method, HttpServletRequest request, HttpServletResponse response, String traceId) throws URISyntaxException { ThreadContext.put("traceId", traceId); String requestUrl = request.getRequestURI(); //log if required in this line URI uri = new URI("https", null, domain, -1, null, null, null); // replacing context path form urI to match actual gateway URI uri = UriComponentsBuilder.fromUri(uri) .path(requestUrl) .query(request.getQueryString()) .build(true).toUri(); HttpHeaders headers = new HttpHeaders(); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); headers.set(headerName, request.getHeader(headerName)); } headers.set("TRACE", traceId); headers.remove(HttpHeaders.ACCEPT_ENCODING); HttpEntity<String> httpEntity = new HttpEntity<>(body, headers); ClientHttpRequestFactory factory = new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()); RestTemplate restTemplate = new RestTemplate(factory); try { ResponseEntity<String> serverResponse = restTemplate.exchange(uri, method, httpEntity, String.class); HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.put(HttpHeaders.CONTENT_TYPE, serverResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE)); logger.info(serverResponse); return serverResponse; } catch (HttpStatusCodeException e) { logger.error(e.getMessage()); return ResponseEntity.status(e.getRawStatusCode()) .headers(e.getResponseHeaders()) .body(e.getResponseBodyAsString()); } } @Recover public ResponseEntity<String> recoverFromRestClientErrors(Exception e, String body, HttpMethod method, HttpServletRequest request, HttpServletResponse response, String traceId) { logger.error("retry method for the following url " + request.getRequestURI() + " has failed" + e.getMessage()); logger.error(e.getStackTrace()); throw new RuntimeException("There was an error trying to process you request. Please try again later"); } } 主类: @SpringBootApplication @EnableRetry public class ProxyAppApplication { public static void main(String[] args) { SpringApplication.run(ProxyAppApplication.class, args); } } pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ashrithgn.example</groupId> <artifactId>proxyApp</artifactId> <version>0.0.1-SNAPSHOT</version> <name>proxyApp</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|