简介
OpenFeign是一个声明式的web服务客户端,让编写web服务客户端变的非常容易,只需要创建一个接口并在接口上添加注解即可,OpenFeign的前身是Feign,后者目前已经停更了,OpenFeign是SpringCloud在Feign的基础上支持了Spring MVC的注解,并通过动态代理的方式产生实现类来做负载均衡并进行调用其他服务。OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
OpenFeign的底层还是使用了Ribbon,所以当然也支持负载均衡,默认策略是沦陷。
使用OpenFeign
引入依赖
<!--OpenFeign依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
启动类添加@EnableFeignClients注解
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class OrdersApplication { public static void main(String[] args) { SpringApplication.run(OrdersApplication.class, args); } }
创建客户端服务接口
创建一个包com.moti.client
用来存储之后所有使用OpenFeign的客户端接口,这里首先创建一个商品客户端用来调用商品服务(PRODUCTS
)。组件之间通过Json字符串传递数据。
@FeignClient("PRODUCTS") public interface ProductClient { @GetMapping("/products/getAll") List<Product> getAll(); /** * 问号传参使用@RequestParam注解 -> /hello?param1=1¶m2=test */ @GetMapping("/products/getById") Product getById(@RequestParam("id") Integer id); /** * 路径传参使用@PathVariable注解 -> /user/1 */ @GetMapping("/products/delete/{id}") Map<String,Object> deleteById(@PathVariable("id") Integer id); /** * 添加商品JSON */ @PostMapping("/products/addProduct") String addProduct(@RequestBody Product product); /** * 数组传参 */ @GetMapping("/products/hello1") Map<String,Object> hello1(@RequestParam("ids") int[] ids); }
之后只需要ProductClient
注入到SpringBoot的Service或者Controller即可。
// 注入客户端对象 @Autowired private ProductClient productClient;
OpenFeign的配置
请求超时配置
默认情况下,openFiegn在进行服务调用时,要求服务提供方处理业务逻辑时间必须在1S内返回,如果超过1S没有返回则OpenFeign会直接报错,不会等待服务执行。但是往往在处理复杂业务逻辑是可能会超过1S,因此需要修改OpenFeign的默认服务调用超时时间。
# 修改OpenFeign指定服务(PRODUCTS)的的请求超时时间 feign.client.config.PRODUCTS.connectTimeout=5000 feign.client.config.PRODUCTS.readTimeout=5000 # 修改默认超时时间 feign.client.config.default.connectTimeout=5000 feign.client.config.default.readTimeout=5000
开启日志
往往在服务调用时我们需要详细展示OpenFeign的日志,默认OpenFeign在调用是并不是最详细日志输出,因此在调试程序时应该开启OpenFeign的详细日志展示。OpenFeign对日志的处理非常灵活可为每个OpenFeign客户端指定日志记录策略,每个客户端都会创建一个logger,默认情况下logger的名称是OpenFeign的全限定名需要注意的是,OpenFeign日志的打印只会DEBUG
级别做出响应。所以我们需要将OpenFeign客户端所在的包的日志级别设置为DEBUG
。
我们可以为OpenFeign客户端配置各自的logger.lever
对象,告诉OpenFeign记录那些日志logger.lever
有以下的几种值:
NONE
不记录任何日志BASIC
仅仅记录请求方法、url、响应状态代码及执行时间HEADERS
记录Basic级别的基础上,记录请求和响应的headerFULL
记录请求和响应的header,body和元数据
# 指定服务(PRODUCTS)设置日志级别 feign.client.config.PRODUCTS.loggerLevel=full # 指定默认日志级别 feign.client.config.default.loggerLevel=full # 指定feign调用客户端对象所在包,必须是debug级别 logging.level.com.moti.client=debug