OpenFeign的远程调用使用HttpClient优化性能 及 最佳实践方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenFeign的远程调用使用HttpClient优化性能 及 最佳实践方式相关的知识,希望对你有一定的参考价值。

(目录)


Feign远程调用

先来看我们以前利用RestTemplate发起远程调用的代码:

存在下面的问题:



1.Feign替代RestTemplate

1)引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2)添加注解


3)编写Feign的客户端

内容如下:

package cn.itcast.order.client;

import cn.itcast.order.pojo.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 findById(@PathVariable("id") Long id);

这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:

这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。


4)测试

是不是看起来优雅多了。


5)总结

使用Feign的步骤:


2.自定义配置

Feign可以支持很多的自定义配置,如下表所示:

类型 作用 说明
feign.Logger.Level 修改日志级别 包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder 响应结果的解析器 http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder 请求参数编码 将请求参数编码,便于通过http请求发送
feign. Contract 支持的注解格式 默认是SpringMVC的注解
feign. Retryer 失败重试机制 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

下面以日志为例来演示如何自定义配置。

2.1.配置文件方式

feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别 
feign:  
  client:
    config: 
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

而日志的级别分为四种:

FULL日志 的效果:


2.2.Java代码方式

public class DefaultFeignConfiguration  
    @Bean
    public Logger.Level feignLogLevel()
        return Logger.Level.BASIC; // 日志级别为BASIC
    

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class) 

3.Feign使用优化

Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

因此提高Feign的性能主要手段就是使用连接池 代替 默认的URLConnection


这里我们用Apache的HttpClient来演示

1)引入依赖

<!--httpClient的依赖 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

2)配置连接池

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

接下来,在FeignClientFactoryBean中的loadBalance方法中打断点:

Debug方式启动order-service服务,可以看到这里的client,底层就是Apache HttpClient:


总结 Feign的优化:


4.最佳实践

feign客户端:

UserController:

有没有一种办法简化这种重复的代码编写呢?


4.1.继承方式

一样的代码可以通过继承来共享

优点:

缺点:


4.2.抽取方式

例如:


4.3.实现基于抽取的最佳实践

1)抽取

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>


2)在order-service中使用feign-api

首先,删除order-service中的UserClient、User、DefaultFeignConfiguration等类或接口。

<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

3)重启测试


4)解决扫描包问题

方式一:

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")

方式二:

@EnableFeignClients(clients = UserClient.class)

以上是关于OpenFeign的远程调用使用HttpClient优化性能 及 最佳实践方式的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud系列——openfeign远程服务调用实战

使用OpenFeign远程调用别的微服务(member调用coupon中的方法)

OpenFeign的远程调用使用HttpClient优化性能 及 最佳实践方式

远程调用(OpenFeign)

远程调用(OpenFeign)

OpenFeign快速入门