Feign:声明式WebService客户端。
使用方法:定义一个服务接口然后在上面添加注解。支持可拔插式的编码器和解码器。Springcloud对Feign进行了封装,可以支持SpringMVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
Feign继承了Ribbon
OpenFeign使用步骤
接口+注解【微服务调用接口+@FeignClient】
(1)新建cloud-consumer-feign-order80模块
(2)pom.xml【在80基础上加】
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(3)application.yml
server:
port: 80
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
(4)OrderFeignMain80【@EnableFeignClient】
package com.jiao.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author jyl
* create 2021-1-27
*/
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class,args);
}
}
(5)接口service.PaymentServiceFeign.java【@FeignClient(value="CLOUD-PAYMENT-SERVICE")】
package com.jiao.springcloud.service;
import com.jiao.springcloud.entities.CommonResult;
import com.jiao.springcloud.entities.Payment;
import feign.Param;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
//CommonResult<Payment> getPaymentById(@Param("id") Long id);
@GetMapping(value = "/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
(6)PaymentFeignController
package com.jiao.springcloud.controller;
import com.jiao.springcloud.entities.CommonResult;
import com.jiao.springcloud.entities.Payment;
import com.jiao.springcloud.service.PaymentFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@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);
}
}
(7)测试:【localhost/consumer/payment/get/4】
OpenFeign超时控制
默认Feign客户端只等待1秒,但是服务端处理需要超过1秒,导致Feign客户端不想等待了,直接返回报错,为了避免这种情况,有时候我们需要设置feign客户端的超时控制。
在cloud-consumer-feign-order80下修改application.yml
...
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000
OpenFeign日志打印功能
日志级别:
- NONE:默认的,不显示任何日志
- BASIC:仅记录请求方法、URL、响应状态码及执行时间
- HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
- FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据
配置日志Bean:
package com.jiao.springcloud.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLOggerLevel(){
return Logger.Level.FULL;
}
}
application.yml【添加】
...
logging:
level:
#Feign日志以哪个级别监控哪个接口
com.jiao.springcloud.service.PaymentFeignService: debug
测试:【http://localhost/consumer/payment/get/5】