Feign入门配置(7)

x33g5p2x  于2021-08-23 转载在 Spring  
字(3.8k)|赞(0)|评价(0)|浏览(122)

一 前言

前文我们使用过了使用restTemplate结合Ribbon实现了HTTP远程过程调用消费服务,由于使用直接使用RestTenplate进行服务调用不是很理想,所以我们选择更好方式使用Feign进行Web Service 调用;之前文章的学习jdk版本都是基于javaSE8.0,Feign也是如此,不支持8.0以下,如果是初学者,请看知识追寻者cloud系列文章从头开始看,否则会一头雾水;

本篇文章的Feign只是入门级别,主要讲解feign的工作流程,基本TTTP远程调用,相关基本配置等,后续会出主流高级配置;

二 Feign 简介

Feign的由来是基于retrofitjax-rsJSR 356, Java API for WebSocket;其内部对RestTemplate进行了封装,在使用过程中简化了HTTP远程过程调用过程,使开发人员使用更加简便;

Feign特色如下:

  1. 响应缓存支持,可多中类型选择;支持扩展的缓存,如EhCache, Google, Spring;
  2. 完整的URI 模板表达式语言支持;
  3. 类SLF4J 日志支持;

三 Feign的工作流

@EnableFeignClients 表示开启Feign功能,然后扫描 注解@FeignClient,程序启动后,会将这些类扫描进IOC容器;Feign会 对 RestTemplate 进行 封装,简化HTTP远程过程调用;RestTemplate使用Request 模板生成新的Requst 发送请求,其底层通常是基于URLConnection;

在这里插入图片描述

四 Eureka-Client

在之前的Eureka-Clinet 工程的表现层包创建新的controller层API用于服务提供;

/**
 * @Author lsc
 * <p> 知识追寻者 Feign 服务消费</p>
 */
@RestController
public class FeignProvoderController {

    @GetMapping("zszxz/feign")
    public String getFeign(){
        return "the get method of feign test";
    }
}

五 Feign-client

在父工程中创建新的 子工程 Feign-client;

5.1 pom.xml

添加openfeign 依赖;

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

5.2 application.yml

这边我们使用新的端口8093,应用名称是 feign-client; 同样将服务注入peer1,peer2,peer3;并且设置feign的客户端属性,比如连接时间,读取时间,日志级别;

server:
  port: 8093

spring:
  application:
    name: feign-client # 应用名称

eureka:
  client:
    service-url:
      # 服务注册地址
      defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/

feign:
  client:
    config:
      default:
        connectTimeout: 5000 # 连接超时时间
        readTimeout: 5000   # 读超时时间
        loggerLevel: full # 日志级别

5.3 service

在service 接口 上标明注解 @FeignClient表示 是 一个Feign的客户端类; 属性 name 表示 Feign客户端名称;value表示服务提供者的应用名称;由于 eureka-client 中 提供了表现层API,我们 在service接口中定义相应的方法并且使用@GetMapping注解,里面配上需要调用的path,表示我们具体要消费的服务;

/**
 * @Author lsc
 * <p> </p>
 */
@FeignClient( name = "eureka-client", value = "eureka-client")
public interface FeignService {

    @GetMapping("zszxz/feign")
    public String getFeign();

}

5.4 controller

controller层也就是平常的表现层,没什么特别之处,直接调用service接口提供的API;

/**
 * @Author lsc
 * <p> feign 表现层 </p>
 */
@RestController
public class FeignController {

    @Autowired
    FeignService feignService;

    @GetMapping("zszxz/feign")
    public String getFeign(){
        // 调用 getFeign方法
        return feignService.getFeign();
    }
}

5.5 启动类

在启动类上方标明@EnableFeignClients,其表示启用feign功能,扫描@FeignClient 标明的类入IOC容器;

/**
 * @Author lsc
 * <p> feign启动类</p>
 */
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients//表示启用feign
public class FeignApp {

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

}

六 调用结果

6.1 工程结构如下

在这里插入图片描述

6.2 结果

启动工程,访问地址 http://localhost:8093/zszxz/feign ; 结果如下如,表示使用Feign调用HTTP服务消费成功;

在这里插入图片描述

七 @FeignClient注解说明

当 IOC容器中有相同的实例,@Autowired 会不起作用,此时会报错,使用@Primary 标明哪一个实例是首要实例,会优先被IOC扫描注入;

属性说明
nameFeign Client的名称 支持占位符${}
serviceId服务id
value指定 serviceId
url指定调用的URl, 支持占位符${}
decode404404错误时,设置为true,会进行decode解码,否则FeignException
fallback容错处理
fallbackFactory生成fallback模板示例,减少重复代码
pathPath统一前缀
primary设置为 primary Bean
qualifier为Feign Client 新增注解@Qualifier

八 日志设置

每个 Feign client 都会创建日志,默认是接口的全类名作为日志名称,日志响应仅支持debug模式;日志的配置方式有两步骤,一是通过配置文件,二是通过JAVA注解配置类;

日志级别说明
NONE没有日志(默认)
BASIC请求和响应的状态码,时间
HEADERS基于Basic加上请求和响应头
FULL请求和响应的 head ,body 和元数据

8.1 application.yml

在 application.yml 中添加如下配置

logging:
  level:
    com.zszxz.feign.service: Debug

8.2 config

配置类如下

/**
 * @Author lsc
 * <p> </p>
 */
@Configuration
public class FeignConfiguration {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

8.3 指定Config

在 @FeignClien 中可以指定具体使用Feign的配置类,此时会覆盖feign的默认配置;

@FeignClient( name = "eureka-client", value = "eureka-client",configuration = FeignConfiguration.class)

九参考文档

https://cloud.spring.io/spring-cloud-static/Finchley.SR4/single/spring-cloud.html

相关文章