文章目录
OpenFeign服务接口调用
总体概括图
概述
Feign概念
Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
Feign能干些什么
Feign旨在使编程java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化调用方法。
但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端来包装这些依赖的调用。
所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。
在Feign的实现下,我们只需要创建一个接口并使用注解方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方接口绑定,简化了使用Spring Cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon
利用Ribbon维护了Paymen的服务列表信息,并且通过轮询实现了客户端负载均衡。
而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单实现了服务调用。
OpenFeign使用步骤
新建cloud-consumer-feign-order80
POM
YML
主启动
这里不用加@EnableDiscoveryClient注解了,因为这里不会调用提供者服务的接口的时候,不会使用到DiscoveryClient这个类去获取微服务的相关信息了,而是直接的使用@FeignClient进行微服务的远程动态代理接口调用。
业务类
先写动态代理接口,如下图:
然后写控制器方法,可以直接面向前端服务,如下图:
测试
首先启动Eureka7001/7002,然后再启动提供者服务8001/8002,最后启动Feign消费者服务80,如下图:
然后去eureka注册中心查看一下微服务是否注册成功,如下图:
接着去浏览器调用一下消费者提供的接口,如下图:
为什么会有默认的轮询负载均衡?
因为spring-cloud-starter-netflex-eureka-client中默认引入了robin,所以可以进行负载均衡,并且如果我们没有进行设置,默认的是轮询的负载均衡,这在我们之前讲Robin的时候已经总结过了。
相关知识点小总结
@FeignClient修饰的接口其实就相当于是我们mybatis中的动态代理接口,我们可以通过这个接口里面的方法,调用注册中心里面的提供者服务里面暴露的接口,如下图:
并且@FeginClient注解必须要有一个value属性,声明它使用的是哪一个提供者服务,如下图:
注册中心远程动态代理接口必须要和远程的提供者里面的接口完全保持一致,如下图:
下面是提供者里面的控制器接口,如下图:
使用@Autowired可以引入使用@FeignClient修饰的微服务远程动态代理接口,如下图:
OpenFeign超时控制
什么是OpenFeign超时?
默认Feign客户端只等待一秒钟,但是服务端处理需要超过1秒钟,导致Feign客户端不想等待了,直接返回报错。为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制。比如我们下面的这个例子,如下图:
消费者通过Feign远程调用提供者服务里面的接口如下图:
消费者报的超时错误如下图:
服务提供方8001故意写暂停程序
服务消费方80添加超时方法PaymentFeignService
服务消费方80添加超时方法OrderFeignController
测试
首先启动Eureka7001/7002,然后启动提供者服务8001/8002,最后启动Feign消费者服务80,如下图:
然后去Eureka注册中心查看已经注册的微服务,如下图:
接着测试8001提供者服务是否可以正常访问接口,如下图:
最后去测试Feign消费者80服务能否通过Feign成功调用8001提供者服务里面暴露的接口,如下图:
那这个异常该怎样解决呢?请往下看:
YML文件里需要开启OpenFeign客户端超时控制
在yml文件里面加上一段代码,如下图:
注意上面的图片的注释错了,顺序反了。
- ConnectTimeout是控制客户端(远程访问提供者微服务的消费者微服务)和服务端(远程的提供者微服务)连接最长允许时间的,超过这个时间会报错。比如上面设置的是5s,那么在客户端与服务端建立连接的时候,如果5s内服务端还没有响应,那么就会报错。
- ReadTimeout是控制客户端获取服务端数据的最大等待时间,超过这个时间就会报错。比如说上图中设置的最大等待时间是5s,那么假如客户端给服务端发送了一个请求,但是5s内客户端还没有收到服务端的响应数据,那么就会报错。
重新启动Fegin消费者80服务之后,去测试消费端的远程调用提供者服务的接口,如下图:
设计一个找不到提供者微服务接口的异常
上面我们只是在8001提供者微服务里面写了一个/payment/feign/timeout接口,并没有在8002提供者服务里面写一个这样的接口,所以我们启动提供者微服务的时候只启动了8001微服务,而没有启动8002微服务,因为如果启动8002微服务的话Feign消费者80服务调8002里面的/payment/feign/timeout这个接口的时候调不到,就会出现一个异常。具体演示流程如下图:
消费者Feign80微服务对应的远程动态代理接口如下图:
然后再去用消费者Feign80服务调用提供者微服务里面的/payment/feign/timeout这个接口,就会报错,如下图:
OpenFeign日志打印功能
概念
Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节。说白了就是对Feign接口的调用情况进行了监控和输出。
日志级别
NONE:默认的,不显示任何日志。
BASIC:仅记录请求方法,URL,响应状态码及执行时间;
HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
配置日志bean
要写一个Feign的配置类如下图:
YML文件里需要开启日志的Feign客户端
如下图:
测试:后台日志查看
启动Fegin消费者服务80之后,去访问消费者服务的接口,消费者服务会远程调用提供者服务的动态代理接口,在控制台会显示远程动态代理接口的调用信息,如下图:
并且从上图中的http://CLOUD-PAYMENT-SERVICE/payment/feign/timeout还能看出来动态代理接口是对应的提供者微服务是CLOUD-PAYMENT-SERVICE,然后调用的是这个微服务中的payment/feign/timeout接口。