feign name指定服务调用无效问题及解决
作者:二掌柜,酒来!
文章主要介绍了FeignClient注解的常用属性,并通过一个具体的例子说明了为什么某个Feign调用需要使用url指定路径才能访问,最后,文章给出了解决办法,即使用path属性指定前缀
背景
在做三方的外接接口的时候,出现了非常奇怪的一个问题。
某个feign调用,必须使用 url
指定路径才能做到访问,因为明明使用name
属性就可以指定服务了。
这就非常奇怪了~~~~
@FeignClient(name = "outerService", url = "${third.url}",configuration = FeignConfig.class, fallbackFactory = OuterServiceFallbackFactory.class) // @FeignClient(value = "outerService",configuration = FeignConfig.class, fallbackFactory = OuterServiceFallbackFactory.class, decode404 = true) @Service public interface outerServiceClientFeign extends BafooCommonApi { }
涨知识了
声明接口时在代码中通过@Resource注入容器之后即可使用。
@FeignClient注解的常用属性如下:
value
/name
:value和name的作用一样,用于指定FeignClient的名称;如果没有配置url,而且项目使用了Eureka 、nacos或者ribbon,name属性会作为微服务的名称,用于服务发现。反之,只是一个名称。此属性和 spring.application.name 对应。url
:一般用于调试,作用是指定@FeignClient调用的API地址,而非从服务中心获取。url
和name
都可以使用占位符,比如:@FeignClient(name = “your.feign.name",url="${your.feign.url}”);decode404
:当发生http 404错误时,如果该字段为true,会调用decoder进行解码;否则,抛出FeignException。configuration
:Feign配置类,作用是自定义Feign的Encoder、Decoder、LogLevel、Contract。fallback
:定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口。fallbackFactory
:工厂类,用于生成fallback类实例,实现每个接口通用的容错逻辑,减少重复的代码。path
:定义当前FeignClient的统一前缀。contextId
:为某个接口设置单独的超时,与与config里的属性对应。
原因
三方服务的配置文件里面加上了,前缀路径
servlet: context-path: /outer
这就导致,feign调用时,拼接的路径少了 一个前缀 /outer
。
解决办法
使用 path
属性,指定前缀。
@FeignClient(value = "outerService",path = "/outer",configuration = FeignConfig.class, fallbackFactory = OuterServiceFallbackFactory.class, decode404 = true)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。