0. 简介

Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端,只需 创建一个 接口 并在接口上添加 注解 即可。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用 image.png

1. Feign原理

Feign=Ribbon+RestTemplate(SpringMVC提供) Feign=接口interface+Feign注解 image.png

  1. 启动类添加**@EnableFeignClients**注解,Spring会扫描所有包下标记了@FeignClient注解的接口,并生成此接口的代理对象,代理对象会通过@RestTemplate发起远程http调用
  2. **@FeignClient(value = "要请求的服务端服务名,可查看Eureka也可以在yml中配置好")**即指定了cms的服务名称,Feign会从注册中心Eureka获取cms服务列表,并通过负载均衡算法进行服务调用。
  3. 在接口方法 中使用注解**@GetMapping("/cms/page/get/{id}")**或者**@PostMapping("/cms/page/get/{id}")**等———什么请求方式写什么@xxxMapping,指定调用的url,Feign将根据url进行远程调用。

    2. Feign和OpenFeign的区别

    image.png

    2. 依赖

  1. <!-- 消费端引入 -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring‐cloud‐starter‐openfeign</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.netflix.feign</groupId>
  8. <artifactId>feign‐okhttp</artifactId>
  9. </dependency>

3. 使用步骤

3.1 YAML

server:
  port: 80
eureka:
  client:
    register-with-eureka: false
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

3.2 启动类———@EnableFeignClients

主启动类添加@EnableFeignClients注解

3.3 业务接口———@FeignClient

@FeignClient(value = XcServiceList.XC_SERVICE_MANAGE_CMS)
public interface CmsPageClient {

    @GetMapping("/cms/page/get/{id}")
    public CmsPage findById(@PathVariable("id") String id);
}

3.4 使用接口

@RunWith(SpringRunner.class)
@SpringBootTest
public class FeignTest {

    @Autowired
    CmsPageClient cmsPageClient;

    @Test
    public void testFeign() {

        //通过服务id调用cms的查询页面接口
        CmsPage cmsPage = cmsPageClient.findById("5a754adf6abb500ad05688d9");

        System.out.println(cmsPage);
    }
}

3.5 Feign自带负载均衡配置项

由于openFeign的依赖中自带引入了Ribbon,因此具备负载均衡

3.6 总结

image.png

4. 使用OpenFeign注意点

SpringCloud对OpenFeign进行了增强兼容了SpringMVC的注解 ,在使用SpringMVC的注解时需要注意:

  1. feignClient接口有参数在参数必须加@PathVariable(“XXX”)和@RequestParam(“XXX”)
  2. feignClient返回值为复杂对象时其类型必须有无参构造函数。

5. OpenFeign超时控制

5.1 原因

服务提供方的业务时长太久时会有超时报错,OpenFeign默认等待1s image.png

5.2 解决方案

OpenFeign默认支持Ribbon,因此在配置文件中配置Ribbon的超时时间即可

# 设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
  # 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
  # 指的是建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000

6. OpenFeign日志打印功能

6.1 简述

image.png

6.2 日志级别

image.png

6.3 配置类

@Configuration
public class FeignConfig {

    @Bean
    public Logger.Level feignLoggerLevel() {
        // 请求和响应的头信息,请求和响应的正文及元数据
        return Logger.Level.FULL;
    }
}

6.4 配置文件

# 设置logger的日志级别
logging:
  level:
    # feign日志以什么级别监控哪个接口
    com.atguigu.springcloud.service.PaymentFeignService: debug

6.5 结果

image.png