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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Feign基本使用

目录

一、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. 测试在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring