SpringCloud feign无法注入接口的问题
SpringCloud feign无法注入接口
接口:
package cn.mn.app.service; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @FeignClient(name="sc-provider") public interface IGoodsClient { @RequestMapping(value = "/goods/query",method = RequestMethod.GET) String query(); }
controller
package cn.mn.app.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import cn.mn.app.service.IGoodsClient; @RestController @RequestMapping("/goods") public class GoodsController { @Autowired private IGoodsClient goodsClient; @GetMapping("/q") public String query(){ return goodsClient.query(); } }
这里把接口直接注入。
启动类:
package cn.mn.app.application; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication(scanBasePackages = { "cn.mn.app.controller" }) @EnableDiscoveryClient @EnableFeignClients public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); } // @LoadBalanced // @Bean // RestTemplate restTemplate(){ // return new RestTemplate(); // } }
启动报错,无法注入IGoodsClient。
原因是没有使用@EnableFeignClients扫描指定包。
修改启动类
package cn.mn.app.application; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication(scanBasePackages = { "cn.mn.app.controller" }) @EnableDiscoveryClient @EnableFeignClients("cn.mn.app.service") public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); } // @LoadBalanced // @Bean // RestTemplate restTemplate(){ // return new RestTemplate(); // } }
正常。
springcloud中feign调用常见问题
注: 本文基于Springcloud Edgware版本
Feign调用首次失败问题
1、Feign简介
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。
它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解,Feign 整合了Ribbon。
2、原因分析
Feign整合Hystrix组件后,Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入自定义的fallback代码,往往首次请求会比较慢(由于Ribbon是懒加载的,在首次请求时,才会开始初始化相关类),这个响应时间可能就大于1秒了,出现调用失败
3、解决方案
(1)增加Hystrix的超时时间,默认为1s
hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 10000
(2)配置饿加载(推荐使用)
ribbon: eager-load: clients: project1,project2 enabled: true
(3)禁用Hystrix超时(不推荐使用)
hystrix: command: default: execution: timeout: enabled: false
(4)为fegin全局禁用hystrix(此种方式较为极端,不建议使用)
feign: hystrix: enabled: false
Feign整合Hystrix之后日志显示问题
1、解决方案
Feign整合Hystrix之后,当调用失败会走fallback逻辑,造成日志不显示,往往我们需要看日志分析原因,进行故障排查。
(1)在application中配置,开区Feign对Hystrix的支持
feign: hystrix: enabled: true
(2)编写Feigin的客户端以及回滚类
在客户端FeignClient注解配置相对应的回滚类,fallbackFactory = LogFallbackFactory.class,name属性为注册中心其他服务的名称
/** * @description:fegin调用客户端 * * @author: LUOYUAN * @date: 2019-08-07-10:33 * @function: */ @FeignClient(name = "eureka-log",path = "/api/log",fallbackFactory = LogFallbackFactory.class) public interface LogFeignClient { @RequestMapping(value = "list", method = RequestMethod.GET) public String logList(); }
/** * @description:feign调用失败逻辑 * @author: LUOYUAN * @date: 2019-08-07-10:34 * @function: */ @Slf4j public class LogFallbackFactory implements FallbackFactory<LogFeignClient> { @Override public LogFeignClient create(Throwable throwable) { return new LogFeignClient() { @Override public String logList() { log.info("query log fallback reason was:",throwable); return null; } }; } }
调用失败会打印异常信息
query log fallback reason was:
feign.RetryableException: Connection refused: connect executing GET http://eureka-log/api/log/list
at feign.FeignException.errorExecuting(FeignException.java:132)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:113)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78)
at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:109)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
Feign调用时定义的fallback不生效
Springcloud Dalston之前得到版本,Feign默认已经开启了Hystrix熔断器,从Dalaton版本开始,默认关闭Hystrix支持,需手动开启,在application.yaml中添加如下配置
feign: hystrix: enabled: true
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java之idea @NotNull @Nullable 注解使用
这篇文章主要介绍了Java之idea @NotNull @Nullable 注解使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-01-01
最新评论