Spring Cloud 中OpenFeign的使用(二)

在OpenFeign中主要的注解就是@FeignClient,从@FeignClient注解源码来看其被@Target({ElementType.TYPE})注解修饰,说明其注解的作用目标接口、类、枚举、注解上,
声明接口之后,在代码中通过@Resource注入之后即可使用,从接口上可以看到@FeignClient注解的常用属性。

name/value:从FeignClient注解属性来看name属性别名是value,value属性别名是name,两个属性参数作用是一样的,都是指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现。

实例:通过name或value指定服务名,根据服务名调用getGoodsList服务接口。

@FeignClient(name = "goods-service")
public interface GoodsService
{
    @GetMapping("/goods/list")
    String getGoodsList();
}

或者

@FeignClient(value = "goods-service")
public interface GoodsService
{
    @GetMapping("/goods/list")
    String getGoodsList();
}

 url:属性一般用于调试程序,允许我们手动指定@FeignClient调用的地址。

实例:手动指定@FeignClient服务调用的地址

@FeignClient(value = "goods-service", url="http://127.0.0.1:7001")
public interface GoodsService
{
    @GetMapping("/goods/list")
    String getGoodsList();
}

 fallbackFactory:工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码。

实例:fallbackFactory 显示记录服务熔断异常信息

@FeignClient(value = "goods-service",  fallbackFactory = GoodsServiceFallbackFactory.class)
public interface GoodsService
{
    @GetMapping("/goods/list")
    String getGoodsList();
}

需要实例化FallbackFactory的实现类,重写create()方法

@Component
public class GoodsServiceFallbackFactory implements FallbackFactory<GoodsService>
{
    @Override
    public GoodsService create(Throwable throwable)
    {
        return new GoodsService()
        {
            @Override
            public String getGoodsList()
            {
                return throwable.getMessage();
            }
        };
    }
}

 fallback:定义容错的处理类,当调用远程接口失败或超时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口,fallback 和 FallbackFactory 同时使用,fallback优先级要高于FallbackFactory。

实例:fallback 显示记录服务熔断信息

@FeignClient(value = "goods-service",  fallback = GoodsServiceFallback.class)
public interface GoodsService
{
    @GetMapping("/goods/list")
    String getGoodsList();
}
@Component
public class GoodsServiceFallback implements GoodsService
{
    @Override
    public String getGoodsList() {
       return "服务熔断";
    }
}

path:定义当前FeignClient的服务统一前缀,这样方便在该FeignClient中的@RequestMapping中书写value值
实例:定义一个FeignClient,定义服务前缀为"/goods/list"

@FeignClient(value = "goods-service", path="/goods")
public interface GoodsService
{
    @GetMapping("list")
    String getGoodsList();
}

 

posted @ 2021-05-07 20:39  小武汉  阅读(468)  评论(0编辑  收藏  举报