SpringCloud之Feign

Feign

  • 1、Feign简介
  • 2、RestTemplate&Feign
    • RestTemplate方式存在的问题
  • 2、Feign的使用
    • 1.引入Feign的依赖
    • 2.开启Feign的功能
    • 3.编写FeignClient接口
    • 4.修改业务代码
  • 3、Feign的自定义配置
    • 配置Feign的日志
  • 4、Feign的性能优化
    • 1.Feign的连接池配置
    • 2.Feign的日志设置
  • 5、Feign的最佳实战
    • 1.新建一个feign-api的module,引入feign的starter依赖
    • 2.将服务中编写的FeignClient、POJO、默认Feign配置复制到feign-api中
    • 3.将feign-api打包成jar包,供服务引入
    • 4.修改服务中导入feign-api包的配置
    • 5.重启测试
    • 实战遇到的问题:

1、Feign简介


Feign是一个声明式HTTP客户端。主要功能是实现声明式的服务调用

声明式调用:就像调用本地方法一样调用远程方法,开发者感知不到这是调用了远程方法,以及调用了HTTP请求


2、RestTemplate&Feign

在SpringCloud中,默认使用HTTP进行微服务之间的通信,主要方式以下两种:

  • RestTemplate
  • Feign

RestTemplate方式存在的问题

示例代码: 在这里插入图片描述

通过上图中的代码可以看出:

  • 代码的可读性差
  • 编码风格不统一
  • URL、参数复杂,可维护性差

而今天将学习Feign将代替RestTemplate解决上面的问题


2、Feign的使用

1.引入Feign的依赖

<dependency>
  <groupId>org.springframework.cloudgroupId>
  <artifactId>spring-cloud-starter-openfeignartifactId>
dependency>

2.开启Feign的功能

启动类上添加注解**@EnableFeignClients**
SpringCloud之Feign_第1张图片

3.编写FeignClient接口

SpringCloud之Feign_第2张图片
解释说明:Feign底层是通过动态代理实现的。

  1. 只要对接口进行了**@FeignClient注解的声明,Feign就会针对这个接口创建一个动态代理对象**,调用这个接口,其实就是调用了接口的代理对象
  2. 然后代理对象就是根据**@FeignClient** 注解的name值从服务注册中心去找,找到对应的服务名称
  3. 再通过接口中方法标注了 @RequestMapping 注解中的映射路径,构造出请求的路径
  4. 最后根据请求路径,本地实现HTTP远程调用

4.修改业务代码

SpringCloud之Feign_第3张图片
注意:Feign依赖中集成了ribbon,默认已实现负载均衡


3、Feign的自定义配置

Feign可以修改如下配置来覆盖默认配置:
SpringCloud之Feign_第4张图片
一般情况下,只需要修改日志级别

配置Feign的日志

  • 方式一:配置文件配置

    1. 全局配置

      feign:
        client:
          config:
            default: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
              loggerLevel: FULL #日志级别
      
    2. 局部配置

      feign:
        client:
          config:
            userservice: # 这里写的是服务名称,则是针对某个微服务的配置
              loggerLevel: FULL #日志级别 
      
  • 方式二:Java配置实现

    声明一个Logger.Levelbean

    public class FeignClientConfiguration {
        
        @Bean
        public Logger.Level logger(){
            return Logger.Level.FULL;
        }
    }
    
    
    • 全局配置:放到 @EnableFeignClients 的注解中

      @FeignClient(name = "useservice",configuration = FeignClientConfiguration.class)
      
    • 局部配置:放到 @FeignClient 的注解中

      @EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
      



4、Feign的性能优化


1.Feign的连接池配置


Feign底层的客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

因此需要使用带有连接池的客户端来提升Feign的性能

  1. 引入依赖:

            <dependency>
                <groupId>io.github.openfeigngroupId>
                <artifactId>feign-httpclientartifactId>
            dependency>
    
  2. 配置文件配置

    feign:
      httpclient:
        enabled: true  #开启httpclient
        max-connections: 200 #最大连接数
        max-connections-per-route: 50 # 每个路径的最大连接数
    
    

2.Feign的日志设置

如果想给Feign提升性能的化,强烈建议只使用basicnone的日志级别,不必再使用更高的日志级别。
因为打印的日志越多,消耗Feign的性能越高。




5、Feign的最佳实战

当很多服务消费者都要去调用服务提供者,为了避免FeignClient的重复开发,我们可以将FeignClient抽取为独立模块,并且把接口有关的POJO默认的Feign配置都放到这个模块中,提供给所有消费者使用

示例图:
SpringCloud之Feign_第5张图片

1.新建一个feign-api的module,引入feign的starter依赖



2.将服务中编写的FeignClient、POJO、默认Feign配置复制到feign-api中

SpringCloud之Feign_第6张图片



3.将feign-api打包成jar包,供服务引入

注意:因为feign-api中并没有main程序,需要再pom.xml中加入

SpringCloud之Feign_第7张图片

再进行打包,最后导入到对应的服务中:

SpringCloud之Feign_第8张图片



4.修改服务中导入feign-api包的配置



5.重启测试



实战遇到的问题:

此时SpringBootApplication已经扫描不到FeignClient了,FeignClient就无法使用。
可以通过以下两种方式解决:

  1. 指定FeignClient所在包

     @EnableFeignClients(basePackages = "com.maoge.feign.FeignClient")
    
  2. 指定FeignClient字节码

     @EnableFeignClients(clients = UserClient.class)
    

你可能感兴趣的:(Spring,Cloud,Alibaba,Spring,Cloud,Spring,Boot,spring,cloud,java,spring)