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>
    
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
    
            
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>    
    

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

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    

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

    <dependency>
      <groupId>com.alibaba.cloudgroupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    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熔断器也是支持的,还会有失败回调,失败降级等处理,具体用法之后的文章会单独讲解

你可能感兴趣的:(Feign,SpringCloud,微服务,spring,cloud,java)