一. Feign快速入门
备注:以下操作在consumer中进行。
1.1 导入相关feign坐标
<!--feign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
1.2 启动类中开启feign
@EnableDiscoveryClient // 激活DiscoveryClient@EnableEurekaClient@SpringBootApplication@EnableFeignClients //开启Feign的功能public class ConsumerApp {public static void main(String[] args) {SpringApplication.run(ConsumerApp.class,args);}}
1.3 建立声明式接口,发起远程调用
/*** 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);}
1.4 调用
注入,直接调用!
@RestController@RequestMapping("/order")public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate GoodsFeignClient goodsFeignClient;@GetMapping("/goods/{id}")public Goods findGoodsById(@PathVariable("id") int id){Goods goods = goodsFeignClient.findGoodsById(id);return goods;}}
二. Feign超时配置
feign底层依赖ribbon实现负载均衡和远程调用。所以:
# 设置Ribbon的超时时间ribbon:ConnectTimeout: 1000 # 连接超时时间 默认1sReadTimeout: 3000 # 逻辑处理的超时时间 默认1s
三. Feign日志记录
3.1 配置yml文件
# 设置当前的日志级别 debug,feign只支持记录debug级别的日志logging:level:com.itheima: debug
3.2 config包中建立bean
@Configurationpublic class FeignLogConfig {/*NONE,不记录BASIC,记录基本的请求行,响应状态码数据HEADERS,记录基本的请求行,响应状态码数据,记录响应头信息FULL;记录完成的请求 响应数据*/@Beanpublic Logger.Level level(){return Logger.Level.FULL;}}
3.3 改造接口
/**** 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);}
configuration = FeignLogConfig.class
