http客户端Feign

http客户端Feign,第1张

http客户端Feign Feign

前言:
在Spring框架中,我么可以使用RestTemplate进行微服务之间的远程调用,即一个微服务向另一个微服务发送http请求获取数据。

它的代码是这样的:

但是这样存在很大的问题:
1、代码可读性差,编程体验不统一
2、URL参数复杂,难以维护

因此我们引入声明式的http客户端Feign来进行微服务之间的远程调用,他能帮我们优雅的实现http的请求和发送。

定义和使用Feign客户端:
1、引入依赖:


    org.springframework.cloud
    spring-cloud-starter-openfeign 

2、在order-service的启动类添加注解开启Feign的功能:

3、编写Feign客户端

@FeignClient("userservice")
public interface UserClient {
    @GetMapping("/user/{id}") 
    User findById(@PathVariable("id") Long id);
  }

上面内容主要是基于SpringMVC的注解来声明远程调用的信息,比如:
服务名称:userservice
请求方式:GET
请求路径:/user/{id}
请求参数:Long id
返回值类型:User

4、用Feign客户端代替RestTemplate

自定义Feign的配置
Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:

一般我们需要配置的就是日志级别。

配置Feign日志有两种方式:
方式一:配置文件方式
1、全局生效:

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

2、局部生效:

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

方式二:java代码方式,需要先声明一个Bean:

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

而后如果是全局配置,则把它放到@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class) 

如果是局部配置,则把它放到@FeignClient这个注解中:

@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class) 

Feign的性能优化
Feign底层的客户端实现:
URLConnection:默认实现,不支持连接池
Apache HttpClient :支持连接池
OKHttp:支持连接池

因此优化Feign的性能主要包括:
使用连接池代替默认的URLConnection
日志级别,最好用basic或none

Feign的性能优化-连接池配置
Feign添加HttpClient的支持:
引入依赖:

    
	io.github.openfeign
    feign-httpclient

配置连接池:

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

Feign的最佳实践(最佳使用方式)

方式一(继承,面向契约的编程思想,但这里耦合度增大):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。

方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5590692.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存