Feign使用

1、Feign概述

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。

Feign使用_第1张图片


2、Feign入门

2.1、添加依赖



    org.springframework.cloud
    spring-cloud-starter-openfeign

  • application.yml
server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.209.129:8848
  application:
    name: feign-consumer

2.2、启动类添加注解@EnableFeignClients

package com.itmuch.cloud.study;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
 
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class FeignApplication {
  public static void main(String[] args) {
    SpringApplication.run(FeignApplication .class, args);
  }
}

2.2、创建服务提供者(provider) 

//创建服务提供者
@RestController
@RequestMapping("/provider")
public class ProviderController {
	
	@Autowired
	private UserService userService;
 
	@RequestMapping("/getUserById/{id}")
	public User getUserById(@PathVariable Integer id){
		return userService.getUserById(id);
	}
}

2.3、创建Feign接口 @FeignClient

/**
 * @FeignClient 一般采用服务名进行命名
 * name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
 * url: url一般用于调试,可以手动指定@FeignClient调用的地址
 *
 * @RequestMapping 主要用于feign框架拼接传递url,弥补了Ribbon的url需要手动拼接的缺陷
 * @PathVariable("id") 当路径为restful风格时路径传参方式
 * @RequestParam("id") 当路径为?id=250 时传参方式
 * @RequestBody User user 当路径为对象时采用的传参方式,(集合、数组等都属于对象)
 */
@FeignClient("feign-provider")
@RequestMapping("/provider")
public interface UserFeign {
 
    @RequestMapping("/getUserById/{id}")
    User getUserById(@PathVariable("id") Integer id);
 
    @RequestMapping("/deleteUserById")
    User deleteUserById(@RequestParam("id") Integer id);//?形式拼接参数,?id=250
 
    @RequestMapping("/addUser")
    User addUser(@RequestBody User user);//pojo--->json
}

2.4、创建服务消费者(consumer) 

//服务消费者
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
 
    @Autowired
    private UserFeign userFeign;
 
    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userFeign.getUserById(id);
    }
}

3、Feign 原理

1、将feign接口的代理类扫描到Spring容器中,
   @EnableFeignClients开启feign注解扫描,
   FeignClientsRegistrar.registerFeignClients()扫描被 @FeignClient标识的接口生成代理类,
   并把接口和代理类交给Spring的容器管理。
2、为接口的方法创建RequestTemplate,
   当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()
   创建RequestTemplate(url,参数)
3、发出请求代理类会通过RequestTemplate创建Request,
   然后client(URLConnetct、HttpClient、OkHttp)使用Request发送请求

4、Feign优化

4.1、开启Feign日志

Feign使用_第2张图片

application.yml

 
feign:
  client:
    config:
      feign-provider: #此处写的是服务名称,针对我们feign微服务的配置,如果是default就是全局配置
        loggerLevel: full #配置Feign的日志级别,相当于代码配置方式中的Logger
 
#在application.yml中使用 logging.level. 的参数配置格式来开启指定客户端日志
logging:
  level:
    com.bjpowernode.feign: debug

Feign使用_第3张图片 4.2、Feign超时问题

首先、Feign的负载均衡底层用的就是Ribbon,所以这里的请求超时配置其实就是配置Ribbon,当出现请求超时会出现以下报错。

Feign使用_第4张图片

注意 :当开启日志配置之后,feign超时问题不会出现报错情况。 

针对超时问题我们需要在之前的日志配置中加入以下内容

ConnectTimeout: 5000 #请求连接的超时时间
ReadTimeout: 5000 #请求处理的超时时间

Feign使用_第5张图片

4.3、HTTP连接池

  • 连接池介绍

首先,我们知道HTTP连接需要经过三次握手,四次挥手的过程,这是很耗费性能的;所以HTTP连接池帮助我们节省了这一步。

同时Feign的HTTP客户端支持三种框架:

HttpURLConnection、HttpClient、OkHttp;默认是HttpURLConnection

  • 连接池使用

  引入依赖


    io.github.openfeign
    feign-httpclient

在配置文件中我们看到,连接池引入之后默认是开启的,所以我们就不用再写了

Feign使用_第6张图片

4.4、gzip压缩 

当 Gzip 压缩到一个纯文本文件时,效果是非常明显的,大约可以减少 70%以上的文件大小。·

这个开启也是比较简单,只需要在consumer中yml文件中写入以下代码即可

Feign使用_第7张图片

此时在浏览器中就可以看到我们提供的压缩方式,和浏览器支持的压缩方式 

Feign使用_第8张图片

你可能感兴趣的:(1024程序员节)