前言
说实话,OpenFeign太简单了,不太想写,但是也有一些细节值得注意,所以最后我还是写了这一篇博客;
文章目录
一 . 关于你需要知道的OpenFeign知识
- OpenFeign出的比Ribbon晚,比Ribbon更好用,但是它的底层就是采用的Ribbon;
- OpenFeign一般写在消费端,消费端要调用它的话,直接@Autowired注入即可;
比如我A服务要远程调用B服务,那么就在A服务中写关于B服务的OpenFeign接口,这里容易搞错,一定要注意了; - OpenFeign默认就带有负载均衡
- OpenFeign是发送的Http请求来调用远程服务,关于Http请求其实有很多知识,如果不清楚的话,可以去学习一下java网络编程还有netty,同时笔者写到这里也默默的复习了一遍;
二. OpenFeign的基础使用
1、pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.、主启动类上加上@EnableFeignClients注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class DataApplication {
public static void main(String[] args) {
SpringApplication.run(DataApplication.class, args);
}
}
3、新建OpenFeign的接口
假如我要A服务中远程调用B服务的接口,那么我就要在A服务中新建OpenFeign接口:
@Service
@FeignClient(value = "B服务的服务名称", fallback = FeignServiceImpl.class)
public interface OpenFeignService{
@GetMapping("info/{id}")
public ResponseResult B服务的接口(@PathVariable("id") Long id);
}
注意:@FeignClient注解中还有一个属性是fallback,你千万不要把这个fallback属性跟Sentinel中@SentinelResource的fallback属性搞混了;
这里的fallback属性是OpenFeign用来定义容错的处理类,当远程调用接口失败或超时时,会调用这个兜底类中的逻辑,这个处理类必须实现当前这个feign接口,并且在处理类中写好兜底的返回逻辑;
4. 编写为OpenFeignService兜底的容错实现类
@Component(这个实现类也必须注入spring,但是我目前并不知道为什么一定要注入)
public class FeignServiceImpl implements OpenFeignService{
@Override
public ResponseResult B服务的接口(Long id){
return new ResponseResult();
}
}
5. 直接在你想用的地方注入OpenFeignService就可以调用了
三、OpenFeign的超时控制
注意:OpenFeign客户端默认等待的时间是1秒钟,但是如果服务端耗时超过1秒,则会直接报错,为了避免这种情况,我们需要设置feign客户端的超时控制;
在这里我需要解释一下:OpenFeign明显就是一个CS架构,你在A服务启动类上加了@EnableFeignClients注解,我猜测它底层就将你的A服务当成了OpenFeign的服务端,A服务远程调用B服务,中间肯定会通过tcp协议发送请求给OpenFeign的服务端,OpenFeign服务端再将请求转发给B服务,B服务通过处理完成后,通过Socket将结果返回给OpenFeign服务端,服务端接收消息后再通过Socket发送给A服务,最后再经过一次Http协议解析,A服务就收到了响应; 所以这里OpenFeign客户端的默认等待时间1秒就能理解清楚了;
1. 解决办法:
由于OpenFeign底层是Ribbon,所以超时时间是由Ribbon来控制,我们在yml中就能配置超时时间;
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000
注意:这里ribbon是跟spring同一级的,并且这个配置是要写在A服务中的,也就是写在调用方;
四、OpenFeign的日志打印功能
1、OpenFeign日志功能的日志级别:
① NONE:这是默认的日志级别,也就是OpenFeign不显示任何日志;
② BASIC:仅仅记录请求方法,URL,响应状态码以及执行时间;
③ HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
④ FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文,以及元数据
2、如何开启OpenFeign的日志功能:
第一步:写一个配置类:将你想要的日志级别注入到spring容器中即可,OpenFeign的日志级别每一个都是一个对象,你直接返回即可,你返回哪一个,那么OpenFeign就是开启的就是哪个级别
@Bean
Logger.Level feignLog(){
return Logger.Level.FULL;
}
第二步:yml配置(感觉有用,但是用处又不是很大,我就不写了,需要的话百度)
五、Sentinel整合OpenFeign
到了这一步,我就默认你已经学会了Sentinel与OpenFeign,你除开正常配置OpenFeign与Sentinel外,你还需要在yml额外配置Sentinel对openFeign的支持:
yml配置激活Sentinel对OpenFeign的支持
feign:
sentinel:
enabled: true
注意:feign是跟spring同一级,ribbon跟spring也是同一级,所以feign跟ribbon同一级就可以理解了;