SpringCloud(一.2)微服务远程调用(更常用) -- Feign

通过RestTemplate实现远程调用后存在一些问题,如图:

RestTemplate缺点:

代码可读性差,编程体验不统一。

参数复杂URL难以维护。

 

Feign是一个声明式的http客户端(https://github.com/OpenFegin/feign),其作用就是帮助我们优雅的实现http请求的发送,解决上面RestTemplate的痛点。

 

Feign的定义和使用

1、引入依赖

<!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2、在启动类添加注解开启Feign功能  @EnableFeignClients

3、编写Feign客户端

新建 Client 包 ,新建接口 UserClient。

 

 

 

自定义Feign的配置

 

 

 

Feign的性能优化

1、调试错误的话用FULL, 只记录日志尽量用BASIC。平时情况下用默认的NONE或BASIC,因为记录日志也是会消耗一定性能。

2、Feign底层的客户端实现默认使用URLConnection,是JDK自带的,不支持连接池。连接每次创建都要三次握手,断开四次挥手。比较浪费性能。

解决方法:

使用连接池 Apache(阿帕奇) HttpClient 或 OKHttp (这两种方式都支持连接池)

HttpClient 举例

1、引入HttpClient依赖

<!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

2、配置连接池

feign:
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数
yml内相关配置

 

 

 

 

 

FeignClient模块抽取

如图:

Order-service 微服务和pay-service 微服务都要调用user-service 的某个接口。按上面Feign的配置步骤都需要 新建 Client 包 ,新建接口 UserClient。还有都要在yml中配置一些Feign的相关配置。

优化方式:

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

配置

 client

引入feign-api依赖,变更引用

指定要引入的FeignClient包(更推荐第二种

 

 

 

 

 

 弊端:

假设:user-service提供了 10个接口,pay-service需要调用2个,Order-service需要调用10个。按抽取方式引入feign-api对于pay-service而言就有些多余。

posted @ 2024-03-25 14:02  一介桃白白  阅读(70)  评论(0编辑  收藏  举报