当前位置: 首页 > news >正文

Http客户端 Feign 的使用 (黑马springcloud笔记)

Feign基本使用

目录

  • Feign基本使用
    • 一、Feign代替RestTemplate
    • 二、自定义配置
    • 三、Feign使用优化
      • 1. 底层优化
      • 2. 日志优化
    • 四、最佳实践
      • 方式一:继承
      • 方式二:抽取

一、Feign代替RestTemplate

步骤:

  1. 引入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 启动类上添加注解@EnableFeignClients

  3. 编写Feign客户端

    @FeignClient("userService")
    public interface UserApi {
        @GetMapping("/user/{id}")
        User findById(@PathVariable Long id);
    }
    
  4. 使用

    这是RestTemplate的代码

    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
        @Autowired
        RestTemplate restTemplate;
    
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.调用REST接口查询数据
            User user = restTemplate.getForObject("http://userService/user/" + order.getUserId(), User.class);
            // 3.封装数据
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    

    这是Feign的代码:

    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
        
        @Autowired
        UserApi userApi;
        
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.调用REST接口查询数据
            User user = userApi.findById(order.getUserId());
            // 3.封装数据
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    

    代码可读性更高了,并且自带负载均衡。

二、自定义配置

feign可以自定义配置一些东西:

在这里插入图片描述

springboot中配置一般都是两种方式,代码或者application.yml

  1. 代码

    @Bean
    public Logger.Level feignLogLevel() {
        return Logger.Level.FULL;
    }
    

    若是全局生效,需要在启动类的注解中加上该配置类:

    @EnableFeignClients(defaultConfiguration = CustomConfiguration.class)
    

    若是局部,只需要在对应的客户端中声明:

    @FeignClient(value = "userService", configuration = CustomConfiguration.class)
    
  2. application.yml

    配置文件同样也可以配置全局或者局部

    全局:

    feign:
      client:
        config:
          default: # 这个就是区分全局或者局部的 若是default则是全局
            logger-level: full
    

    局部:

    feign:
      client:
        config:
          userService: # 这个就是区分全局或者局部的 若是default则是全局
            logger-level: full
    

三、Feign使用优化

1. 底层优化

Feign底层实现默认是URLConnection,不支持连接池,效率低。

我们可以选择Apache HttpClient或是OKHttp(俩都支持连接池)来优化Feign的性能。

以HttpClient为例:

  • 引入依赖

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
    </dependency>
    
  • 配置连接池

    feign:
      httpclient:
        enabled: true # 开启feign对httpclient的支持
        max-connections: 200 # 最大连接数
        max-connections-per-route: 50 # 每个路径最大连接数
    

2. 日志优化

简单说就是使用NONE级别或是BASIC级别,级别高了消耗性能。

四、最佳实践

方式一:继承

给消费者的FeignClient和提供者的Controller定义一个统一的父接口作为标准。

在这里插入图片描述

缺点:紧耦合

方式二:抽取

就是搞一个公共的模块,把多个微服务都需要的接口写在里面,需要使用时引入即可。

在这里插入图片描述

缺点就是会引入很多不用的东西。

实现:

  1. 创建新的公共模块,导入feign的依赖,创建普通maven项目即可,不然打包时有坑。

  2. 将order-service中的Feign客户端、实体类、Feign的配置等移入该公共模块

  3. 在order-service中引入该公共模块

    如:

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>feign-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    
  4. 指定客户端

    两种方式

    • 扫描包,全部导入

      @EnableFeignClients(basePackages = "com.example.feignapi.apis")
      

      该包下的所有feign客户端都会被扫描

    • 指定客户端导入

      @EnableFeignClients(clients = {UserAPI.class})
      

      指定客户端,可以是一个数组

    建议使用第二种。

  5. 测试在这里插入图片描述

相关文章:

  • 幼儿园网站设计/太原做网站的
  • 植物提取网站做的比较好的厂家/天津搜狗seo推广
  • wordpress静态化首页/同仁seo排名优化培训
  • 品牌网站建设要选磐石网络/seo外包公司怎么样
  • 新建网站怎么做关键词/如何进行关键词分析
  • 太原要做网站的公司/免费推广渠道有哪些
  • Docker(黑马spring cloud笔记)
  • Wav2Vec HuBert 自监督语音识别模型
  • 【信息系统项目管理师】复盘沟通管理论文素材
  • 算法刷题打卡第67天:句子相似性 III
  • 抖音素人对接需要注意什么?合作时注意不要被薅羊毛了
  • 教程:Flutter 和 Rust混合编程,使用flutter_rust_bridge自动生成ffi代码
  • MyBatis-Plus基本操作
  • LeakCanary简要原理
  • 八、MySQL 常用函数汇总(1)
  • Java运算符(二)
  • AppScan被动手动探索扫描
  • word怎么转换成pdf?其实很简单,看这里即可!