SpringCloud:Feign

文章目录

  • Feign
    • 快速入门(在orderservice中调用userservice服务)
    • 配置日志
    • 性能优化
      • 1. 日志级别推荐设置成basic
      • 2. 连接池优化
        • 步骤
    • 最佳实践
      • 方式一 (继承)
      • 方式二 (抽取)

Feign

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

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

  1. 导入依赖
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-openfeignartifactId>
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. 测试结果

SpringCloud:Feign_第1张图片

配置日志

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

结果如下:

SpringCloud:Feign_第2张图片

性能优化

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

2. 连接池优化

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

步骤
  1. 导入依赖
<dependency>
    <groupId>io.github.openfeigngroupId>
    <artifactId>feign-httpclientartifactId>
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 配置都放在这个模块中,提供给消费者使用。结构如下所示。

SpringCloud:Feign_第3张图片

  • 但是这种方式也有一个缺点,就是当消费者 order-service 只想调用 feign-api 里的一两个方法,而把项目 jar 包整个引入就显得有点冗余了。
  • 可见,两种最佳实践都并不是完美的。如果你在意面向契约编程,就采用方式一。如果你更在意耦合度,那就采用方式二。都要根据具体业务的实际情况决定。

你可能感兴趣的:(springcloud,spring,cloud,spring,后端,java,微服务)