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


    作者:大三的土狗
    专栏:SpringCloud
    在这里插入图片描述

    前言

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

    在这里插入图片描述

    1、Feign 介绍

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

    //url
    String url = "http://user-service:8081/user/" + order.getUserId();
    //发起调用
    User user = restTemplate.getForObject(url,User.class);
    
    • 1
    • 2
    • 3
    • 4

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

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

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

    在这里插入图片描述

    2、Feign 的使用

    Feign替代RestTemplate的步骤如下:

    1、引入依赖

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

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    2、添加注解

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

    @SpringBootApplication
    @EnableFeignClients
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    3、编写Feign的客户端

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

    @FeignClient("user-service")
    public interface UserClient {
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这个客户端主要是基于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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    3、Feign的自定义配置

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

    类型作用说明
    feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
    feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
    feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
    feign. Contract支持的注解格式默认是SpringMVC的注解
    feign. Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

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

    4、Feign的优化使用

    1、引入依赖

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

    
    <dependency>
        <groupId>io.github.openfeigngroupId>
        <artifactId>feign-httpclientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    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 # 每个路径的最大连接数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    5、Feign的最佳实践

    1、继承方式

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

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

    在这里插入图片描述

    优点:

    • 简单
    • 实现了代码共享

    缺点:

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

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

    2、抽取方式

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

    在这里插入图片描述

    总结

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

  • 相关阅读:
    Haproxy+Nginx搭建Web集群部署
    C# 日志框架Serilog使用
    运维自动化:提高效率的秘诀
    SSE 服务端消息推送
    二〇二二年终总结
    CNN的实现与可视化
    C# 如何将使用的Dll嵌入到.exe应用程序中?
    【使用教程】在Ubuntu下PMM60系列一体化伺服电机通过PDO跑循环同步位置模式详解
    Python通过Flask+pyecharts对房地产数据实现数据分析结果Web可视化(二)
    JVM 彻底搞懂什么是老年代空间分配担保机制
  • 原文地址:https://blog.csdn.net/qq_53463544/article/details/126700045