小左的博客 2025-01-06 11:11 采纳率: 0%
浏览 55

openFeign FallbackFactory无效

问题:
我为远程调用配置了一个openFeign FallbackFactory,但是当远程服务异常并返回500时它不起作用。

报错信息
response:

{
  "timestamp": "2024-12-31T08:44:53.131+00:00",
  "status": 500,
  "error": "Internal Server Error",
  "path": "/demo/port"
}

控制台报错信息:
2024-12-31T16:44:53.129+08:00 ERROR 68881 --- [material-audience] [nio-7941-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: feign.FeignException$InternalServerError: [500] during [GET] to [http://material-tsp/health/port\] [DemoClient#port()]: [{"timestamp":"2024-12-31T08:44:53.125+00:00","status":500,"error":"Internal Server Error","path":"/health/port"}]] with root cause

feign.FeignException$InternalServerError: [500] during [GET] to [http://material-tsp/health/port\] [DemoClient#port()]: [{"timestamp":"2024-12-31T08:44:53.125+00:00","status":500,"error":"Internal Server Error","path":"/health/port"}] at feign.FeignException.serverErrorStatus(FeignException.java:259) ~[feign-core-13.3.jar:na] at feign.FeignException.errorStatus(FeignException.java:206) ~[feign-core-13.3.jar:na]

系统配置
pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.3</version>
    </parent>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>2023.0.3</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

DemoClient:

package com.link.code.materialaudience.openfeign;

import com.link.code.materialaudience.openfeign.fallback.RemoteDemoFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "material-tsp",fallbackFactory = RemoteDemoFallbackFactory.class)
public interface DemoClient {

    @GetMapping("health/port")
    String port();
}

RemoteDemoFallbackFactory:

package com.link.code.materialaudience.openfeign.fallback;

import com.link.code.materialaudience.openfeign.DemoClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class RemoteDemoFallbackFactory implements FallbackFactory<DemoClient> {
    @Override
    public DemoClient create(Throwable cause) {
        return new DemoClient() {
            @Override
            public String port() {
                log.info("invoke service fail:{},",cause.toString(),cause);
                return "exception---null";
            }
        };
    }
}

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2025-01-06 11:15
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    当你遇到 OpenFeignFallbackFactory 在处理 500 Internal Server Error 时无效的问题时,可以按照以下步骤进行排查和解决。

    排查步骤

    1. 检查依赖版本

      • 确保 spring-cloud-dependenciesspring-cloud-starter-openfeign 的版本兼容。
    2. 确保 FallbackFactory 实现正确

      • 确认 FallbackFactory 实现类的注解和方法签名是否正确。
    3. 检查配置文件

      • 确保 application.ymlapplication.properties 文件中已经启用了 Feign 客户端。
    4. 日志级别调整

      • 调整日志级别,查看是否有更详细的错误信息。

    解决方案

    1. 检查依赖版本

    确保你的 pom.xml 文件中的依赖版本是正确的,并且是兼容的。例如:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.3</version>
    </parent>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2023.0.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
    

    2. 确保 FallbackFactory 实现正确

    确保 RemoteDemoFallbackFactory 类实现了 FallbackFactory 并且方法签名正确。你的实现看起来是正确的,但可以稍作调整以确保一致性:

    package com.link.code.materialaudience.openfeign.fallback;
    
    import com.link.code.materialaudience.openfeign.DemoClient;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.cloud.openfeign.FallbackFactory;
    import org.springframework.stereotype.Component;
    
    @Slf4j
    @Component
    public class RemoteDemoFallbackFactory implements FallbackFactory<DemoClient> {
        @Override
        public DemoClient create(Throwable cause) {
            return new DemoClient() {
                @Override
                public String port() {
                    log.info("Invoke service failed: {}", cause.getMessage());
                    return "exception---null";
                }
            };
        }
    }
    

    3. 检查配置文件

    确保你的 application.ymlapplication.properties 文件中启用了 Feign 客户端:

    # application.yml
    spring:
      application:
        name: material-audience
      cloud:
        openfeign:
          client:
            config:
              default:
                connectTimeout: 5000
                readTimeout: 5000
    

    4. 调整日志级别

    增加日志级别以获取更多调试信息:

    logging:
      level:
        com.link.code.materialaudience.openfeign: DEBUG
        org.springframework.cloud.openfeign: DEBUG
    

    代码示例

    确保你的 DemoClient 接口定义如下:

    package com.link.code.materialaudience.openfeign;
    
    import com.link.code.materialaudience.openfeign.fallback.RemoteDemoFallbackFactory;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @FeignClient(value = "material-tsp", fallbackFactory = RemoteDemoFallbackFactory.class)
    public interface DemoClient {
    
        @GetMapping("health/port")
        String port();
    }
    

    通过以上步骤,你应该能够解决 OpenFeignFallbackFactory 在处理 500 Internal Server Error 时无效的问题。如果问题仍然存在,请检查是否有其他配置或环境因素影响。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月6日