• 8、Feign远程调用


    先来看我们以前利用RestTemplate发起远程调用的代码:
    在这里插入图片描述
    通过观察以上调用方式,可以看出,这也属于一种硬编码的方式,容易带来以下问题:

    • 代码可读性差,编程体验不统一
    • 参数复杂URL难以维护(带了许多个参数的请求)

    对于以上问题,Feign提供了一套解决方案。

    Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign,其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
    在这里插入图片描述

    一、Feign替代RestTemplate

    Fegin的使用步骤如下:

    1.引入依赖
    2.添加注解
    3.编写Feign的客户端

    (1)引入依赖

    我们在orderService服务 (调用方) 的pom文件中引入feign的依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    (2)添加注解

    服务调用方的启动类 添加 @EnableFeignClients 注解开启Feign的功能:
    在这里插入图片描述

    (3)编写Feign的客户端

    在orderService中新建一个接口,内容如下:

    package cn.itcast.order.client;
    
    import cn.itcast.order.pojo.User;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    @FeignClient("userservice")
    public interface UserClient {
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:

    • 服务名称:userservice
    • 请求方式:GET
    • 请求路径:/user/{id}
    • 请求参数:Long id
    • 返回值类型:User

    这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。

    (4)测试

    修改orderService服务中的OrderController类中的queryOrderById方法,使用Feign客户端代替RestTemplate:

    @AutoWired
    private  UserClient userClient;
    
    public Order queryOrderById(Long orderId){
    	//1.查询订单
    	Order order = orderMapper.findById(orderId);
    	//2.利用Feign发起http请求,查询用户
    	User user = userClient.findById(order.getUserId());
    	//3.封装User到Order
    	order.setUser(user);
    	//返回
    	return order;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    可以看到,通过这种方式进行调用,和我们之前使用的方法调用方式没有任何区别,极大的提升了代码的可阅读性和可维护性。

  • 相关阅读:
    【无标题】
    [Linux] 网络协议之TCP/IP五层模型
    项目场景 with ERRTYPE = cudaError CUDA failure 999 unknown error
    在springboot中整合mybatis配置流程!
    python之正则表达式【简化版】
    数据体系规范化
    深度学习 框架代码(草稿)
    【模型压缩】实例分析量化原理
    An Early Evaluation of GPT-4V(ision)
    deepvariant 基因变异识别算法docker版使用
  • 原文地址:https://blog.csdn.net/qq_49451343/article/details/125444625