• 2.【远程调用框架】Feign远程调用


    1.未使用远程调用Feign存在的问题

    • 使用RestTemplate发起远程调用
      在这里插入图片描述
      存在下面的问题:

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

      • 参数复杂URL难以维护

    2.使用Feign进行远程调用步骤:

    传统步骤(不用):

    1. 依赖
    • 在order-service 中添加(服务调用方)
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    1. 启动类上添加注解@EnableFeignClients
    2. 编写Feign的客户端
    package cn.cheung.order.client;
    
    import cn.cheung.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") // 调用注册到nacos上的userservice服务
    public interface UserClient {
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    • 服务名称:userservice
    • 请求方式:GET
    • 请求路径:/user/{id}
    • 请求参数:Long id
    • 返回值类型:User
      这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。
    1. 修改order-service 中的OrderController中的queryOrderById方法,使用Feign客户端代替RestTemplate
      在这里插入图片描述

    总结

    使用Feign的步骤:

    ① 引入依赖

    ② 添加@EnableFeignClients注解

    ③ 编写FeignClient接口

    ④ 使用FeignClient中定义的方法代替RestTemplate

    3.Feign自定义配置

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

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

    3.2配置文件方式

    针对单个具体服务:

    feign:  
      client:
        config: 
          userservice: # 针对某个微服务的配置
            loggerLevel: FULL #  日志级别 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    针对所有服务:

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

    而日志的级别分为四种:

    • NONE:不记录任何日志信息,这是默认值。
    • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
    • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
    • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

    3.3 java代码方式进行自定义配置

    • 自定义类修改日志等级为BASIC
    public class DefaultFeignConfiguration  {
        @Bean
        public Logger.Level feignLogLevel(){
            return Logger.Level.BASIC; // 日志级别为BASIC
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 启动类开启
    @EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 
    
    • 1

    4.Feign的优化方式(连接池)

    4.1提高性能选用其他连接池

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

    • URLConnection:默认实现,不支持连接池
    • Apache HttpClient :支持连接池
    • OKHttp:支持连接池
      因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection

    使用Apache HTTPClient进行实例

    1. 添加依赖
    
    <dependency>
        <groupId>io.github.openfeigngroupId>
        <artifactId>feign-httpclientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 配置连接池
    feign:
      client:
        config:
          default: # default全局的配置
            loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
      httpclient:
        enabled: true # 开启feign对HttpClient的支持
        max-connections: 200 # 最大的连接数
        max-connections-per-route: 50 # 每个路径的最大连接数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Feign优化总结

    1. 日志级别尽量用basic

    2. 使用HttpClient或OKHttp代替URLConnection

      1. 引入feign-httpClient依赖

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

    5.使用Feign方式

    • 由于Feign Client的代码与 被调用服务代码高度重合,可以有以下方式进行简化代码:
    • 在这里插入图片描述
      在这里插入图片描述

    5.1 继承方式(不推荐)

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

    • 定义一个API接口,利用定义方法,并基于SpringMVC注解做声明。
    • Feign客户端和Controller都集成改接口
    • 优缺点:
      • 优点:简单代码共享
      • 缺点:提供/消费方代码耦合;参数列表中的注解映射并不会继承,因此Controller中必须再次声明方法、参数列表、注解
        在这里插入图片描述

    5.2 抽取方式(推荐使用)

    • 将消费方中的Feign内容全部抽取出来作为一个独立的模块(feign-api),其他微服务模块进行毅依赖引用
      在这里插入图片描述

    使用步骤:

    1. 创建新的子模块feign-api
    2. 添加依赖
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    1. 将UserClient User DefaultFeignConfiguration都复制到feign-api项目中
      在这里插入图片描述
    2. 删除order-service中UserClient DefaultFeignConfiguration User,添加依赖
    <dependency>
        <groupId>cn.itcast</groupId>
        <artifactId>feign-api</artifactId>
        <version>1.0</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 修改 order-service中的导包部分,使用feign-api中的包
    2. 修改启动类上的包扫描
    • 方式1:
    @EnableFeignClients(basePackages = "cn.itcast.feign.clients")
    
    • 1
    • 方式二:指定加载的Client接口
    @EnableFeignClients(clients = {UserClient.class})
    
    • 1
  • 相关阅读:
    Rust错误处理
    大数据Hadoop之——部署hadoop+hive+Mysql环境(Linux)
    【javaSE】 Lambda表达式与Lambda表达式的使用
    玉米社:百度SEM竞价推广策略有哪些?
    SpringSecurity简介及其入门案例
    pat倒数3天
    【BERT-多标签文本分类实战】之六——数据加载与模型代码
    Android hook方式抓包
    Docker Compose 启动容器例子
    数据研发“新人”如何快速落地?
  • 原文地址:https://blog.csdn.net/weixin_44519169/article/details/126622258