使用:
踩过的坑:
feign.FeignException$NotFound: status 404 reading 错误原因分析
1、路径错误
在服务消费者断采用GetMapping方式,如
@GetMapping(“knowledge/metadata/delete/{mdcode}”)
在服务提供者端,用
@RestController
@RequestMapping(“knowledge”)
public class KnowledgeGraphController {
@RequestMapping(“metadata/delete/{mdcode}”)
(实现方法)
}
服务消费者端,一定要加上knowledge呀喂
超时控制:
默认为1s,但是一些特殊任务就是时间比较长,所以我们需要设置超时控制:
# 设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间 主要是这个
ReadTimeout: 4000
# 指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 4000
对于Ribbon和Feign和OpenFeign三者的关系和区别:
Ribbon:
是Netfix开源的基于HTTP和TCP等协议负载均衡组件
Ribbon 可以用来做客户端负载均衡,调用注册中心的服务
Ribbon的使用需要代码里手动调用目标服务
Feign:
Feign是Spring Cloud组件中的一个轻量级RESTful
的HTTP服务客户端
Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务Feign本身不支持Spring MVC的注解,它有一套自己的注解
OpenFeign:
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,
并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
feign
不是一个中间件,feign
是spring cloud
组件中的一个轻量级restful
的http
服务客户端。其作用是简化接口的调用,将**http
调用转为rpc
**调用,让调用远程接口像同进程应用内的接口调用一样简单。
OpenFeign日志配置
- 日志级别
- NONE: 默认的,不显示任何日志;
- BASIC:仅记录请求方法、URL、响应状态码及执行时间
- HEADERS:除了BASIC中定义的信息之外还有请求和响应的头信息
- FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据
配置类
@Configuration public class FeignConfig { @Bean feign.Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
yml配置
logging: level: # feign日志以什么级别监控哪个接口 com.heyufu.springcloud.feign.Service7002: debug
错误日志:
OpenfeginFactory
捕获降级之后的错误信息
@FeignClient(fallbackFactory = HystrixClientFactory.class)
实现 FallbackFactory 接口
@Component
public class HelloFallbackFactory implements FallbackFactory<HelloService>{
@Override
public HelloService create(Throwable e) {
System.out.println("错误信息:"+e.getMessage());
return new HelloFallback() {
@Override
public String hiService(String name) {
return "error";
}
@Override
public String hiService1(String name) {
return "error1";
}
};
}
}
Feign的底层原理:
- 首先openFeign通过包扫描将所有被@FeignClient注解注释的接口扫描出来,并且为每个接口注册一个FeignClientBean实例,会生成一个代理对象 注册到IOC容器中,会为代理的每一个Method 都生成一个 MethodHandler ,通过代理的方式去调用服务
- 默认的调用处理器: FeignInvcocationHandler
里面有一个Map类型映射,方法名,方法处理器
当我们用代理去调用方法的时候,会根据方法名找到具体对应的方法处理器
真正的调用是方法处理器在执行 invoke 方法
在执行methodHandler.invoke 的时候需要根据RequestMapping 的参数转换为request请求封装到RequestBean 构造成一个RestTemplate 通过调用 MethodHandler 的invoke方法 在invoke方法执行的时候会先通过负载均衡找到一台远程的服务器,然后用feign.client真正的发送请求
https://ldbmcs.gitbook.io/java/wei-fu-wu/spring-cloud/spring-cloud-openfeign
**