Feign远程调用

Feign是什么

Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,Feign可以通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求。被广泛应用在Spring Cloud 的解决方案中。类似于Dubbo,服务消费者拿到服务提供者的接口,然后像调用本地接口方法一样 去调用,实际发出的是远程的请求

  • Feign可插拔的注解支持,包括Feign注解和JAX-RS注解;

  • Feign与Ribbon负载均衡器、Hystrix或Sentinel熔断器无缝集成;

  • Feign支持可插拔的HTTP编码器和解码器;

  • Feign支持HTTP请求和响应的压缩等。

下面就实例讲述Feign如何远程调用。

Feign远程调用示例

需要调用的服务成为服务消费者

  1. 添加Feign依赖

    由于springcloud已经整合该依赖,可以直接在父依赖中添加springcloud的依赖管理

    <dependencyManagement>
        <dependencies>
    
            <!-- SpringCloud 微服务 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    
            <!-- SpringCloud Alibaba 微服务 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>    
    

    子依赖中添加Feign依赖,由父依赖统一管理版本

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

    远程调用更多的是在微服务模块之间进行,那就服务消费者就需要知道提供接口方的服务是谁,所以服务与服务之间会通过注册中心来串联。此处以Nacos为例,添加依赖

    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  2. 添加注册中心配置,因为feign调用通常是服务与服务之间的调用,确保自己能注册到注册中心且可以感知其他服务,此处一Nacos为例

    spring:
      application:
        name: 自身服务名
      profiles:
        active: dev
      cloud:
        nacos:
          discovery:
            server-addr: nacos地址:端口号
    
  3. 在启动类上加@EnableFeignClients注解,开启远程调用功能

    @SpringBootApplication
    @EnableFeignClients
    public class ZzBusinessApplication {
        public static void main(String[] args) {
            SpringApplication.run(ZzBusinessApplication.class, args);
        }
    }
    
  4. 定义Feign接口

    /**
    *	value:第三方服务的名称
    *   path:路由根路径
    */
    @FeignClient(value = "ruoyi-system", path = "/dept")
    public interface SystemFeignService {
    
            @GetMapping("/getPeopleNumByDept/{deptId}")
            public AjaxResult getPeopleNumByDept(@PathVariable("deptId") Long deptId);
    }
    
    • FeignClient声明这是一个用于远程调用的接口,value/name属性是接口提供者的服务名,同配置文件中spring.application.name保持一致
    • 接口中远程调用方法的写法和平常Controller层的接口写法一致,在进行参数绑定的时,可以使用 @PathVariable、@RequestParam、@RequestHeader等,这也是OpenFeign 对SpringMVC注解的支持。此处写的内容可以和服务提供者的接口一样即可。
  5. 在消费者服务创建controller层,调用上面的SystemFeignService接口

    @GetMapping("/queryDeptNums/{deptId}")
        public AjaxResult queryDeptNums(@PathVariable Long deptId){
            //远程调用
            AjaxResult data = systemFeignService.getPeopleNumByDept(deptId);
            System.out.println("data" + data);
            return data;
        }
    

    可以看到数据返回,远程调用成功
    在这里插入图片描述

Ribbon负载均衡配置

Feign 本身已经集成了Ribbon依赖和自动配置,因此我们不需要额外引入依赖,可以通过 ribbon.xx 来进 行全局配置,也可以通过服务名.ribbon.xx 来对指定服务进行。

Feign默认的请求处理超时时⻓1s,有时候我们的业务确实执行的需要一定时间,那么这个时候,我们就需要调整请求处理超时时⻓,Feign自己有超时设置,如果配置 Ribbon的超时,则会以Ribbon的为准
例如上面示例中,如果调用时间超过1s会报Read timed out executing等超时错误。

设置Feign的超时时间有几种方式

  1. 通过Feign的默认配置

    feign:
      client:
        config:
          default:
            #不设置connectTimeout会导致readTimeout设置不生效
            connectTimeout: 3000
            readTimeout: 6000
    
  2. 通过设置ribbon来控制远程调用超时时间

    ribbon:
      # 请求连接超时时间
      ConnectTimeout: 2000
      # 请求处理超时时间
      ReadTimeout: 5000
      # 对所有的操作都进行重试
      OkToRetryOnAllOperations: true
      ####根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数 由MaxAutoRetries配置),
      ####如果不行,就换一个实例进行访问,如果还不行,再换一次实例访问(更换次数 由MaxAutoRetriesNextServer配置),
      ####如果依然不行,返回失败信息。
      MaxAutoRetries: 0 #对当前选中实例重试次数,不包括第一次调用
      MaxAutoRetriesNextServer: 0 #切换实例的重试次数
      NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #负载策略调整
    

Feign对hystrix熔断器也是支持的,还会有失败回调,失败降级等处理,具体用法之后的文章会单独讲解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪大侠0.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值