Feign远程调用

Java猫

共 5007字,需浏览 11分钟

 ·

2021-09-20 09:51

Feign入门

Ribbon可以调用远程服务,但是不是最佳的选择,我们可以选择Feign组件。


Feign是在Ribbon的基础上进行了封装。


1. Feign简介

Feign是Netflix开发的声明式、模板化的HTTP客户端。

  • Feign可帮助我们更便捷,优雅的调用HTTP API。

  • 在SpringCloud中,使用Feign非常简单--创建一个接口,并在接口上添加一些注解,代码就完成了。

  • Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

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


Feign具备了Ribbon的负载均衡功能和Eureka的服务注册。


使用feign我们更多的是关注服务消费者,服务消费者如何调用服务提供者微服务。



2. 基于Feign远程服务调用


使用feign步骤:

  1. 导入依赖

  2. 配置调用接口

  3. 在启动类上激活feign

  4. 通过自定义的接口调用远程微服务


1.导入Feigfn依赖
在服务消费者中加入依赖

<!-- SpringCloud整合的openfeign依赖 -->
 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>


2.配置调用接口

服务消费者的合适包中创建feign远程调用微服务接口

每个接口方法对应的是服务提供者暴露的调用API

/**
 *  Feign调用接口
 * 
 * 1.声明需要调用的微服务名称
 * @FeignClient
 *      name:服务提供者名称
 */

@FeignClient(name = "service-product"//服务提供者名称
public interface ProductFeignClient {

    /**
     * 2.配置需要调用的微服务接口
     */

    @RequestMapping(value = "/product/{id}",method = RequestMethod.GET)
    public Product findById(@PathVariable("id") Integer id);
}

提示:@FeignClient请求ip路径和@RequestMapping请求接口地址组成了请求RUL。

  • 定义各参数绑定时, @PathVariable,@RequestParam,@RequestHeader等可以指定参数属性,在Feign中绑定参数必须通过value属性来指明具体的参数名,不然会抛出异常

  • @FeignClient :注解通过name指定需要调用的微服务的名称,用于创建Ribbon的负载均衡器。所以Ribbon会把service-product这个微服务解析为注册中心的服务。


3.启动类开启激活feign

服务消费者启动类开启feign注解

/**
 * 订单服务启动类 (服务消费者)
 * @Author 黄柏茗
 * @Date 2021-09-09
 */

//激活feign
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
        System.err.println("订单微服务启动成功");
    }
}



4.通过feign接口进行远程调用微服务

服务消费者中调用feign接口进行远程访问微服务

/**
 * 订单Controller
 */

@RestController
public class OrderController {

    /**
     * 1.注入feign调用接口
      */
        
    @Autowired
    private ProductFeignClient productFeignClient;

    /**
     * 下订单
     * @param id
     * @return
     */

    @RequestMapping("/buy/{id}")
    public Product getProductById(@PathVariable Integer id) {
        //2.使用feign接口进行远程服务调用微服务
        Product product = productFeignClient.findById(id);
       return product;
    }

我们在调用的时候,可以发现,在远程调用微服务的时候,不用拼接URL了,更


测试:



5. Feign和Ribbon的关系

Ribbon是一个基于HTTP和TCP客户端的负载均衡的工具。

它可以在客户端配置RibbonServerList (服务端列表) ,使用HttpClient或RestTemplate模拟http请求,步骤相当繁琐。


Feign是在Ribbon的基础上进行了一次改进,是一个使用起来更加方便的HTTP客户端。采用接口的方式,只需要创建一个接口,然后在上面添加注解即可,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。然后就像是调用自身工程的方法调用,而感觉不到是调用远程方法,使得编写客户端变得非常容易。


简单理解:

Feigin天生具备负载均衡功能,



6.负载均衡

feign本身已经集成了Ribbon依赖和自动配置,因此我们不需要额外的引入依赖,也不需要注册RestTemplate对象。


feign基于ribbon。


我们可以像配置Ribbon那样去配置负载均衡配置,通过 riboon.xx 进行全局配置,也可以通过 服务名.ribbon.xx 来指定服务配置。


使用Ribbon的配置来修改负载均衡配置即可。


测试环境基于Eureka。

模拟启动2个提供相同的微服。



测试:



7.请求压缩

SpringCloud Feign支持对请求或响应的数据进行GZIP压缩,减少通信过程中的性能损耗。


消费者使用数据压缩配置即可。


开启请求与响应的压缩功能:

#开启feign请求与响应的数据压缩
feign:
  compression:
    request:
      enabled: true #开启请求压缩
    response: true #开启请求压缩


8.Feign日志级别

开发阶段希望看到Feign请求过程的日志记录,默认Feign日志是不开启的。

想要使用配置方式来达到日志效果,在yml文件配置即可。


使用简单,配置压yml文件即可。

消费者中修改yml,增加feign的日志配置

#开启feign请求与响应的数据压缩
feign:
  compression:
    request:
      enabled: true #开启请求压缩
    response: true #开启请求压缩
 
 #Feign日志输出 (看这里!!!!)
  # 日志配置:NONE:不输出日志  BASIC:适用于生产环境追踪问题 HEADERS:在BASIC基础上记录请求和响应头信息 FULL:记录所有
  client:
    config:
      service-product: #需要调用的服务名称
        loggerLevel: FULL
#日志输出
logging:
  level:
    com.hbm.order.feign.ProductFeignClient: debug #可选择feign的接口全限定类名



测试到服务调用时,Feign调用日志已经输出




总结:

重点是在Feign的使用

使用feign步骤:

  1. 导入依赖

  2. 配置调用接口

  3. 在启动类上激活feign

  4. 通过自定义的接口调用远程微服务


浏览 84
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报