有关代码,请参阅我的Tiny 4类GitHub Project
我正在使用弹簧feignclients连接到REST服务。这就是假装客户端在其基本(非Async)形式中的样子:
@FeignClient(value="localhost:8080/products", decode404 = true)
public interface ProductClient {
@RequestMapping(value="/{id}")
Product getById(@PathVariable("id") String id);
}
现在,我想使用可观察到的,不时地进行操作。关于此的信息在春季文档中严重缺乏,只有一个小段落告诉您使用HyStrixCommand。仅此而已,没有解释,没有Sampe代码。
在另一篇博客文章中,我被告知使用HyStrixObserable。所以我尝试了:
@FeignClient(value="localhost:8080/products", decode404 = true)
public interface ProductClient {
@RequestMapping(value="/{id}")
HystrixObservable<Product> getById(@PathVariable("id") String id);
}
无论哪种方式,使用HyStrixCommand或HyStrixObservable,它都会给我带来错误: com.fasterxml.jackson.databind.jsonmappingexception:无法构造com.netflix.hysstrix.hysstrixobservable的实例
我理解为什么会出现该错误,因为Spring Boot会自动将解码器附加到Feignclient上,以使用Jackson对响应进行验证。并从返回值得出响应的理想化类型。
我可以尝试配置Custome解码器或手动构建假装客户端,但是这种击败了Spring Boot的全部目的:它可以自动起作用(尽管在这里和那里进行了一些配置)。
所以我的问题是:这应该如何工作?
如果将返回类型指定为 HystrixCommand<Product>
或rxjava的Observable<Product>
或Single<Product>
而不是HystrixObservable<Product>
,则应起作用。
我相信使用HystrixObservable
不起作用的原因是因为它是一个接口,而Jackson不会默认地映射到诸如接口之类的抽象类型,如您在堆栈跟踪中所示:
> abstract types either need to be mapped to concrete types, have custom
> deserializer, or contain additional type information
HystrixCommand
但是,是HystrixObservable
接口的实现,因此杰克逊可以轻松地映射到它。
如果您在假装的HyStrix模块中查看HystrixInvocationHandler
,您将看到它能够返回的其他类型;我上面列出的那些以及RXJAVA的Completable
。Tassos Bassoukos链接的文档还列出了类型。
如果您正在寻找异步和非障碍物的东西,可能值得签出feign vertx,因为我认为假装可能是异步但封锁的。关于非阻滞假的讨论在这里。
希望有帮助!
如果有人在升级到spring-cloud:1.3。
feign.hystrix.enabled=true
添加了这一点,因此默认情况下,feign不会在hystrix命令中包装呼叫。
https://github.com/spring-cloud/spring-cloud-netflix/issues/1277