SpringCloud:Feign

发布时间:2024年01月15日

Feign

Feign是Spring Cloud提供的声明式、模板化的HTTP客户端, 它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。

快速入门(在orderservice中调用userservice服务)

  1. 导入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 启动类中加入@EnableFeignClient注解
@SpringBootApplication
@MapperScan("com.lhs.mapper")
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args){
        SpringApplication.run(UserApplication.class,args);


    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  1. 创建Feign客户端
package com.lhs.clients;

import com.lhs.entity.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 fingById(@PathVariable("id") Long id);
}
  1. 调用客户端发送请求
@Service("orderService")
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
    @Autowired
    public  RestTemplate restTemplate;

    @Autowired
    private UserClient userClient;
    public Order getOrder(Long id){
        Order order = getById(id);
        User user = userClient.fingById(order.getUserId());
        order.setUser(user);
        return  order;
    }
}
  1. 测试结果

请添加图片描述

配置日志

feign:
	client:
		config:
        	default: #此处写的是服务名称,针对我们feign微服务的配置,如果是default就是全局配置
            	loggerLevel: full #配置Feign的日志级别,相当于代码配置方式中的Logger(推荐none或basic)
logging:
  level:
    com.lhs.clients.UserClient: debug    # 客户端接口的全限定名

结果如下:

请添加图片描述

性能优化

1. 日志级别推荐设置成basic

2. 连接池优化

Feign默认使用HttpURLConnection去发送请求,每次请求都会建立、关闭连接,很消耗时间。但是Feign还支持使用Apache的httpclient 以及OKHTTP去发送请求,其中Apache的HTTPClient和OKHTTP都是支持连接池的。

步骤
  1. 导入依赖
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>
  1. 配置
feign:
  client:
    config:
      default: #此处写的是服务名称,针对我们feign微服务的配置,如果是default就是全局配置
        loggerLevel: full #配置Feign的日志级别,相当于代码配置方式中的Logger(推荐none或basic)
  httpclient:
    enabled: true  # 开启对httpclient的支持
    max-connections: 200  # 最大连接数
    max-connections-per-route: 50   # 每个路径的最大连接数

最佳实践

方式一 (继承)

给消费者的 FeignClient 和提供者的 controller 定义统一的父接口作为标准。(不推荐)

方式二 (抽取)

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

  • 以前,消费者远程调用提供者的接口时,都把 FeignClient 写在消费者的服务之中。
    但是,这种写法有个问题。当未来微服务越来越多,大家都来调用 user-service 的接口,那么 UserClient 就写了很多遍,重复开发。
  • 现在,抽取出一个独立的模块 feign-api ,把接口有关的 POJO 、默认的 Feign 配置都放在这个模块中,提供给消费者使用。结构如下所示。

请添加图片描述

  • 但是这种方式也有一个缺点,就是当消费者 order-service 只想调用 feign-api 里的一两个方法,而把项目 jar 包整个引入就显得有点冗余了。
  • 可见,两种最佳实践都并不是完美的。如果你在意面向契约编程,就采用方式一。如果你更在意耦合度,那就采用方式二。都要根据具体业务的实际情况决定。
文章来源:https://blog.csdn.net/weixin_74144099/article/details/135468029
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。