一、问题描述:
目前 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服务客户端变得非常容易,只需要创建一个接口并正在接口上添加注解即可。