• http客户端Feign


    Feign注册使用

    Feign作用:用来代替RestTemplate,来调用远程服务的;
    在这里插入图片描述
    在这里插入图片描述

    Fegin内部集成了负载均衡ribbon

    在这里插入图片描述

    Feign的使用步骤

    在这里插入图片描述

    1.先在主启动类中加@EnableFeignClients,声明开启Feign,可以调用其他服务

    @EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
    //声明feign自动装配开关:开
    
    • 1
    • 2

    2.pom.xml+openFeign依赖,因为自己使用Feign调用远程服务

    
      
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.创建声明一个Feign客户端,里面是调用远程服务的方法(需要声明被调用的服务是哪一个)

     
    @FeignClient(name="userservice")//声明式Feign客户端,需要声明服务名
    public interface UserClient {
     
        /**
         * 这里猜测是调用了用户服务的底层接口
         * 因为订单服务可以请求到用户服务
         * @param id
         * @return
         */
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Feign日志配置

    个人认为目前阶段了解就好,因为默认就是NONE 不记录任何日志信息 对系统的性能优化是最大的

    第一种:在yaml中进行日志配置

    feign: # 配置日志
      client:
        config:
          default:
            loggerLevel: FULL # 日志级别,basic:就是基本的请求以及想要信息
    
    • 1
    • 2
    • 3
    • 4
    • 5

    第二种:使用java代码进行日志配置:
    创建一个类,@Bean定义,并给@EnableFeignClients注解声明或者是给@FeignClient注解声明,前者是声明全局,后者是某个服务

    package cn.itcast.order.config;
     
    import feign.Logger;
    import org.springframework.context.annotation.Bean;
     
    /**
     * @author diao 2022/5/8
     */
    public class DefaultFeignConfiguration {
        /**
         * 设置Feign日志级别
         * @return Logger.Level.BASIC日志级别
         */
        @Bean
        public Logger.Level logLevel(){
            return Logger.Level.BASIC;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在主启动类中的@EnableFeignClients()声明默认的Configuration

     
    @MapperScan("cn.itcast.order.mapper")
    @SpringBootApplication
    @EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)//声明feign自动装配开关:开
    public class OrderApplication {
     
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
     
        /**
         * 创建RestTemplate并且注入Spring容器
         * @return
         */
        @Bean
        @LoadBalanced//负载均衡
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
     
        /**
         * 负载均衡策略配置
         * @return
         */
    //    @Bean
    //    public IRule randomRule(){
    //        return new RandomRule();
    //    }
    //
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

    可以发现在yaml中配置日志配置,优先级大于java代码配置
    在这里插入图片描述

    Feign的性能优化

    在这里插入图片描述

    需要修改成支持连接池的模式,不然每次调用都要进行挥手连接,太占性能了

    Feign客户端实现默认是URLConnection,是不支持连接池的,我们可以在yaml配置文件中修改Feign客户端实现——>HttpClient:

     
    feign: # 配置日志
      httpclient:
        enabled: true #支持HttpClient开关
        max-connections: 200 #最大连接数
        max-connections-per-route: 50 #单个路径的对哒连接数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果要配置Feign日志(针对某个服务,还是全局看你自己咯),这边建议自定义一个bean返回日志,然后再在@EnableFeignClient还是@EnableClient中配置默认配置类即可;

    在这里插入图片描述

    Feign最佳实践

    方法一:

    在这里插入图片描述

    第一种不好的地方就是紧耦合,因为都是继承一个父接口,他一改动,剩下子类都要改动

    方法二:

    将FeignClient抽取出来,并把这个接口有关的pojo和Feign配置都放在一个单独的模块中,提供给消费者使用:(之前我们是一个消费者调用一个FeignClient,如果是多个消费者调用同一个提供者服务,那么FeignClient就要被重复启动多次)

    作用:放在单独一个模块有利于减少代码冗余,任务减轻;
    在这里插入图片描述
    总结区别:

    一个是服务者的controller和被调用的FeignClient用同一个接口,另外一个是Feign有关的全部放在一个模块中给服务者调用->方便其他的服务调用

    个人认为第二种更好 第二种要注意的是要将fegin的软件包地址添加到消费者的启动类中 让其扫描到 @EnableFeignClients(clients = {UserClient.class})

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Ranger (二) ---------- Ranger 安装
    java高级——集合(中)
    JAVA【JDBC】【使用PreparedStatement操作数据库】
    【Linux】万字总结Linux 基本指令,绝对详细!!!
    MPP(无主备)环境搭建
    接口测试常问面试题
    【Linux】感性认识冯诺依曼体系结构和操作系统
    安果计算器-您的全能计算伴侣
    [附源码]Python计算机毕业设计SSM课堂考勤(程序+LW)
    2024年智能手表行业线上市场销售数据分析
  • 原文地址:https://blog.csdn.net/weixin_67201964/article/details/132730386