1、OpenFeign基础
1.1、概念
1.2、作用
1.3、Feign和OpenFeign区别
2、OpenFeign使用步骤
2.1、创建Feign消费端微服务
2.2、修改POM文件配置
2.3、编写yaml配置文件
2.4、编写主启动类
2.5、编写业务类
2.5.1、编写 service 层接口,用于服务提供者接口的远程调用
2.5.2、编写 controller 层,用于url映射和service调用
2.6、测试
3、OpenFeign超时控制
3.1、超时情况
3.2、设置超时时间
4、OpenFeign 日志打印
4.1、功能描述
4.2、日志级别
4.3、日志配置
4.3.1、配置日志bean
4.3.2、YML文件里需要开启日志的Feign客户端
4.4、打印结果
简化远程API,调用过程
采用feign前:Ribbon+RestTemplate
//获取用户信息
@GetMapping("/consumer/payment/get/{id}")
public CommonResult getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
}
采用feign后:只需要像调用接口一样,实现远程调用
//controller:
@RestController
@Slf4j
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id){
return paymentFeignService.getPaymentById(id);
}
}
//service:
@Component
@FeignClient(value = "cloud-payment-service") //需要寻找的微服务名称
public interface PaymentFeignService {
@GetMapping(value = "/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id);
}
采用 接口+注解 的方式使用,即微服务调用接口+@FeignClient
添加依赖
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
com.uclass.springcloud
Api-Commons
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
server:
port: 80
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
类上添加 @EnableFeignClients 注解,表示 Feign 客户端
@EnableFeignClients //激活对Feign的使用
@SpringBootApplication
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class, args);
}
}
service层:注意添加 @FeignClient(value = "cloud-payment-service") 注解,其中value值表示需要远程调用的微服务名称。
@Component
@FeignClient(value = "cloud-payment-service") //需要寻找的微服务名称
public interface PaymentFeignService {
@GetMapping(value = "/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id);
}
远程调用的服务提供者的接口:
@GetMapping(value = "/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id) {
Payment payment = paymentService.getPaymentById(id);
log.info("插入结果:" + payment);
if(payment != null) {
return new CommonResult(200, "查询成功,serverPort:" + serverPort, payment);
} else {
return new CommonResult(444, "没有对应记录,查询ID:" + id);
}
}
@RestController
@Slf4j
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id){
return paymentFeignService.getPaymentById(id);
}
}
1)先启动2个eureka集群7001/7002
2)再启动2个微服务8001/8002
3)启动OpenFeign启动
4)访问:http://localhost/consumer/payment/get/31
5)得到结果(Feign自带负载均衡配置项)
Feign客户端调用远程接口时,默认会等待1秒钟,如果服务端处理,超过1秒钟则会报错
在 application.yaml 配置文件中设置超时时长
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
# 表示建立连接后从服务器读取到可用资源,所用时间
ReadTimeout: 5000
# 表示建立连接时间,适用于网络正常的情况下,两端连接所用时间
ConnectTimeout: 5000
对 Feign 接口的调用情况进行监控和输出,通过配置,调整日志级别,从而了解 Feign 中 Http 请求的细节。
注意:Logger 引入的是 import feign.Logger 包下的
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
logging:
level:
#feign日志以什么级别监控哪个接口
com.uclass.springcloud.service.PaymentFeignService: debug