2.1-Feign-概述

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

1587540970425.png

2.2-Feign-快速入门

  1. 在消费端引入 open-feign 依赖
  1. <!--feign-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>
  1. 编写Feign调用接口
  1. package com.itheima.consumer.feign;
  2. import com.itheima.consumer.config.FeignLogConfig;
  3. import com.itheima.consumer.domain.Goods;
  4. import org.springframework.cloud.openfeign.FeignClient;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. /**
  8. *
  9. * feign声明式接口。发起远程调用的。
  10. *
  11. String url = "http://FEIGN-PROVIDER/goods/findOne/"+id;
  12. Goods goods = restTemplate.getForObject(url, Goods.class);
  13. *
  14. * 1. 定义接口
  15. * 2. 接口上添加注解 @FeignClient,设置value属性为 服务提供者的 应用名称
  16. * 3. 编写调用接口,接口的声明规则 和 提供方接口保持一致。
  17. * 4. 注入该接口对象,调用接口方法完成远程调用
  18. */
  19. @FeignClient(value = "FEIGN-PROVIDER")
  20. public interface GoodsFeignClient
  21. @GetMapping("/goods/findOne/{id}")
  22. public Goods findGoodsById(@PathVariable("id") int id);
  23. }

OrderController

  1. package com.itheima.consumer.controller;
  2. import com.itheima.consumer.domain.Goods;
  3. import com.itheima.consumer.feign.GoodsFeignClient;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import org.springframework.web.client.RestTemplate;
  10. @RestController
  11. @RequestMapping("/order")
  12. public class OrderController {
  13. @Autowired
  14. private RestTemplate restTemplate;
  15. @Autowired
  16. private GoodsFeignClient goodsFeignClient;
  17. @GetMapping("/goods/{id}")
  18. public Goods findGoodsById(@PathVariable("id") int id){
  19. /*
  20. String url = "http://FEIGN-PROVIDER/goods/findOne/"+id;
  21. // 3. 调用方法
  22. Goods goods = restTemplate.getForObject(url, Goods.class);
  23. return goods;*/
  24. Goods goods = goodsFeignClient.findGoodsById(id);
  25. return goods;
  26. }
  27. }

goodsFeignClient报红,不影响使用

  1. 在启动类 添加 @EnableFeignClients 注解,开启Feign功能
  1. package com.itheima.consumer;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  6. import org.springframework.cloud.openfeign.EnableFeignClients;
  7. @EnableDiscoveryClient // 激活DiscoveryClient
  8. @EnableEurekaClient
  9. @SpringBootApplication
  10. @EnableFeignClients //开启Feign的功能
  11. public class ConsumerApp {
  12. public static void main(String[] args) {
  13. SpringApplication.run(ConsumerApp.class,args);
  14. }
  15. }
  1. 测试调用

2.3-Feign超时配置

• Feign 底层依赖于 Ribbon 实现负载均衡和远程调用。
• Ribbon默认1秒超时。
• 超时配置:

feign-consumer application.yml

  1. # 设置Ribbon的超时时间
  2. ribbon:
  3. ConnectTimeout: 1000 # 连接超时时间 默认1s 默认单位毫秒
  4. ReadTimeout: 3000 # 逻辑处理的超时时间 默认1s 默认单位毫秒

2.4-Feign-日志记录

• Feign 只能记录 debug 级别的日志信息。

feign-consumer application.yml

  1. # 设置当前的日志级别 debug,feign只支持记录debug级别的日志
  2. logging:
  3. level:
  4. com.itheima: debug

• 定义Feign日志级别Bean

FeignLogConfig

  1. package com.itheima.consumer.config;
  2. import feign.Logger;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration
  6. public class FeignLogConfig {
  7. /*
  8. NONE,不记录
  9. BASIC,记录基本的请求行,响应状态码数据
  10. HEADERS,记录基本的请求行,响应状态码数据,记录响应头信息
  11. FULL;记录完成的请求 响应数据
  12. */
  13. @Bean
  14. public Logger.Level level(){
  15. return Logger.Level.FULL;
  16. }
  17. }

• 启用该Bean:

  1. package com.itheima.consumer.feign;
  2. import com.itheima.consumer.config.FeignLogConfig;
  3. import com.itheima.consumer.domain.Goods;
  4. import org.springframework.cloud.openfeign.FeignClient;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. /**
  8. *
  9. * feign声明式接口。发起远程调用的。
  10. *
  11. String url = "http://FEIGN-PROVIDER/goods/findOne/"+id;
  12. Goods goods = restTemplate.getForObject(url, Goods.class);
  13. *
  14. * 1. 定义接口
  15. * 2. 接口上添加注解 @FeignClient,设置value属性为 服务提供者的 应用名称
  16. * 3. 编写调用接口,接口的声明规则 和 提供方接口保持一致。
  17. * 4. 注入该接口对象,调用接口方法完成远程调用
  18. */
  19. @FeignClient(value = "FEIGN-PROVIDER", configuration = FeignLogConfig.class)
  20. public interface GoodsFeignClient {
  21. @GetMapping("/goods/findOne/{id}")
  22. public Goods findGoodsById(@PathVariable("id") int id);
  23. }