【OpenFeign】

前言

说实话,OpenFeign太简单了,不太想写,但是也有一些细节值得注意,所以最后我还是写了这一篇博客;


一 . 关于你需要知道的OpenFeign知识

  1. OpenFeign出的比Ribbon晚,比Ribbon更好用,但是它的底层就是采用的Ribbon;
  2. OpenFeign一般写在消费端,消费端要调用它的话,直接@Autowired注入即可;
    比如我A服务要远程调用B服务,那么就在A服务中写关于B服务的OpenFeign接口,这里容易搞错,一定要注意了;
  3. OpenFeign默认就带有负载均衡
  4. 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同一级就可以理解了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值