1、概述
Feign是一个声明式WebService客户端。使用Feign能让写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以及支持负载均衡
2、OpenFeign使用步骤
-
新建cloud-consumer-feign-order80
<dependencies> <dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity --> <groupId>com.yu.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- openfeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
-
yml
server: port: 8090 eureka: client: register-with-eureka: false service-url: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
-
主启动类
@SpringBootApplication @EnableFeignClients public class ConsumerFeign80 { public static void main(String[] args) { SpringApplication.run(ConsumerFeign80.class, args); } }
-
业务接口
@Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") public interface PaymentFeignService { @GetMapping(value = "/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id); }
-
controller
@RestController @Slf4j public class OrderFeignController { @Resource private PaymentFeignService paymentFeignService; @GetMapping(value = "/consumer/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){ return paymentFeignService.getPaymentById(id); } }
-
测试,启动两台eureka,两台提供者,当前module
3、超时机制
默认Feign客户端只等待一秒钟,但是服务器端处理可能需要超过1秒钟,导致Feign客户端不想等待了,会发生返回报错,为了避免这样的情况发生,有时需要设置Feign客户端的超时时间(yml文件)
#设置feign客户端超时时间(OpenFeign 默认支持ribbon)
ribbon:
#指的是建立连接所用时间,适用于网络状况正常情况下,两端连接所用时间
ReadTimeout: 5000
#指的是连接建立后,从服务器获取到可用资源所用时间
ConnectTimeout: 5000
4、日志
Feign提供了日志打印功能,我们可以通过配置来改变日志级别,从而了解Feign中Http请求的细节。
OpenFeign的日志级别有
- NONE:默认不显示任何日志
- BASIC:紧记录请求方法、URL、响应状态码及执行时间
- HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
- FULL:除了HEADERS中定义的信息之外,还有请求和相应的正文及元数据
如何使用日志打印功能
-
在配置类中添加OpenFeign的日志类
@Configuration public class FeignConfig { Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
-
可以在yml中配置监控的某个端口的日志级别
#feign 日志以什么级别监控那个接口 logging: level: com.yu.springcloud.service: debug