博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java B2B2C Springcloud电子商务平台源码 -Feign之源码解析
阅读量:6507 次
发布时间:2019-06-24

本文共 3030 字,大约阅读时间需要 10 分钟。

什么是Feign

Feign是受到Retrofit,JAXRS-2.0和WebSocket的影响,它是一个jav的到http客户端绑定的开源项目。 Feign的主要目标是将Java Http 客户端变得简单。

写一个Feign

现在来简单的实现一个Feign客户端,首先通过@FeignClient,客户端,其中value为调用其他服务的名称,FeignConfig.class为FeignClient的配置文件,代码如下:

@FeignClient(value = "service-hi",configuration = FeignConfig.class)public interface SchedualServiceHi {    @GetMapping(value = "/hi")    String sayHiFromClientOne(@RequestParam(value = "name") String name);}

其自定义配置文件如下,当然也可以不写配置文件,用默认的即可:

@Configurationpublic class FeignConfig {    @Bean    public Retryer feignRetryer() {        return new Retryer.Default(100, SECONDS.toMillis(1), 5);    }    }

查看FeignClient注解的源码,其代码如下:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FeignClient {@AliasFor("name")String value() default "";    @AliasFor("value")String name() default "";    @AliasFor("value")String name() default "";String url() default "";boolean decode404() default false;Class
[] configuration() default {};Class
fallback() default void.class;Class
fallbackFactory() default void.class;}String path() default "";boolean primary() default true;

FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient注解的作用目标在接口上;

@Retention(RetentionPolicy.RUNTIME),注解会在class字节码文件中存在,在运行时可以通过反射获取到;@Documented表示该注解将被包含在javadoc中。

feign 用于声明具有该接口的REST客户端的接口的注释应该是创建(例如用于自动连接到另一个组件。 如果功能区可用,那将是

用于负载平衡后端请求,并且可以配置负载平衡器
使用与伪装客户端相同名称(即值)@RibbonClient 。

其中value()和name()一样,是被调用的 service的名称。

url(),直接填写硬编码的url,decode404()即404是否被解码,还是抛异常;configuration(),标明FeignClient的配置类,默认的配置类为FeignClientsConfiguration类,可以覆盖Decoder、Encoder和Contract等信息,进行自定义配置。fallback(),填写熔断器的信息类。

FeignClient的配置

默认的配置类为FeignClientsConfiguration,这个类在spring-cloud-netflix-core的jar包下,打开这个类,可以发现它是一个配置类,注入了很多的相关配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中还包括了Decoder、Encoder、Contract,如果这三个bean在没有注入的情况下,会自动注入默认的配置。

Decoder feignDecoder: ResponseEntityDecoder(这是对SpringDecoder的封装)

Encoder feignEncoder: SpringEncoder

Logger feignLogger: Slf4jLogger

Contract feignContract: SpringMvcContract

Feign.Builder feignBuilder: HystrixFeign.Builder

代码如下:

@Configurationpublic class FeignClientsConfiguration {...//省略代码@Bean    @ConditionalOnMissingBean    public Decoder feignDecoder() {        return new ResponseEntityDecoder(new SpringDecoder(this.messageConverters));    }    @Bean    @ConditionalOnMissingBean    public Encoder feignEncoder() {        return new SpringEncoder(this.messageConverters);    }    @Bean    @ConditionalOnMissingBean    public Contract feignContract(ConversionService feignConversionService) {        return new SpringMvcContract(this.parameterProcessors, feignConversionService);    }...//省略代码}

重写配置:

你可以重写FeignClientsConfiguration中的bean,从而达到自定义配置的目的,比如FeignClientsConfiguration的默认重试次数为Retryer.NEVER_RETRY,即不重试,那么希望做到重写,写个配置文件,注入feignRetryer的bean,代码如下:

@Configurationpublic class FeignConfig {   @Bean   public Retryer feignRetryer() {       return new Retryer.Default(100, SECONDS.toMillis(1), 5);   }}

在上述代码更改了该FeignClient的重试次数,重试间隔为100ms,最大重试时间为1s,重试次数为5次。

转载地址:http://eszfo.baihongyu.com/

你可能感兴趣的文章
Eclipse下C/C++开发环境搭建
查看>>
Eclipse中设置在创建新类时自动生成注释
查看>>
我的友情链接
查看>>
CoreOS 手动更新
查看>>
再论机械式针对接口编程
查看>>
25 个 Linux 性能监控工具
查看>>
C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想
查看>>
Tengine-2.1.1 ngx_http_concat_module 400问题
查看>>
Windows中挂载安装ISO文件
查看>>
Wayland 1.0发布
查看>>
golang的goroutine是如何实现的?
查看>>
乐视云基于Kubernetes的PaaS平台建设
查看>>
R 学习笔记《十》 R语言初学者指南--图形工具
查看>>
PHP通过读取DOM抓取信息
查看>>
DICOM医学图像处理:DICOM网络传输
查看>>
nio和传统Io的区别
查看>>
移动端网页布局中需要注意事项以及解决方法总结
查看>>
oracle
查看>>
我也要谈谈大型网站架构之系列(2)——纵观历史演变(下)
查看>>
大话设计模式(Golang) 二、策略模式
查看>>