• 【黑马-SpringCloud技术栈】【06】Feign(OpenFeign)



    持续学习&持续更新中…

    守破离


    Feign替代RestTemplate

    RestTemplate方式调用存在的问题

    先来看我们以前利用RestTemplate发起远程调用的代码:

    在这里插入图片描述

    存在下面的问题:

    • 代码可读性差,编程体验不统一
    • 参数复杂URL难以维护

    Feign的介绍

    Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign

    其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。

    在这里插入图片描述

    快速上手

    使用Feign的步骤如下:

    引入依赖:

    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在order-service的启动类添加注解开启Feign的功能:

    @MapperScan("cn.itcast.order.mapper")
    @SpringBootApplication
    @EnableFeignClients
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    编写Feign客户端:

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

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

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

    用Feign客户端代替RestTemplate

    @Service
    public class OrderService {
        @Autowired
        private OrderMapper orderMapper;
        @Autowired
        private UserClient userClient;
    
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.查询用户
            final User user = userClient.findById(order.getUserId());
            // 3.设置user信息
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    自定义配置

    Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:

    在这里插入图片描述

    配置Feign日志有两种方式:

    方式一:配置文件方式

    全局生效:

    在这里插入图片描述

    局部生效:

    在这里插入图片描述

    方式二:Java代码方式,需要先声明一个Bean:

    在这里插入图片描述

    全局生效:

    而后如果是全局配置,则把它放到@EnableFeignClients这个注解中:

    在这里插入图片描述

    局部生效:

    如果是局部配置,则把它放到@FeignClient这个注解中:

    在这里插入图片描述

    Feign使用优化

    Feign底层的客户端实现:

    • URLConnection:默认实现,不支持连接池
    • Apache HttpClient :支持连接池
    • OKHttp:支持连接池

    因此优化Feign的性能主要包括:

    • 使用连接池代替默认的URLConnection
    • 日志级别,最好用basic或none

    连接池配置:Feign添加HttpClient的支持

    引入依赖:

    在这里插入图片描述

    配置连接池:

    在这里插入图片描述

    Feign的优化总结

    • 日志级别尽量用basic/none

    • 使用HttpClient或OKHttp代替URLConnection

      • 引入feign-httpClient依赖
      • 配置文件开启httpClient功能,设置连接池参数

    最佳实践

    方式一(继承)

    给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。让controller和FeignClient继承同一接口

    • 服务紧耦合
    • 父接口参数列表中的映射不会被继承

    在这里插入图片描述

    方式二(抽取)

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

    • 有可能某个服务用不上FeignClient的所有接口,但还是要全部引用过来,造成浪费

    在这里插入图片描述

    实现最佳实践方式二的步骤如下:

    1. 首先创建一个module,命名为feign-api,然后引入feign的starter依赖
    2. 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
    3. 在order-service中引入feign-api的依赖
    4. 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
    5. 重启测试

    当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:

    @EnableFeignClients(basePackages = "cn.itcast.feign.clients")
    
    • 1

    @EnableFeignClients(clients = {UserClient.class})
    
    • 1

    总结:不同包的FeignClient的导入有两种方式:

    • 在@EnableFeignClients注解中添加basePackages,指定FeignClient所在的包
    • 在@EnableFeignClients注解中添加clients,指定具体FeignClient的字节码

    参考

    黑马程序员:SpringCloud微服务技术栈.


    本文完,感谢您的关注支持!


  • 相关阅读:
    C++从入门到精通——模板
    Java基础知识(知识点)二
    SpringBoot中的日志使用
    双流机场到天府机场ADS-B数据导入MATLAB
    【Windows Server 2019】存储服务器的配置和管理——iSCSI的安装和配置(下)
    概率论的学习和整理9:0-1分支 和 二项分布
    计算机毕业设计(附源码)python志愿者招募系统
    企业实施ERP系统遇到的问题及应对措施
    4.k8s部署私人仓库并且部署java服务案例
    mongodb聚合查询示例
  • 原文地址:https://blog.csdn.net/weixin_44018671/article/details/123077475