文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e1fd97d4301df550284696a2f4b3fb89.png#pic_center)
Feign是一个声明式的web客户端,只需要创建一个接口,添加注解即可完成微服务之间的调用
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ad1aaabfb75eae34f2751a379dbaea28.png#pic_center)
就是A要调用B,Feign就是在A中创建一个一模一样的B对外提供服务的的接口,我们调用这个接口,就可以服务到B
1. Feign与OpenFeign区别
2. 使用OpenFeign(建一个消费者80服务)
之前的服务间调用,我们使用的是ribbon+RestTemplate
现在改为使用OpenFeign
1,新建一个order项目,用于feign测试
名字cloud_order_feign-80
2,pom文件(80)
加了OpenFeign依赖,底层是存在Ribbon负载均衡的,所以是Ribbon的升级
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3,添加application.yml配置文件(80)
此例并没有将cloud-orderfeign-80注入到eureka里面,所以主启动类不需要添加@EnableEurekaClient
注解
server:
port: 80
# 这里只把feign做客户端用,不注册进eureka
eureka:
client:
register-with-eureka: false # 表示是否将自己注册进EurekaServer默认为true
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
4,添加主启动类和@EnableFeignClients注解。(80)
@EnableFeignClients注解 激活OpenFeign客户端 ,这里不需要加@EnableEurekaClient,因为并没有将80注入到eureka里
5.fegin需要调用的其他的服务的接口(80 @FeignClient)
写这个service业务层接口,主要是80消费者去调用它时,实际上调用的是CLOUD-PAYMENT-SERVICE
生产者8001和8002微服务的controller层的该方法(轮循)。可以看到这个接口的抽象方法和生产者8001和8002 controller层的方法相同,而且连@GetMapping注解的地址也一样,只是这个方法是抽象的。
6. controller (80)
在controller层中调用配置的接口方法PaymentFeignService
我们访问cloud-consumer-feign-order80的/consumer/payment/get/id地址,因为我们在cloud-consumer-feign-order80中添加了@FeignClient注解的接口,Feign会根据@FeignClient上的value值(CLOUD-PAYMENT-SERVICE
),找到具体的服务,向它发送/payment/get/id
的请求,从而实现远程调用生产者8001和8002的controller中的/payment/get/id
。在使用感受上,好像是调用了cloud-consumer-feign-order80项目内部的一个业务一样,无需关心实现,也不用写RestTemplate了。
启动Eureka集群7001和7002,服务提供者8001和8002,服务消费者OrderFeignMain80。浏览器访问http://localhost/consumer/payment/get/1,一切正常,可以查询到数据,并且不断在8001和8002之间切换。
7测试:
启动两个erueka(7001,7002)
启动两个pay(8001,8002)
启动当前的order模块
Feign默认使用ribbon实现负载均衡
3. OpenFeign超时机制
OpenFeign默认等待时间是1秒,超过1秒,直接报错
1,设置超时时间,修改配置文件:
因为OpenFeign的底层是ribbon进行负载均衡,所以它的超时时间是由ribbon控制
为了测试超时控制,我们在服务提供者的模块,即8001和8002中,添加一个controller方法,方法体内Thread.sleep(3000);停留3秒钟返回。
//8001或8002中的生产者controller层
@GetMapping("/payment/feign/timeout")
public String paymentFeignTimeout() throws InterruptedException {
Thread.sleep(3000);
return serverPort;
}
为了让cloud-consumer-feign-order80能调用到这个接口,需要将接口定义写在PaymentFeignService.java接口中。在OrderFeignController.java中加入映射地址,用于浏览器访问。
//80模块的OrderFeignController.java
@GetMapping("/consumer/payment/feign/timeout")
public String paymentFeignTimeout() throws InterruptedException {
//调用PaymentFeignService.java接口的该方法,实际上去调用生产者8001或8002模块的controller层的该方法
return paymentFeignService.paymentFeignTimeout();
}
通过浏览器直接访问生产者8002模块http://localhost:8002/payment/feign/timeout,等待3秒钟后,可以看到结果,通过浏览器访问80消费者http://localhost/consumer/payment/feign/timeout,(转到生产者controller)发现页面报错了,提示Read time out。
因为,Feign默认连接超时为1秒,默认读取资源超时是1秒。如果需要修改超时时间,需要在80模块的yml里添加配置。
#80模块
# 设置feign客户端超时时间,OpenFeign默认支持Ribbon
ribbon:
ReadTimeout: 5000 # 建立连接后,读取资源所用时间
ConnectTimeout: 5000 # 建立连接所用时间
4. OpenFeign日志:(80消费者端)
Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而查看Feign中Http请求细节,对Feign接口调用进行监控。
日志级别:
- NONE:默认,不显示任何日志
- BASIC:仅记录请求方法、URL、响应状态码及执行时间
- HEADERS:除了BASIC中定义的信息外,还有请求头和响应头的信息
- FULL:除了HEADERS中定义的信息之外,还有请求体和响应体的正文及元数据
需要添加一个日志配置类。这个需要配置在需要的模块,如80消费者模块
package com.atguigu.springcloud.config;
@Configuration
public class FeignConfig {
@Bean
Logger.Level level() {
return Logger.Level.FULL;
}
}
在yml里指定监控哪个请求接口和监控级别。
logging:
level:
# 指定监控哪个接口,以及监控的级别,80消费者模块中的业务接口PaymentFeignService
#该接口调用生产者8001模块的controller层方法,所以日志记录
com.atguigu.springcloud.service.PaymentFeignService: debug
完整yml,注意格式
server:
port: 80
# 这里只把feign做客户端用,不注册进eureka
eureka:
client:
register-with-eureka: false # 表示是否将自己注册进EurekaServer默认为true
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
#80模块
# 设置feign客户端超时时间,OpenFeign默认支持Ribbon
ribbon:
ReadTimeout: 5000 # 建立连接后,读取资源所用时间
ConnectTimeout: 5000 # 建立连接所用时间
logging:
level:
# 指定监控哪个接口,以及监控的级别,80消费者模块中的业务接口PaymentFeignService
#该接口调用生产者8001模块的controller层方法,所以日志记录
com.atguigu.springcloud.service.PaymentFeignService: debug
测试,随便输入一个请求,如http://localhost/consumer/payment/feign/timeout
,控制台出现如下日志