写点什么

SpringCloud Feign 远程调用(史上最详细讲解)

作者:
  • 2022 年 9 月 13 日
    河南
  • 本文字数:1809 字

    阅读完需:约 6 分钟

SpringCloud Feign 远程调用(史上最详细讲解)

前言

Feign 是声明式的 web service 客户端,它让微服务的调用变得更简单了,帮助我们优雅的实现 http 请求的发送。SpringCloud 集成了 Ribbon 和 Eureka,可在使用 Feign 时提供负载均衡的 http 客户端。



1、Feign 介绍

利用 RestTemplate 发起远程调用代码如下:


//urlString url = "http://user-service:8081/user/" + order.getUserId();//发起调用User user = restTemplate.getForObject(url,User.class);
复制代码


此时代码可读性差,参数复杂 URL 难以维护。


而 Feign 是一个声明式的 http 客户端,其作用就是帮助我们优雅的实现 http 请求的发送。


官方地址:https://github.com/OpenFeign/feign



2、Feign 的使用

Feign 替代 RestTemplate 的步骤如下:

1、引入依赖

在调用其他微服务的微服务 order-service 的 pom.xml 中添加。


<dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
复制代码

2、添加注解

在调用其他微服务的微服务 order-service 的启动类添加注解开启 Feign 的功能。


@SpringBootApplication@EnableFeignClientspublic class OrderApplication {    public static void main(String[] args) {        SpringApplication.run(OrderApplication.class, args);    }    @Bean    @LoadBalanced    public RestTemplate restTemplate() {        return new RestTemplate();    }}
复制代码

3、编写 Feign 的客户端

新建一个接口,代码如下。


@FeignClient("user-service")public interface UserClient {    @GetMapping("/user/{id}")    User findById(@PathVariable("id") Long id);}
复制代码


这个客户端主要是基于 SpringMVC 的注解来声明远程调用的信息,Feign 就可以帮助我们发送 http 请求,无需自己使用 RestTemplate 来发送了。

4、测试

修改 order-service 中的 queryOrderById 方法,使用 Feign 客户端代替 RestTemplate。


 @Autowired    private UserClient userClient;    public Order queryOrderById(Long orderId) {        // 1.查询订单        Order order = orderMapper.findById(orderId);        //url        //String url = "http://localhost:8081/user/" + order.getUserId();        //String url = "http://user-service:8081/user/" + order.getUserId();        //发起调用        //User user = restTemplate.getForObject(url,User.class);        //3、Feign实现        User user = userClient.findById(order.getUserId());        //3.存入order        order.setUser(user);        // 4.返回        return order;    }
复制代码



3、Feign 的自定义配置

Feign 可以支持很多的自定义配置,一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的 @Bean 覆盖默认 Bean 即可,如下表所示:



自定义配置 有 配置文件方式 和 Java 代码方式 两种方式,在此不展开讲述了。

4、Feign 的优化使用

1、引入依赖

在 order-service 的 pom 文件中引入 Apache 的 HttpClient 依赖:


<!--httpClient的依赖 --><dependency>    <groupId>io.github.openfeign</groupId>    <artifactId>feign-httpclient</artifactId></dependency>
复制代码

2、配置连接池

在 order-service 的 application.yml 中添加配置:


feign:  client:    config:      default: # default全局的配置        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息  httpclient:    enabled: true # 开启feign对HttpClient的支持    max-connections: 200 # 最大的连接数    max-connections-per-route: 50 # 每个路径的最大连接数
复制代码


Feign 的优化:日志级别尽量用 basic;使用 HttpClient 或 OKHttp 代替 URLConnection。

5、Feign 的最佳实践

1、继承方式

1)定义一个 API 接口,利用定义方法,并基于 SpringMVC 注解做声明。


2)Feign 客户端和 Controller 都集成改接口



优点:


  • 简单

  • 实现了代码共享


缺点:


  • 服务提供方、服务消费方紧耦合

  • 参数列表中的注解映射并不会继承,因此 Controller 中必须再次声明方法、参数列表、注解

2、抽取方式

将 Feign 的 Client 抽取为独立模块,并且把接口有关的 POJO、默认的 Feign 配置都放到这个模块中,提供给所有消费者使用。



总结

其实 Feign 就是一个声明式的 http 客户端,帮助我们实现优雅的 http 请求的发送。以上就是 Feign 实现远程调用的全部内容,仅供参考,最后送上一句,每日毒鸡汤:“半夜給你留燈的,只有自動售貨機。”

发布于: 刚刚阅读数: 4
用户头像

关注

在校大三学生一枚 2022.08.02 加入

喜欢学习编程,擅长技术栈JAVA

评论

发布
暂无评论
SpringCloud Feign 远程调用(史上最详细讲解)_SpringCloud_斯_InfoQ写作社区