SpringCloud feign无法注入接口的问题
作者:要争气 发布时间:2021-09-04 03:26:29
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
来源:https://lwyzq.blog.csdn.net/article/details/81747191


猜你喜欢
- 本文实例讲述了C#实现简单合并word文档的方法。分享给大家供大家参考。具体如下:using System;using System.Col
- 一、注册表操作简介Registry类,RegistryKey类提供了操作注册表的接口RegistryValueKind:用于指定操作注册表的
- Unity是不识别Gif格式图的,需要我们使用c#将gif里多帧图转化为Texture2D格式。需要使用System.Drawing.dll
- 可能有些同学不明白,为啥要图片反转(不是旋转哦),我们在游戏开发中,为了节省图片资源(空间) 有可能会使用到图片反转,例如,一个人物图片,面
- 一.模拟问题最近在公司遇到一个问题,挂号系统是做的集群,比如启动了两个相同的服务,病人挂号的时候可能会出现同号的情况,比如两个病人挂出来的号
- 关于springmvc上传图片的方法小编给大家整理了两种方法,具体内容如下所示:第一种:(放在该项目下的物理地址对应的位置)a. 路径写法:
- String和StringBuilder和StringBuffer,这三个都是值得深究一翻的,可能很多人会说,实在不行的话,都全部用Stri
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下首先来看一下我们要做成的而效果:主页面要显示一个view
- Java7引入了Fork Join的概念,来更好的支持并行运算。顾名思义,Fork Join类似与流程语言的分支,合并的概念。也就是说Jav
- 本文实例讲述了Android编程入门之HelloWorld项目目录结构。分享给大家供大家参考,具体如下:我们介绍了如何搭建Android开发
- 本文实例为大家分享了C# picturebox实现画图功能的具体代码,供大家参考,具体内容如下在Form上添加 一个pictureBox,一
- 现如今的APP各式各样,同样也带来了各种需求,一个下拉刷新都能玩出花样了,前两天订饭的时候不经意间看到了“百度外卖”的下拉刷新,今天的主题就
- 目录概述1 技术工具2 构建Spring Boot工程3 开始编写测试和代码1 Controller2 Service3 Repositor
- 1. 前言Spring最重要的一个概念当属Bean了,我们写的Controller、Service、Dao凡是加了对应注解交给Spring管
- Java GC 机制与内存分配策略详解收集算法是内存回收的方 * ,垃圾收集器是内存回收的具体实现自动内存管理解决的是:给对象分配内存 以及
- spring cloud 配置中心native配置1、pom文件添加依赖<dependency> &l
- 在使用xutils时遇到不能添加以来的问题,花了很长时间终于解决,网上添加依赖的方法很多,在此针对个人出现的问题作下笔记。我本想使用jar包
- package com.huateng.readcsv;import java.io.BufferedReader;import java.
- 目录图标准备BottomNavigationBar 简介构建项目页面结构简化入口代码复用最终实现的结果如上图所示,顶部共用一个导航栏,底部有
- 什么是OKHttp一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进