OpenFeign2.1.4Relea文档翻译版

更新时间:2023-05-17 23:30:36 阅读: 评论:0

OpenFeign2.1.4Relea⽂档翻译版
OpenFeign 2.1.4 Relea Doc
这个项⽬通过⾃动装配和其他Spring程序模型的习惯⽤法,把给SpringBoot应⽤提供的OpenFeign的综合包绑定到Spring的项⽬环境中。
1 说明
Feign是⼀个声明式的web服务客户端。它使编写web服务客户端变得更加简单。创建⼀个接⼝和注解就能使⽤Feign。它有可插⼊的注解⽀持,包括Feign的注解和JAXRS注解。Feign也⽀持可插⼊的编码器和解码器。SpringCloud为Spring MVC 注解和在Spring Web中使⽤相同的HttpMessageConverters,提供了⽀持。SpringCloud合并了Ribbon和Eureka,⽽且在使⽤Feign时,Spring Cloud LoadBalancer 提供了⼀个负载均衡的http客户端。
1.1 如何添加Feign
要在你的项⽬中加⼊Feign,使⽤group为org.springframework.cloud,artifact id为spring-cloud-starter-openfeign的starter。
使⽤Feign时要在启动类中加⼊注解:
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Feign的接⼝声明:
@FeignClient("stores")
public interface StoreClient {
@RequestMapping(method = RequestMethod.GET, value = "/stores")
List<Store> getStores();
@RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
Store update(@PathVariable("storeId") Long storeId, Store store);
}
在@FeignClient注释中,字符串值(上⾯的“stores”)是⼀个任意的客户端名称,⽤于创建Ribbon负载均衡器(有关Ribbon⽀持的详细信息,请参阅下⾯)或Spring Cloud LoadBalancer。还可以使⽤URL属性(绝对值或主机名)指定URL。应⽤程序上下⽂中bean的名称是接⼝的完全限定名。要指定⾃⼰的别名值,可以使⽤@FeignClient注释的限定符值。
上⾯的负载均衡器客户机希望发现“stores”服务的物理地址。如果您的应⽤程序是⼀个Eureka客户端,那么它将在Eureka服务注册表中解析服务。如果您不想使⽤Eureka,您可以简单地在外部配置中配置⼀个服务器列表(参见上⾯的⽰例)。
注意:为了保持向后兼容性,被⽤作默认的负载平衡器实现。但是,Spring Cloud Netflix Ribbon现在处于维护模式,所以我们建议使⽤Spring Cloud LoadBalancer来代替。为此,设置spring.cloud.loadb
皮肤过敏用什么药最好
alker .abled为fal。
1.2 重写Feign默认实现
SpringCloud的Feign⽀持的核⼼概念是客户端的名称。每⼀个Feign客户端,都是根据需要联系远程服务器⼀起⼯作的整体组件的⼀部分,你要⽤@FeignClient注解为这个整体指定⼀个名字。SpringCloud会按需为每⼀个使⽤FeignClientsConfiguration的客户端创建⼀个新的整体作为⼀个ApplicationContext。ApplicationContext包括了⼀个 feign.Decoder,⼀个 feign.Encoder,⼀个 feign.Contract。你可以使⽤@FeignClient注解的name属性改变这个整体的名字。
SpringCloud能让你通过额外的声明配置,来完全控制feign客户端。例如:
@FeignClient(name = "stores", configuration = FooConfiguration.class)
public interface StoreClient {
//..
诺字组词}
在这种情况下,客户端是由FeignClientsConfiguration中已经存在的组件和FooConfiguration中的任何组件(其中后者将覆盖前者)组成的。
注意:FooConfiguration不需要使⽤@Configuration进⾏注释。但是,如果⽤了,那么要注意将它排除在任何可能包含
@ComponentScan配置之外,因为它将成为feign中feign.Decoder,feign.Encoder, feign.Contract等的默认源。可以通过将它放在任何
@ComponentScan或@SpringBootApplication中单独的、不重叠的包中来避免这种情况,也可以在@ComponentScan中显式地排除它。
以前,使⽤url属性时不需要name属性。现在需要使⽤name。属性⽀持占位符。
@FeignClient(name ="${feign.name}", url ="${feign.url}")
public interface StoreClient {
//..
}
Spring Cloud Netflix 为Feign提供了以下beans(BeanType 的bean名称是 class名):
Decoder ,feignDecoder:ResponEntityDecoder(包装了⼀个SpringDecoder)
Encoder, feignEncoder: SpringEncoder
Logger,feignLogger:Slf4jLogger
Contract,feignContract: SpringMvcContract
Feign.Builder,feignBuilder:HystrixFeign.Builder
Client,feignClient:如果Ribbon在类路径中,并且启⽤了它,那么它就是LoadBalancerFeignClient,否则,如果Spring Cloud LoadBalancer在类路径中,那么就使⽤FeignBlockingLoadBalancerClient。如果它们都不在类路径中,则使⽤默认的feign客户端。
注意:spring-cloud-starter-openfeign包括了spring-cloud-starter-netflix-ribbon和spring-cloud-starter-loadbalancer。
OkHttpClient 和 ApacheHttpClient 的Feign客户端可以通过各⾃的配置项abled 或 feign.
Spring Cloud Netflix 没有提供下列feign默认的bean,但还是从应⽤程序上下⽂中查找这些bean来创建Feign客户端:
守信的成语Logger.Level
Retryer
ErrorDecoder
Request.Options
Collection<RequestInterceptor>
SetterFactory
QueryMapEncoder
创建⼀个那些类型之⼀的bean,并⽤@FeignClient替代配置,允许你重写任意⼀个已经声明的bean。例如:
@Configuration
public class FooConfiguration {
@Bean
public Contract feignContract(){
return new feign.Contract.Default();
}
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor(){
return new BasicAuthRequestInterceptor("ur","password");
}
}
这个例⼦中使⽤feign.Contract.Default替换了SpringMvcContract,并添加了⼀个RequestInterceptor到RequestInterceptor的集合中。
@FeignClient也可以使⽤配置⽂件配置。
feign:
client:
config:
feignName:
connectTimeout:5000
readTimeout:5000
loggerLevel: full
errorDecoder: ample.SimpleErrorDecoder
retryer: ample.SimpleRetryer
requestInterceptors:
- ample.FooRequestInterceptor
- ample.BarRequestInterceptor
decode404:fal
encoder: ample.SimpleEncoder
decoder: ample.SimpleDecoder
contract: ample.SimpleContract
可以在@EnableFeignClients的属性defaultConfiguration中相似的⽅式改动默认配置。其中的不同之处,是⽤改动@EnableFeignClients属性的⽅式配置,那么改动的配置将应⽤于所有Feign客户端。
如果你更喜欢⽤配置⽂件来配置所有的@FeignClient,你可以创建⼀个名为default的feign配置(l):
feign:
client:
config:
default:
connectTimeout:5000
readTimeout:5000
loggerLevel: basic
如果我们同时使⽤@Configuration和配置⽂件,会优先使⽤配置⽂件的内容,系统将覆盖@Configuration中的值。如果你希
望@Configuration拥有更⾼优先级,你可以把配置⽂件中的feign.client.default-to-properties设置为fals
e。
注意:如果您需要在您的RequestInterceptor中使⽤ThreadLocal绑定变量,那么您需要将Hystrix的线程隔离策略设置
为‘SEMAPHORE’,或者在Feign中禁⽤Hystrix(l):
# To disable Hystrix in Feign
feign:
hystrix:
enabled:fal
# To t thread isolation to SEMAPHORE
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
如果我们要使⽤相同的名字或url来创建多个feign客户端,那么它们需要指向相同的服务,但每⼀个都要有不同的个性化配置,这时候我们要使⽤@FeignClient的contextId属性,来避免这些配置bean的名称冲突。
@FeignClient(contextId ="fooClient", name ="stores", configuration = FooConfiguration.class)
public interface FooClient {
//..
}
@FeignClient(contextId ="barClient", name ="stores", configuration = BarConfiguration.class)
public interface BarClient {
//..
坤卦六爻}
1.3 ⼿动创建Feign客户端
在某些时候,你们可能要定制客户端来执⾏⼀些超出上⾯介绍的⽅法。这种情况下,你可以使⽤Feign Builder API 来创建客户端。下⾯是⼀个⽤相同接⼝创建两个Feign客户端的例⼦,但⼜⽤不同的拦截器分别拦截每⼀个客户端的请求:
@Import(FeignClientsConfiguration.class)
class FooController {
private FooClient fooClient;
private FooClient adminClient;
@Autowired
public FooController(Decoder decoder, Encoder encoder, Client client, Contract contract){讽齐王纳谏
this.fooClient = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.contract(contract)
李工真.requestInterceptor(new BasicAuthRequestInterceptor("ur","ur"))
.target(FooClient.class,"PROD-SVC");
this.adminClient = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.contract(contract)
.requestInterceptor(new BasicAuthRequestInterceptor("admin","admin"))儿童游戏大全
.
target(FooClient.class,"PROD-SVC");
}
联防联控机制}
注意:在上⾯例⼦中的FeignClientsConfiguration.class是Spring Cloud Netflix提供的默认配置。PROD-SVC是客户端服务的名称,将标记出请求去到哪⾥。Feign的Contract对象定义接⼝上有效的注解和值。⾃动注⼊Contract的bean提供了SpringMVC ⽀持,以取代默认的Feign本地注解。
1.4 Feign Hystrix ⽀持
如果Hystrix在类路径中,且abled=true,Feign会将所有⽅法⽤断路器包裹起来。还可以返
回flix.hystrix.HystrixCommand。这允许您使⽤响应模式(通过调⽤. toobrvable()或.obrve()或异步使⽤(通过调⽤.queue())。
要在每个客户端基础上禁⽤Hystrix⽀持,请创建⼀个具有“prototype”scope的Feign.Builder,例如:
@Configuration
public class FooConfiguration {
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder(){
return Feign.builder();
}
}
注意:在Spring Cloud Dalston发布之前,如果Hystrix在类路径上,那么在默认情况下,Feign会将所有⽅法封装在⼀个断路器中。在Spring Cloud Dalston中更改了此默认⾏为,以⽀持选择进⼊⽅法。
1.5 Feign Hystrix Fallbacks
Hystrix⽀持fallback的概念:当电路断开或出现错误时执⾏的默认代码。要为给定的@FeignClient启⽤fallback,请将fallback属性设置为实现fallback的类名。您还需要将实现声明为Spring bean。
@FeignClient(name ="hello", fallback = HystrixClientFallback.class)
protected interface HystrixClient {
@RequestMapping(method = RequestMethod.GET, value ="/hello")
Hello iFailSometimes();
}
static class HystrixClientFallback implements HystrixClient {
@Override
public Hello iFailSometimes(){
return new Hello("fallback");
}
}
如果需要访问fallback触发的原因,可以在@FeignClient中使⽤fallbackFactory属性。
@FeignClient(name ="hello", fallbackFactory = HystrixClientFallbackFactory.class)
protected interface HystrixClient {
@RequestMapping(method = RequestMethod.GET, value ="/hello")
Hello iFailSometimes();
}
@Component
static class HystrixClientFallbackFactory implements FallbackFactory<HystrixClient>{
@Override
public HystrixClient create(Throwable cau){
return new HystrixClient(){
@Override
public Hello iFailSometimes(){
return new Hello("fallback; reason was: "+ Message());
}
};
}
}
注意:在Feign中fallback的实现和Hystrix fallback的⼯作⽅式有⼀定的局限性。当前fallbakcs并不⽀持返回值
为flix.hystrix.HystrixCommand和rx.Obrvable的⽅法。
1.6 Feign 和@Primary
当开启Hystrix fallbacks使⽤Feign,有多个bean在ApplicationContext中是相同类型的。这会造成@Autowired不起作⽤,因为这⾥不只找到⼀个bean对象,或者没有⼀个被标记为主要的。Spring Cloud Netflix标记了所有的Feign接⼝为@Primary来解决这个问题,所以Spring Framework将会知道那个bean应该注⼊。有时候,这可能不合理。可以在@FeignClient上设置primary=fal属性关掉这个习惯。

本文发布于:2023-05-17 23:30:36,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/673923.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:客户端   配置   需要   属性
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图