2.1-Feign-概述
• Feign 是一个声明式的 REST 客户端,它用了基于接口的注解方式,很方便实现客户端配置。
• Feign 最初由 Netflix 公司提供,但不支持SpringMVC注解,后由 SpringCloud 对其封装,支持了SpringMVC注
解,让使用者更易于接受

2.2-Feign-快速入门
- 在消费端引入 open-feign 依赖
<!--feign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
- 编写Feign调用接口
package com.itheima.consumer.feign;import com.itheima.consumer.config.FeignLogConfig;import com.itheima.consumer.domain.Goods;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;/**** feign声明式接口。发起远程调用的。*String url = "http://FEIGN-PROVIDER/goods/findOne/"+id;Goods goods = restTemplate.getForObject(url, Goods.class);** 1. 定义接口* 2. 接口上添加注解 @FeignClient,设置value属性为 服务提供者的 应用名称* 3. 编写调用接口,接口的声明规则 和 提供方接口保持一致。* 4. 注入该接口对象,调用接口方法完成远程调用*/@FeignClient(value = "FEIGN-PROVIDER")public interface GoodsFeignClient@GetMapping("/goods/findOne/{id}")public Goods findGoodsById(@PathVariable("id") int id);}
OrderController
package com.itheima.consumer.controller;import com.itheima.consumer.domain.Goods;import com.itheima.consumer.feign.GoodsFeignClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@RestController@RequestMapping("/order")public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate GoodsFeignClient goodsFeignClient;@GetMapping("/goods/{id}")public Goods findGoodsById(@PathVariable("id") int id){/*String url = "http://FEIGN-PROVIDER/goods/findOne/"+id;// 3. 调用方法Goods goods = restTemplate.getForObject(url, Goods.class);return goods;*/Goods goods = goodsFeignClient.findGoodsById(id);return goods;}}
goodsFeignClient报红,不影响使用
- 在启动类 添加 @EnableFeignClients 注解,开启Feign功能
package com.itheima.consumer;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.openfeign.EnableFeignClients;@EnableDiscoveryClient // 激活DiscoveryClient@EnableEurekaClient@SpringBootApplication@EnableFeignClients //开启Feign的功能public class ConsumerApp {public static void main(String[] args) {SpringApplication.run(ConsumerApp.class,args);}}
- 测试调用
2.3-Feign超时配置
• Feign 底层依赖于 Ribbon 实现负载均衡和远程调用。
• Ribbon默认1秒超时。
• 超时配置:
feign-consumer application.yml
# 设置Ribbon的超时时间ribbon:ConnectTimeout: 1000 # 连接超时时间 默认1s 默认单位毫秒ReadTimeout: 3000 # 逻辑处理的超时时间 默认1s 默认单位毫秒
2.4-Feign-日志记录
• Feign 只能记录 debug 级别的日志信息。
feign-consumer application.yml
# 设置当前的日志级别 debug,feign只支持记录debug级别的日志logging:level:com.itheima: debug
• 定义Feign日志级别Bean
FeignLogConfig
package com.itheima.consumer.config;import feign.Logger;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class FeignLogConfig {/*NONE,不记录BASIC,记录基本的请求行,响应状态码数据HEADERS,记录基本的请求行,响应状态码数据,记录响应头信息FULL;记录完成的请求 响应数据*/@Beanpublic Logger.Level level(){return Logger.Level.FULL;}}
• 启用该Bean:
package com.itheima.consumer.feign;import com.itheima.consumer.config.FeignLogConfig;import com.itheima.consumer.domain.Goods;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;/**** feign声明式接口。发起远程调用的。*String url = "http://FEIGN-PROVIDER/goods/findOne/"+id;Goods goods = restTemplate.getForObject(url, Goods.class);** 1. 定义接口* 2. 接口上添加注解 @FeignClient,设置value属性为 服务提供者的 应用名称* 3. 编写调用接口,接口的声明规则 和 提供方接口保持一致。* 4. 注入该接口对象,调用接口方法完成远程调用*/@FeignClient(value = "FEIGN-PROVIDER", configuration = FeignLogConfig.class)public interface GoodsFeignClient {@GetMapping("/goods/findOne/{id}")public Goods findGoodsById(@PathVariable("id") int id);}
