声明式服务调用OpenFeign



PS: 本文为作者学习笔记,实际技术参加意义不大,本文将持续改进完善。

一. OpenFeign

OpenFeign是一个声明式的http客户端,SpringCloud生态中服务调用的一个组件。
相关的服务调用组件还有: Feign、Ribbon、LoadBalancer等等
官方地址:点击跳转
其作用就是帮助我们优雅的实现http请求的发送

1. Feign 与 OpenFeign

Feign:
Feign,是Spring Cloud组件中的一个轻量级RESTfulE的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口就可以调用服务注册中心的服务。
依赖:

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

OpenFeign
OpenFeign,是Spring Cloud在Feign的基础上支持了SpringMVC的注解如@RequesMapping等等。OpenFeign的@FeignClienti可以解析,SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
依赖:

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

PS: 其实完全可以将OpenFeign理解为Feign的升级版。

二. OpenFeign的使用

想要使用OpenFeign,首先需要引入OpenFeign的依赖:

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

然后在模块的主启动类上添加 @EnableFeignClients 注解,如下:

@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderFeignMain80.class,args);
    }
}

然后就可以开始编写客户端代码(声明式的方式)如下:
在这里插入图片描述
其中 userservice 是注册中心中的服务名、请求方式是 get 、请求路径是 /user/{id}
使用时我们只要使用自动注入的方式生成一个接口实例调用其中的方法即可:

@Autowired
private UserClient userClient;
// 调用
User user = userClient.findById(order.getUserId());

值得注意的是: OpenFeign中集成了ribbon,自带负载均衡。

三. OpenFeign自定义配置

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:
在这里插入图片描述
日志级别说明:

  1. 【NONE】也是默认的日志级别,就是没有日志
  2. 【BASIC】当发起一次hppt请求时会帮我们记录下来请求什么时候发起的已经什么时候结束的,耗时等基本信息。
  3. 【HEADERS】除了上面basic的基本信息以外,还会带上请求头等信息
  4. 【FULL】在上面basic的基础上还会加上请求体响应体等信息记录下来

PS: 顺嘴提一句失败重试机制,就是请求服务失败,一段时间后会自动请求其他相同业务的服务实例,直到拿到结果,或者全部请求失败。

1. 修改日志级别

一般我们使用的最多的就是修改日志级别,一般有两种方式,一种是通过配置来修改日志级别,另一种方式是通过java代码的方式进行日志级别的修改:
方式一: 配置文件方式
全局配置:

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

局部配置:

feign: 
	client:
	  config:
		  userservice:  
			  loggerLevel: FULL  #日志级别

方式二: java代码配置方式
使用Bean的方式进行配置:

public class FeignclientConfiguration{
    
    
	@Bean
	public Logger.Level feignLogLevel(){
    
    
		return Logger.Level.BASIC;
		}
}

如果是全局配置则放到: 启动类上面的注解

@EnableFeignclients(defaultConfiguration FeignclientConfiguration.class)

如果是局部配置则放到: 调用接口上的注解,通过value的值指定配置的微服务名

@Feignclient(value "userservice",configuration FeignclientConfiguration.class)

2. 超时控制

根据服务业务功能的不同服务接口调用的时间也会不同,但是OpenFeign的底层是ribbon,默认的等待时间是1秒钟,超过一秒调用时间就会报错, 这显然是不合理的。
为了避免上述情况这时我们就需要在配置文件中修改等待的时间:

#设置feign客户端超时时间(OpenFeign默认支ribbon)
ribbon:
	#指的是建立连接所用的时间,适用于网路状况正常的情况下,两端连接所用的时间
	ReadTimeout: 5000  #5 秒的意思
	#指的是建立连接后从服务器读取到可用资源所用的时间
	ConnectTimeout: 5000

四. OpenFeign性能优化

OpenFeign的性能虽然已经很不错,但是还是存在优化的余地,底层客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

因此优化OpenFeign的性能主要包括:

  1. 使用连接池代替默认的URLConnection
  2. 日志级别,最好用basic或none (减少性能损耗)

关于日志上一章已经讲解过了,那么接下来还是着重聊修改连接池,这里就以修改为HttpClient为例子:
首先先引入依赖:

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

然后进行连接池的配置:
具体参数根据业务需求调整

feign: 
	client:
	  config:
		  default:
			  loggerLevel: NONE # 日志级别
	httpclient:
		enabled: true #开启feign对Httpclient的支持
		max-connections: 200 #最大的连接数
		max-connections-per-route: 50 #每个路径的最大连接数

五. OpenFeign最佳实践

1. 继承

方式一: 给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
在这里插入图片描述
但是这种方法也存在一定的问题,比如耦合度比较高,且方法参数也是继承不下来的。

2. 抽取

方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的pojo、默认的Feign配置都放到这个模块中,消费者通过引入该模块调用方法发送http请求。
在这里插入图片描述
但是这种方法也是有缺点的,可能会将一些多余的调用方法引入到模块。
值得注意的是:消费者启动类上还是得使用@EnableFeignClients注解
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Siebert_Angers/article/details/128427931