OpenFeign
简介
Feign是Netflix开发的声明式、模板化的HTTP客户端,利用它可以帮助我们更加便捷、优雅地调用HTTP API。
Feign声明在服务消费端,也就是在调用端。
Spring Cloud Openfeign对Feign进行了增强,使其支持SpringMVC注解,另外还整合了Ribbon和Nacos,从而使得Feign的使用更加方便。
快速使用
第一步:添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>3.0.1</version>
</dependency>
第二步:编写调用接口
@ComponentScan
//name:指定调用Rest接口所对应的服务名
//path:指定要调用的Rest接口所在的Controller指定的RequestMapping,如果Rest接口所在的Controller没有指定RequestMapping,则不用指定
@FeignClient(name = "nacos-payment",path = "/payment")
public interface PaymentFeignService {//声明Rest接口需要调用的方法@GetMapping("/nacos/{id}")String getPayment(@PathVariable("id") Integer id);
}
第三步:发起调用,像调用本地方式一样调用远程服务
@RestController
@RequestMapping("/order")
public class OrderController {@Resourceprivate PaymentFeignService paymentFeignService;@GetMapping("/nacos/{id}")public String getPayment(@PathVariable("id") Integer id) {return paymentFeignService.getPayment(id);}}
第四步:在主启动类上添加@EnableFeignClients注解
@EnableFeignClients
@SpringBootApplication
public class Consumer9002Application {public static void main(String[] args) {SpringApplication.run(Consumer9002Application.class, args);}}
第五步:运行测试
OpenFeign自定义配置
契约配置(了解)
本技术了解就行,一般情况下不会用到,旧项目改造时可能会用到。
第一步:修改application.yml,在其中添加:
spring:## feign配置openfeign:client:config:nacos-stock:contract: feign.Contract.Default # 设置支持原生注解
第二步:Feign接口代码:
@Service
@FeignClient(name = "nacos-stock", path = "/stock")
public interface StockFeignService {//@GetMapping("/reduct")@RequestLine("GET /reduct") //feign原生注解String reduct();
}
日志配置
第一步:定义一个配置类,指定日志级别
@Configuration
public class OpenFeignConfig {@BeanLogger.Level feignLoggerLevel(){//日志级别return feign.Logger.Level.FULL;}
}
日志等级有4种:
- NONE:默认值 ,不记录任何日志。性能最佳,适用于生产
- BASIC:仅记录请求方法、URL、响应状态代码以及执行时间。适用于生产环境追踪问题
- HEADERS:在BASIC级别的基础之上,记录请求和响应的HEADER
- FULL:记录请求和响应的HEADER、BODY和元数据。比较适用于开发及测试环境定位问题
注意:上面类上使用注解@Configuration就会全局生效。如果想指定对特定微服务生效,就不能在配置类上指定注解@Configuration
,可以采用如下形式:
@FeignClient(name = "nacos-payment",path = "/payment",configuration = OpenFeignConfig.class)
public interface PaymentFeignService {
因为OpenFeign默认是debug级别而SpringBoot默认是info级别,所以要想看到日志信息,需要在applicaion.yml中配置:
logging: ----------①level:com.hc.consumer.feign: debug
浏览器中再次请求,可在控制台中看到如下所示的日志信息:
上面编号①处配置的日志级别是针对整个项目而言的,也可以通过下面方式为特定的服务指定日志级别:
openfeign:client:config:nacos-stock: # 服务名loggerLevel: BASIC
超时配置
方式一:在配置类中添加代码:
@Bean
public Request.Options options(){return new Request.Options(5000,10000);
}
方式二:在application.yml中配置
spring:# 超时配置openfeign:client:config:nacos-stock:# 连接超时时间,默认2sconnectTimeout: 5000# 请求处理超时时间,默认5sreadTimeout: 6000
连接超时不好测试,但读取超时,可以通过设置服务提供者中sleep实现。
注:如果两个服务提供者,一个会超时,一个不会,消费者调用到超时提供者时,不会自动切换到不超时的提供者
自定义拦截器
示例:自定义拦截器模拟实现认证逻辑。
第一步:自定义拦截器类:
public class FeiAuthInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {final String access_token = UUID.randomUUID().toString();//模拟记录日志System.out.println(access_token);requestTemplate.header("Authorization", access_token);requestTemplate.uri("/nacos/666999");}
}
第二步:在配置类中生成Bean:
@Bean
public FeiAuthInterceptor feiAuthInterceptor(){return new FeiAuthInterceptor();
}
第三步:测试:
控制台输出结果:
上面第二步也可以在application.yml中通过配置的方式实现:
feign:client:config:# 配置方式指定拦截器requestInterceptors[0]: com.hc.consumer.interceptor.FeiAuthInterceptor