Feign简介

Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。
——摘自SpringCloud参考文档

Feign客户端和Ribbon类似,同样实现了客户端的负载均衡,与Ribbon不同的是,Feign的调用与本地接口的调用更加类似,并且更加便捷、更加优雅,传入参数较多时得以体现,当然,在实际项目中,两者可能都会用到,下面来写一下Feign的实现:

搭建步骤

1、均在之前的父工程下,新建ms-consumer-feign-8003子工程;
2、开启之前的Eureka单机版的Server;
3、两个服务提供者,名称均为micro-service-provider,端口分别7001,7002;
4、配置子工程,依赖、配置文件、启动类等,自定义feign,配置日志、拦截器等;

前三步可以参考之前的文章,默认已完成,直接进入第4步。

引入依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <artifactId>spring-cloud-parent</artifactId>
    <groupId>org.example</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>ms-consumer-feign-8003</artifactId>
  <packaging>war</packaging>

  <name>ms-consumer-feign-8003 Maven Webapp</name>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!--加入feign的依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

application.properties配置文件

server.port=8003
# 注册到Eureka服务端的微服务名称
spring.application.name=ms-consumer-feign-user
# 注册到Eureka服务端的地址
# http://${eureka.instance.hostname}:${server.port}/eureka/   ----修改了hosts文件
# eureka.client.service-url.defaultZone=http://www.eureka9000.com:9000/eureka/
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/
# 点击具体的微服务,右下角是否显示ip
eureka.instance.prefer-ip-address=true
# 显示微服务的名称
eureka.instance.instance-id=ms-consumer-feign-8003

启动类

@SpringBootApplication
@EnableFeignClients(basePackages = "com.xxx")
@EnableDiscoveryClient
public class MsConsumerFeign8003Application {

    public static void main(String[] args) {
        SpringApplication.run(MsConsumerFeign8003Application.class,args);
    }
}

远程调用设置

FeignApi


@FeignClient(name = "micro-service-provider",path = "/ms")
public interface FeignApi {
    @RequestLine("GET /hello")
    String testFeign();
}

FeignClient里的name指的是注册到Eureka的服务提供者名称,path是指服务提供者中Controller上的mapping。
在这里插入图片描述

Controller

@RestController
public class FeignController {

    @Autowired
    private FeignApi feignApi;

    @RequestMapping("/feign")
    public String feignHttp(){
        return feignApi.testFeign();
    }
}

应用测试

服务消费者、服务提供者在EurekaServer上进行注册:
在这里插入图片描述
使用Feign进行远程调用:
在这里插入图片描述
再点击一次,进行了轮询:
在这里插入图片描述
Feign和Ribbon一样,也实现了负载均衡。

自定义Feign

日志

实现步骤:

  • 首先需要在application.properties中使用 logging.level.<Feign客户端对应的接口的全限定名> =<日志级别>的参数配置格式来开启指定客户端日志:
logging.level.com.xxx.api.FeignApi=debug
  • 但由于Feign客户端默认的Logger.Level对象定义为NONE级别,因此需要对它进行调整. Logger.Level的源码中规定了以下几个级别:
  public enum Level {
    // 不记录日志 (默认)。
    NONE,
    //只记录请求方法和URL以及响应状态代码和执行时间
    BASIC,
    //记录请求和应答的头的基本信息
    HEADERS,
    //记录请求和响应的头信息,正文和元数据
    FULL
  }

拦截器

实现RequestInterceptor接口:

public class feignInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        System.out.println("自定义拦截器");
        requestTemplate.header("token", "123456");
    }
}

config

/**
 * 自定义Feign的日志、拦截器等
 */
public class MsProviderFeignConfig {
    @Bean
    public Contract feignContract() {
        return new Contract.Default();
    }
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
    @Bean
    public Request.Options feignRequestOptions() {
        return new Request.Options(30000, 30000);
    }
    @Bean
    public RequestInterceptor feignInterceptor() {
        return new feignInterceptor();
    }
}

在FeignApi中设置

@FeignClient(name = "micro-service-provider",path = "/ms",configuration = MsProviderFeignConfig.class)
public interface FeignApi {
    @RequestLine("GET /hello")
    String testFeign();

}

在FeignClient中加入configuration = MsProviderFeignConfig.class。

实现效果

在这里插入图片描述
至此,SpringCloud之Feign的简单入门就结束了,这些组件用起来都有共同的三步:引入依赖、编写配置文件、启动类标注解,掌握它们各自的配置基本就可以用了,入门后就可以慢慢去研究源码了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐