声明式Web服务客户端。写入更方便,Feign创建界面并其注释。可插入注释支持,Feign注释和JAX-RS注释。支持可插拔编、解码器。用HttpMessageConverters(Spring Web默认)。
一、如何加入Feign
spring-cloud-starter-feign的启动器。@EnableEurekaClient
@FeignClient注释中,String值是一个任意客户端名称,创建Ribbon。也可指定URL(绝对值或只是主机名)。程序上下文中bean名称是接口完全限定名称。指定自己别名值,可用@FeignClient注释qualifier值。
Ribbon客户端将会发现“商店”服务物理地址。解析Eureka服务注册表中的服务。如不用Eureka,配置外部服务器列表
二、覆盖Feign默认值
Spring Cloud的Feign支持的中心概念是指定的客户端。每个Feign客户端组件一部分,一起工作联系远程服务器,并且该集合具有您将其作为应用程序开发人员使用@FeignClient注释的名称。用FeignClientsConfiguration为每个已命名客户端创建新的集合ApplicationContext。包含feign.Decoder,feign.Encoder和feign.Contract。
用@FeignClient声明额外配置(FeignClientsConfiguration之上)控制feign客户端
客户端由FeignClientsConfiguration中已经存在的组件和FooConfiguration中的任何组件(其中后者将覆盖前者)组成。
ps1:FooConfiguration不需用@Configuration注释。但如用,从任何@ComponentScan中排除,否则将包含此配置,成为feign.Decoder,feign.Encoder,feign.Contract默认来源。放置任何@ComponentScan或@SpringBootApplication单独不重叠包中,或在@ComponentScan中排除。
ps2:serviceId属性现在已弃用,利于name属性。
警告:用url属性,需用name。name、url属性支持占位符。
提供以下bean:
Decoder feignDecoder:ResponseEntityDecoder(其中包含SpringDecoder)
Encoder feignEncoder:SpringEncoder
Logger feignLogger:Slf4jLogger
Contract feignContract:SpringMvcContract
Feign.Builder feignBuilder:HystrixFeign.Builder
Client feignClient:如果Ribbon启用,则为LoadBalancerFeignClient,否则将使用默认的feign客户端。
feign.okhttp.enabled或feign.httpclient.enabled设置为true,放类路径上用OkHttpClient和ApacheHttpClient feign客户端。
默认不提供以下bean,从上下文中查找这些类型bean创建feign客户端:
Logger.Level
Retryer
ErrorDecoder
Request.Options
Collection<RequestInterceptor>
SetterFactory
创建一个类型的bean并将其放置在@FeignClient配置(如FooConfiguration中)允许覆盖所描述每个bean。例:
将SpringMvcContract替换为feign.Contract.Default,并将RequestInterceptor添加到RequestInterceptor的集合中。
@EnableFeignClients属性defaultConfiguration相似方式指定默认配置。不同:适用于所有feign客户端。
需Hystrix线程隔离策略设置为SEMAPHORE,用ThreadLocal绑定变量,或在Feign中禁用Hystrix
三、手动创建Feign客户端
用Feign Builder API创建客户端 。创建两个具有相同接口Feign客户端,单独请求拦截器配置每个客户端
FeignClientsConfiguration.class默认配置。PROD-SVC是客户端请求服务名称。
四、Feign Hystrix支持
如Hystrix在类路径上,feign.hystrix.enabled=true,Feign用断路器包装所有方法。还可返回com.netflix.hystrix.HystrixCommand。允许用响应模式(调用. toobservable()或.observe()或异步使用(通过调用.queue())。
每个客户端上禁用Hystrix,创建伪代码。生成器与“原型”范围
Spring Cloud Dalston发布前,如Hystrix在classpath上,Feign将所有方法封装在断路器中。
五、Feign Hystrix回退
Hystrix支持回退:断路器打开/错误时,执行默认代码。@FeignClient属性设置为实现回退的类名。
@FeignClient内的fallbackFactory属性触发
ps:返回com.netflix.hystrix.HystrixCommand和rx.Observable不支持回退。
六、Feign和@Primary
用Feign与Hystrix回退时,同类型ApplicationContext有多个bean,@Autowired不起作用,没有主bean。将所有Feign实例@Primary,Spring Framework知道要注入哪个bean。某些情况不可取。要关闭此行为,设置为false。
七、Feign继承支持
通过单继承接口支持样板apis
不建议服务器和客户端之间共享接口。紧耦合,不适用于当前形式Spring MVC(方法参数映射不被继承)。
八、Feign请求/响应压缩
为Feign请求启用请求或响应GZIP压缩。启用其中一个属性:
feign.compression.request.enabled=true
feign.compression.response.enabled=true
Feign请求压缩为您提供与您为Web服务器设置的设置相似的设置:
feign.compression.request.enabled=true
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048
压缩媒体类型和最小请求阈值长度。
九、Feign日志记录
为每个Feign客户端创建记录器。默认情况下,记录器的名称是用于创建Feign客户端的接口的完整类名。Feign日志记录仅响应DEBUG级别。
application.yml:logging.level.project.user.UserClient: DEBUG
NONE,无记录(DEFAULT)。
BASIC,只记录请求方法和URL以及响应状态代码和执行时间。
HEADERS,记录基本信息以及请求和响应标头。
FULL,记录请求和响应的头文件,正文和元数据。
将Logger.Level设置为FULL: