SpringBoot整合SpringCloud组件-Feign

一、背景说明

Feign是微服务环境下服务之间相互调用的工具,我们也可以使用httpclient等工具调用,但是服务之间的调用还是通过Feign,Feign的底层是通过Ribbon进行起作用的,通过hystrix进行服务熔断降级。

前情提要:
由于Feign是通过服务名进行项目之间的接口调用,因此就需要使用注册中心,从注册中心上根据服务名找到对应服务的具体地址。我们本次使用的注册中心就是Nacos。

二、具体使用

我这里代码展示就展示2个项目的调用,服务A(cloud-admin)调用服务B(cloud-tools)

(一)导入依赖

需要导入openfeign、ribbon、nacos的依赖

        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
        

        
        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

        
        
            org.springframework.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

(二)启动类加注解

启动类加上@EnableDiscoveryClient和@EnableFeignClients注解
SpringBoot整合SpringCloud组件-Feign_第1张图片

(三)配置超时时间

在yml文件中配置feign和hystrix的超时时间

#feign的超时配置,因为底层用的ribbon,也可以配置ribbon的超时时间,但是feign的配置比ribbon优先
feign:
  client:
    config:
      default:
        readTimeout: 5000  #feign默认读取时间是2s
        connectTimeout: 3000
  hystrix:
    enabled: true   #该配置不写则熔断不起作用
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 10000  #hystrix的熔断时间要>feign连接+读取时间

注意事项:
1)feign的底层使用的是ribbon,因此也可以配置ribbon的超时时间,如果既配置feign又配置ribbon的超时时间,则会以feign的超时时间为准,所以优先配置feign。
2)feign的底层使用的是hystrix作为熔断降级的,因此hystrix的超时时间要大于feign(ribbon)设置的超时间,不然服务到超时时间就开始走熔断了。如果设置了超时重试次数,则hystrix的超时时间要>重试次数*feign(ribbon)的超时时间。

(四)编写feignClient接口和fallback熔断方法

1、编写feignClient接口

@FeignClient(name = "cloud-tools",fallback = ToolsServiceFallBack.class) //这种方式是针对服务调用出错以后调用后备方法
//@FeignClient(name = "cloud-tools",fallbackFactory = ToolsServiceFallBackFactory.class) //,这种方式是针对服务调用出错以后获取错误异常信息
public interface ToolsServiceFeign {

    /**
     * 获取我的工具
     * @return
     */
    @RequestMapping("/machine/getAll")
    String getMyTools();
}

具体解释:
1)使用@FeignClient注解,注解中的name就是你要调用的服务名,这个一定要写对,会根据这个服务名去注册中心获取服务的真实地址然后发送请求。
2)注解中可以使用fallback用来处理当被调用服务挂了的情况下走后备接口,也可以使用fallbackFactory来记录服务调用出错以后的异常信息,这2个只能用一个。
3)方法上的@RequestMapping的值就是你需要调用的服务中接口的具体路径

2、编写fallback熔断方法

@Component
public class ToolsServiceFallBack implements ToolsServiceFeign {

    @Override
    public String getMyTools() {
        return "调用cloud-tool服务失败了,这是后备方法";
    }
}

后备方法实现上面自己编写的feignClient接口并自己写后备方法的具体内容。

3、编写fallbackFactory方法

@Component
public class ToolsServiceFallBackFactory implements FallbackFactory<ToolsServiceFeign> {

    @Override
    public ToolsServiceFeign create(Throwable throwable) {
        return new ToolsServiceFeign(){
            @Override
            public String getMyTools() {
                return "开启断路-fallback; reason was: "+ throwable;
            }
        };
    }
}

同样实现FallbackFactory接口,并自己决定异常信息的处理。

(五)被调用方编写接口

上面都是在调用方colud-admin中写配置文件,feignClient接口和熔断方法,这里就是被调用方cloud-tools中正常编写被调用的方法。

@RequestMapping("/machine")
@RestController
public class MachineController {

    @Autowired
    private MachineService machineService;

    /**
     * 获取所有机器列表
     * @return
     */
    @RequestMapping("/getAll")
    public List<LinuxMachine> getAll(){
        return machineService.selectAll();
    }
}

这里就是常规的方法,没啥好讲的。

(六)调用方调用

这里就是cloud-admin服务使用feignClient调用cloud-tools的入口

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private ToolsServiceFeign toolsServiceFeign;

    @RequestMapping("/getMyTools")
    public String getMyTools(){
        String result = toolsServiceFeign.getMyTools();
        return result;
    }
}

三、结果展示

当我们访问cloud-admin的7001端口上/test/getMyTools能看到结果
在这里插入图片描述
当我们把cloud-tools服务停止以后再请求cloud-admin的/test/getMyTools可以看到走了熔断方法:
在这里插入图片描述
如果使用的是fallbackFactory,可以看到结果如下:
在这里插入图片描述
上面的已经完成了服务之间的调用,至于服务之间具体的调用链可以整合sleuth和zipkin看到对应结果,这里就不介绍了。

你可能感兴趣的:(Feign,微服务调用,Feign超时配置)