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

Feign基本使用

目录

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

一、Feign代替RestTemplate

步骤:

  1. 引入依赖

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    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可以自定义配置一些东西:

Http客户端 Feign 的使用 (黑马springcloud笔记)_第1张图片

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.openfeigngroupId>
        <artifactId>feign-httpclientartifactId>
    dependency>
    
  • 配置连接池

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

2. 日志优化

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

四、最佳实践

方式一:继承

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

Http客户端 Feign 的使用 (黑马springcloud笔记)_第2张图片

缺点:紧耦合

方式二:抽取

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

Http客户端 Feign 的使用 (黑马springcloud笔记)_第3张图片

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

实现:

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

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

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

    如:

    <dependency>
        <groupId>com.examplegroupId>
        <artifactId>feign-apiartifactId>
        <version>0.0.1-SNAPSHOTversion>
    dependency>
    
  4. 指定客户端

    两种方式

    • 扫描包,全部导入

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

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

    • 指定客户端导入

      @EnableFeignClients(clients = {UserAPI.class})
      

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

    建议使用第二种。

  5. 测试Http客户端 Feign 的使用 (黑马springcloud笔记)_第4张图片

你可能感兴趣的:(微服务,spring,cloud,http,java,feign,微服务)