处理 spring 云负载平衡器中的自定义错误代码

Handling custom error code in spring cloud load balancer

在我当前的项目中,我们的一个微服务调用另一个微服务的 REST Api,在错误场景中它 returns 一个自定义 (469) 错误代码。

我在调用服务中使用了一个负载平衡的剩余模板,它抛出了一个 IllegalArgumentException 错误,因为 469 错误代码不存在于 HttpStatus 枚举中。

是否有解决此问题的解决方法,例如使用原始状态代码而不是将其转换为枚举?

java.lang.IllegalArgumentException: No matching constant for [469]
    at org.springframework.http.HttpStatus.valueOf(HttpStatus.java:547)
    at org.springframework.http.client.AbstractClientHttpResponse.getStatusCode(AbstractClientHttpResponse.java:33)
    at org.springframework.cloud.client.loadbalancer.ResponseData.<init>(ResponseData.java:68)
    at org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient.getClientResponse(BlockingLoadBalancerClient.java:120)
    at org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient.execute(BlockingLoadBalancerClient.java:94)
    at org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor.lambda$intercept(RetryLoadBalancerInterceptor.java:129)
    at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:329)
    at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:225)
    at org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor.intercept(RetryLoadBalancerInterceptor.java:79)
    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:93)
    at org.springframework.boot.actuate.metrics.web.client.MetricsClientHttpRequestInterceptor.intercept(MetricsClientHttpRequestInterceptor.java:86)
    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:93)
    at org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor.intercept(TracingClientHttpRequestInterceptor.java:69)
    at org.springframework.cloud.sleuth.instrument.web.client.LazyTraceClientHttpRequestInterceptor.intercept(LazyTraceClientHttpRequestInterceptor.java:51)
    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:93)
    at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:77)
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:776)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:670)

我认为我们可以使用拦截器来操纵来自下游服务的状态。

你试过了吗ClientHttpRequestInterceptor? Here is an example

已在 Spring 云 2021.0.2 及更高版本中修复 https://github.com/spring-cloud/spring-cloud-commons/issues/1066

要使用原始状态代码而不是转换为枚举,请添加以下内容 属性 spring.cloud.loadbalancer.use-raw-status-code-in-response-data: 真