写点什么

SpringCloud- 技术专题 -Feign 组件基本使用(2)

发布于: 2021 年 04 月 30 日
SpringCloud-技术专题-Feign组件基本使用(2)

前提概要


本章主要介绍相关的 Fegin 的相关配置和更深入一些的使用方式,如果对 Fegin 的不了解的话,可以先了

解一下,基于上一章之后,本章节属于完全不依赖于前一章,请放心观看本章内容。


  1. feign 自定义 Configuration 和 root 容器有效隔离:


用 @Configuration 注解不能在 @ComponentScan or @SpringBootApplication 范围内,从其包名上分离注意避免包扫描重叠,最好的方法是明确的指定包名


  1. Spring Cloud Netflix 提供了默认的 Bean 类型:


Decoder feignDecoder:ResponseEntityDecoder (which wraps a SpringDecoder)

Encoder feignEncoder:SpringEncoder

Logger feignLogger: Slf4jLogger

Contract feignContract: SpringMvcContract

Feign.Builder feignBuilder: HystrixFeign.Builder


  1. Spring Cloud Netflix 没有提供默认值,但仍然可以在 feign 上下文配置中创建:


Logger.LevelRetryerErrorDecoderRequest.OptionsCollection<RequestInterceptor>


  1. 自定义 feign 的消息编码:不要在代码中 getObject 方法内 new 对象,外部会频繁调用 getObject。

ObjectFactory<HttpMessageConverters> messageConvertersObjectFactory =   new ObjectFactory<HttpMessageConverters>() {		@Override		public HttpMessageConverters getObject() throws BeansException {   		return httpMessageConverters;}		};}
复制代码
  1. 注意测试环境和生产环境,注意正确使用 feign 日志级别。


  1. apacheHttpclient 或者其他 client 的正确配置

  • apacheHttpclient 配置放在 spring root context,不要在 FeignContext,否则不会起作用。

  • apacheHttpclient 连接池配置合理地连接和其他参数


  1. Feign 配置对 Hystrix 支持

  • 如果为 true,hystrix 库必须在 classpath 中

  • feign.hystrix.enabled=false


  1. 请求和响应 GZIP 压缩支持


  • feign.compression.request.enabled=true

  • feign.compression.response.enabled=true


  1. 支持压缩的 mime types


  • feign.compression.request.enabled=true

  • feign.compression.request.mime-types=text/xml,application/xml,application/json

  • feign.compression.request.min-request-size=2048

日志支持


  • logging.level.project.user.UserClient: DEBUG


Logger.Level 支持必须为每一个 Feign Client 配置来告诉 Feign 如何输出日志,可选:


  • NONE,No logging (DEFAULT).

  • BASIC, Log only the request method and URL and the response status code and execution time.

  • HEADERS, Log the basic information along with request and response headers.

  • FULL, Log the headers, body, and metadata for both requests and responses.9.


FeignClient.fallback 正确的使用方法配置的 fallback class 也必须在 FeignClient Configuration 中实例化,否则会报 java.lang.IllegalStateException: No fallback instance of type class 异常

例子

@FeignClient(name = "hello", fallback = HystrixClientFallback.class)public interface HystrixClient {    @RequestMapping(method = RequestMethod.GET, value = "/hello")    Hello iFailSometimes();}

public class HystrixClientFallback implements HystrixClient { @Override public Hello iFailSometimes() { return new Hello("fallback"); }}
@Configurationpublic class FooConfiguration { @Bean @Scope("prototype") public Feign.Builder feignBuilder() { return Feign.builder(); } @Bean public HystrixClientFallback fb(){ return new HystrixClientFallback(); } }
复制代码

使用 Feign Client 和 @RequestMapping 时,注意事项当前工程中有和 Feign Client 中一样的 Endpoint 时 Feign Client 的类上不能用 @RequestMapping 注解否则,当前工程该 endpoint http 请求且使用 accept 时会报 404.

例子

有一个 Controller


@RestController@RequestMapping("/v1/card")public class IndexApi { @PostMapping("balance") @ResponseBody public Info index() { Info.Builder builder = new Info.Builder(); builder.withDetail("x", 2); builder.withDetail("y", 2); return builder.build(); }}
复制代码

有一个 Feign Client

@FeignClient(name = "card",url = "http://localhost:7913",           fallback = CardFeignClientFallback.class,           configuration = FeignClientConfiguration.class)@RequestMapping(value = "/v1/card")public interface CardFeignClient {	@RequestMapping(value = "/balance", method = RequestMethod.POST,   		produces = MediaType.APPLICATION_JSON_VALUE)	Info info();}
复制代码


(1)如果 @RequestMapping 注解被用在 FeignClient 类上,如下代码请求/v1/card/balance 时,注意有,那么会返回 404


Accept header:

Content-Type:application/jsonAccept:application/json

POST http://localhost:7913/v1/card/balance


(2)如果不包含 Accept header 时请求,则是 OK:


Content-Type : application/json

POST http://localhost:7913/v1/card/balance


或者像下面不在 Feign Client 上使用 @RequestMapping 注解,请求也是 ok,无论是否包含 Accept:

@FeignClient(name = "card",		url = "http://localhost:7913",    fallback = CardFeignClientFallback.class,    configuration = FeignClientConfiguration.class)public interface CardFeignClient {	  @RequestMapping(value = "/v1/card/balance", method = RequestMethod.POST,                  produces = MediaType.APPLICATION_JSON_VALUE)		Info info();}
复制代码


发布于: 2021 年 04 月 30 日阅读数: 32
用户头像

我们始于迷惘,终于更高水平的迷惘。 2020.03.25 加入

🏆 【酷爱计算机技术、醉心开发编程、喜爱健身运动、热衷悬疑推理的”极客狂人“】 🏅 【Java技术领域,MySQL技术领域,APM全链路追踪技术及微服务、分布式方向的技术体系等】 🤝未来我们希望可以共同进步🤝

评论

发布
暂无评论
SpringCloud-技术专题-Feign组件基本使用(2)