Spring Cloud 2021.0.1 实践 OpenFeign | Debug 笔记
一、问题描述:
目前 Spring Cloud 已经更新到 2021.0.1
我们今天一起来学习 OpenFeign
。
Fegin 定义: Feign 是声明性 Web 服务客户端。它使编写 Web 服务客户端更加容易。要使用 Feign,请创建一个接口并对其进行注释。它具有可插入注释支持,包括 Feign 注释和 JAX-RS 注释。Feign 还支持可插拔编码器和解码器。Spring Cloud 添加了对 Spring MVC 注释的支持,并支持使用 HttpMessageConverters Spring Web 中默认使用的注释。Spring Cloud 集成了 Ribbon 和Eureka 以及 Spring Cloud LoadBalancer,以在使用Feign时提供负载平衡的http客户端。
二、解决方法:
依赖和配置
build.gradle 文件和 yml 配置文件, 主要是定义以来
build.gradle
文件配置如下,我使用的是 spring-boot 2.6.4
和 spring-cloud 2021.0.1
。
plugins {
id 'java'
id 'org.springframework.boot' version '2.6.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group 'com.ssm'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenLocal()
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
}
ext {
set('springCloudVersion', "2021.0.1")
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
yml
文件我主要是修改了端口和定义服务名,需要同步添加即可。
server:
port: 8081
spring:
application:
name: order-service
启动文件和 feign 调用
启动类增加 @EnableFeignClients
保证 @FeignClient
接口也可以被扫描到。
@EnableFeignClients
@SpringBootApplication
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class);
}
}
微服务调用接口
- 业务逻辑接口增加
@FeignClient
配置调用 Provider 服务。
@FeignClient(name = "payment-service", url = "127.0.0.1:8091", path = "/payment")
public interface PaymentFegin {
@PostMapping("/create")
PaymentVo create(@RequestBody @Validated PaymentDto paymentDto);
}
PaymentFegin
注入到调用类里面
@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private PaymentFegin paymentFegin;
@GetMapping("/create")
public OrderVo create(@Validated OrderDto orderDto) {
log.info("uri:/order/create lang:{}", LocaleContextHolder.getLocale().getLanguage());
OrderVo orderVo = new OrderVo();
orderVo.setId(1L);
orderDto.setCode("ORT0000001");
PaymentDto paymentDto = new PaymentDto();
paymentDto.setId(orderDto.getId());
paymentDto.setCode(orderDto.getCode());
paymentFegin.create(paymentDto);
return orderVo;
}
}
日志打印
-
配置日志的 LEVEL Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Fegin 中 HTTP 请求的细节(说白了就是对Feign 接口的调用情况进行监控和输出)。
-
日志级别如下
- NONE: 默认的,不显示任何日志
- BASIC: 仅记录请求方法、URL、响应状态码以及执行时间
- HEADERS:除了BASIC 中自定义的信息外,还有请求和响应的信息头
- FULL: 除了HEADERS中定义的信息哇, 还有请求和响应的正文以及元数据。
- 声明代码
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
等价配置, 主要是设置 loggerLevel
日志级别。
feign:
client:
config:
default:
loggerLevel: full
- yml 文件中增加配置
logging:
level:
io.xx.order.fegin: debug
- 访问接口
http://127.0.0.1:8081/order/create
结果如下:
从上面可以看出,这个日志还是非常完整和丰富的,需要注意的是日志量非常大,适合 dev 和 test 环境使用,生产环境禁用。
三、总结:
feign 是一个声明式的 Web 服务客户端,让编写Web服务客户端变得非常容易,只需要创建一个接口并正在接口上添加注解即可。
转载自:https://juejin.cn/post/7070892185746407437