• 使用Feign远程调用快速入门


    在这里插入图片描述
    ** Feign是一个声明式的http客户端,官方地址: https://github.com/OpenFeign/feign
    其作用就是帮助我们优雅的实现http请求的发送,解决.上面提到的问题。**
    在这里插入图片描述

    1.远程调用

    1.1 引入依赖

    <!--            feign客户端依赖-->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-openfeign</artifactId>
                    <version>2.2.7.RELEASE</version>
                </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.2 开启自动装配功能

    在这里插入图片描述

    @EnableFeignClients
    
    • 1

    1.3 创建客户端接口

    在这里插入图片描述

    //请求服务的昵称
    @FeignClient("userservice")
    public interface UserClient {
    //    定义一个方法,方法的返回值就是你要的结果
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.4 调用方法

    	@Autowired
        private OrderMapper orderMapper;
    
        @Autowired
        private UserClient userClient;
    
        public Order queryOrderById(Long orderId) {
          // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.用Feign远程调用
            User user = userClient.findById(order.getUserId());
            // 3.封装user到Order
             order.setUser(user);
            // 4.返回
            return order;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    同时Feign还集成了负载均衡的功能。
    在这里插入图片描述
    它调用了Spring Cloud Netflix-Ribbon方法Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松的将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
    Ribbon内置了7种负载均衡算法,并且保留了扩展,用户可通过实现 IRule接口,实现自定义负载均衡算法,具体内容可以参考我之前的文章,

    `BestAviableRule
    跳过熔断的Server,在剩下的Server中选择并发请求最低的Server。
    
    ZoneAvoidanceRule
    随机选择一个server。
    
    AvailabilityFilteringRule
    剔除因为连续链接、读失败或链接超过最大限制导致熔断的Server,在剩下读Server中进行轮询。
    
    RoundRobinRule
    roundRobin方式轮询选择server,默认。
    
    RandomRule
    随机选择一个server。
    
    RetryRule
    可重试的策略,可以对其他策略进行重试。
    
    ResponseTimeWeightedRule
    根据响应时间加权,响应时间越短权重越大,被选中的可能性越高。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.Feign自定义配置

    在这里插入图片描述

    2.1 方式1

    在这里插入图片描述
    全局生效方式

    feign:
      client:
        config:
          default:
            loggerlevel: FULL
    
    • 1
    • 2
    • 3
    • 4
    • 5

    设置FULL会把所有的请求记录输出包括请求体
    在这里插入图片描述

    2.2 方式2

    通过bean的方式来使用
    在这里插入图片描述
    单独创建一个bean类,在类上添加当前服务的注解也就对当前服务生效。

    package cn.itcast.feign.config;
    
    import feign.Logger;
    import org.springframework.context.annotation.Bean;
    @FeignClient("userservice")
    public class DefaultFeignConfiguration {
        @Bean
        public Logger.Level logLevel(){
            return Logger.Level.BASIC;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    全局生效设置要在启动类上配置注解。

    @EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
    
    
    • 1
    • 2

    在这里插入图片描述

    总结

    Feign的日志配置:
    1.方式- 是配置文件, feign.client.config.xxx.loggerLevel
    ①如果xxx是default则代表全局
    ②如果xxx是服务名称,例如userservice则代表某服务
    2.方式二是java代码配置Logger.Level这个Bean
    ①如果在@EnableFeignClients注解声明则代表全局
    ②如果在@FeignClient注解中声明则代表某服务

    3.Feign性能优化

    在这里插入图片描述

    3.1 引入依赖

            <!--引入HttpClient依赖-->
            <dependency>
                <groupId>io.github.openfeign</groupId>
                <artifactId>feign-httpclient</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.2 配置连接池

    在这里插入图片描述

    方式1

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

    在这里插入图片描述

    4.性能优化实践

    在这里插入图片描述
    缺点就是得在重新写一次方法。

    方式2

    在这里插入图片描述
    优点耦合低。全部封装到一个独立模块中,后面直接调用即可,缺点是会把不必要的方法也封装进来。
    在这里插入图片描述
    新建一个module
    在这里插入图片描述
    导入Feign依赖

        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
        </dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    直接把Feign接口还有实体类和bean都抽取过来
    抽取完成后还要引入我们这个类,不然会找不到方法。

            <!--引入feign的统一api-->
            <dependency>
                <groupId>cn.itcast.demo</groupId>
                <artifactId>feign-api</artifactId>
                <version>1.0</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
    方式一:指定FeignClient所在包
    @EnapLeFeignClients(basePackages = “cn. itcast . feign. clients”)

    方式二:指定FeignClient字节码.
    @EnabLeFeignClients(clients = {UserClient . class})

    在这里插入图片描述
    如果不指定会导致扫不到包注入失败
    在这里插入图片描述

  • 相关阅读:
    Vue 插槽的理解与基础应用
    前端面试题记录(大环境不太友好的2022篇)
    爱上开源之boot4go-dockerui-剧透篇
    react:路由
    【附源码】计算机毕业设计SSM网上求职招聘系统
    【Transformers】第 6 章:用于标记分类的微调语言模型
    【C++】class的设计与使用(一)实现一个class
    「双指针技巧解决一些数组问题」
    按文件类型自动分类文件的快速方法
    LeetCode_二分搜索_中等_2594.修车的最少时间
  • 原文地址:https://blog.csdn.net/qq_45007567/article/details/126498282