Feign

发布时间:2024年01月06日

基于Fegin的远程调用

RestTemplate调用方式存在问题:

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

  2. 参数复杂URL难以维护

HTTP客户端Feign

介绍:Fegin是一个声明式的http客户端,官方地址:GitHub - OpenFeign/feign: Feign makes writing java http clients easier

其作用是帮助我们优雅的实现http请求发送,解决上面提到的问题。

定义和使用Feign客户端

引入依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
 ? ?<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在order-service的启动类添加注解开启fegin功能

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
?
 ? ?public static void main(String[] args) {
 ? ? ? ?SpringApplication.run(OrderApplication.class, args);
 ?  }
?

编写Feign客户端:

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

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

  • 服务名称:userservice

  • 请求方式:GET

  • 请求路径:/user/{id}

  • 请求参数类型:Long id

  • 返回值类型:User

自定义Fegin的配置

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

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

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

配置Feign日志有两种方式:
  1. 配置文件方式

    • 全局生效

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

    • 局部生效

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

  2. 自定义Feign的配置

    配置Feign日志的方式二:java代码方式,需要先声明一个Bean

    public class FeignClientConfiguration {
        @Bean
        public Logger.Level feignLogLevel(){
            return Logger.Level.BASIC;
        }
    }
    • 如果是全局配置,则把它放到启动类的 @EnableFeignClients 注解中:

      @EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)

    • 如果是局部配置,则把它放到client接口类中的 @FeignClient 这个注解中:

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

Feign的性能优化:

Feign底层的客户端实现:

  • URLCconnection:默认实现,不支持连接池

  • Apache HttpClient:支持连接池

  • OKHttp:支持连接池

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

  • 使用连接池代替默认的URLConnection

  • 日志级别,最好用basic或none

以HttpClient为例子演示:

引入依赖:
<dependency>
    <groupId>io.github.openfeign</groupId>
 ? ?<artifactId>feign-httpclient</artifactId>
</dependency>
配置连接池:
feign:
    client:
        config:
            default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
                loggerLevel: BASIC #日志级别
    httpclient:
        enabled: true #开启feign对HttpClient的支持
        max-connections: 200 #最大连接数
        max-connections-per-route: 50 #每个路径最大连接数
总结:
  1. 日志级别尽量使用basic

  2. 使用HttpClient或OKHttp代替URLConnection

    • 引入feign-httpClient依赖

    • 配置文件开启httpClient功能,设置连接池参数

Feign的最佳实践

方式1(继承):

给消费者的FeignClient和提供者的controller定义统一的父接口作为标准

方式2(抽取):

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

实现:
  1. 首先创建一个module,命名为feign-api,然后引入feign的starter依赖

  2. 将order-service中编写UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中

  3. 在order-service中引入feign-api的依赖

  4. 修改order-service中所有与上述三个组件有关的import部分,改成导入feign-api中的包

  5. 重启测试

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种解决方案:

  1. 指定FeignClient所在的包

    @EnableFeignClients(basePackages = "cn.itcast.feign.clients")
  2. 指定FeignClients字节码

    @EnableFeignClients(clients = {UserClient.class})
文章来源:https://blog.csdn.net/weixin_74783792/article/details/135425524
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。