feign调用报错status 404

发布时间 2023-05-04 22:29:57作者: 乐之者v

feign调用报错status 404

使用feign,报错:FeignException: status 404。如下:

Caused by: feign.FeignException: status 404 reading #; 
	at feign.FeignException.errorStatus(FeignException.java:62)
	at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91)
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)
	at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108)
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)

Debug

跟踪查看方法栈中的方法,报错代码 SynchronousMethodHandler类的 executeAndDecode()方法 如下:

可以看到 发送了一个请求,获取响应。可以在 response = this.client.execute(request, this.options); 打个断点,看一下

request请求的url是什么。

    Object executeAndDecode(RequestTemplate template) throws Throwable {
        Request request = this.targetRequest(template);
        if (this.logLevel != Level.NONE) {
            this.logger.logRequest(this.metadata.configKey(), this.logLevel, request);
        }

        long start = System.nanoTime();

        Response response;
        try {
        	//发送请求,获取响应
        	//可以在这里打个断点,看一下request请求的url是什么。
            response = this.client.execute(request, this.options);
            response.toBuilder().request(request).build();
        } catch (IOException var15) {
            if (this.logLevel != Level.NONE) {
                this.logger.logIOException(this.metadata.configKey(), this.logLevel, var15, this.elapsedTime(start));
            }

            throw FeignException.errorExecuting(request, var15);
        }
    }

调试的示例如下,可以在调试中发现 request 中的 url是什么:

错误原因:

url不对的原因有可能是:

  • 服务消费者调用的url,跟服务提供者的url不一样

仔细检查一下url的路径。

  • 服务消费者调用时,@FeignClient注解的 name/value 属性写错了,与 服务提供者url的contextPath(上下文)不一致。

@FeignClient注解的 name/value属性,会指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现。

比如:服务提供者的url是 /user/detail,而服务消费者使用feign时,@FeignClient注解的 name/value属性指定为 my-service,那么服务消费者调用的url就是 /my-service/user/detail,两边不一致。

name/value属性写错了,就会报错404。

解决方法:

  • 修正url,让服务消费者调用的url,与服务提供者的url保持一致。

仔细检查下 @RequestMapping 组成的 url,是否正确。

  • 修正 @FeignClient注解的 name/value属性,让url保持一致。

仔细检查下服务消费者的 @FeignClient注解的 name/value属性, 是否与服务提供者的contextPath(上下文)一致。

  • 如果还是不行,通过 @FeignClient注解的 url 属性,直接指定 url。

比如用properties文件配置(或者配置中心配置)一个变量 my.url 指定 url,不同的环境可以配置不同的url。

变量 my.url 后面的:表示默认值。

直接指定url,就不会受到 @FeignClient注解的 name/value属性的影响。

如下 :

@FeignClient(name = "my-service", url = "${my.url:localhost:5001/user/}" )
public interface MyServiceApi {

    @PostMapping("/detail")
    void send(@RequestBody Body body);

}

参考资料:

https://blog.csdn.net/sinat_38332832/article/details/119814245