当前位置: 首页 > news >正文

java B2B2C Springcloud电子商务平台源码 -Feign之源码解析

什么是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);
}

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

@Configuration
public class FeignConfig {

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

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


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @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

代码如下:

@Configuration
public 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,代码如下:

@Configuration
public class FeignConfig {

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

}

在上述代码更改了该FeignClient的重试次数,重试间隔为100ms,最大重试时间为1s,重试次数为5次。
java B2B2C 多租户电子商城系统

相关文章:

  • 转: Genymotion使用及离线镜像的安装
  • 全面解析JavaScript的对象创建和继承
  • 数据库出现锁表情况
  • 正式推出市场的前兆?波士顿动力机器狗上演「徒手」拉卡车
  • 浅谈网络工程行业
  • IPFS环境搭建节点安装
  • Mac 系统安装robot framework
  • 前端跨域的解决方案
  • Hadoop所支持的几种压缩格式
  • mysql
  • Spring 依赖注入
  • 重定向
  • 软件测试-Svn服务器搭建全过程-基于Centos6.7-64bit
  • 陈新宇:CKafka在人脸识别PAAS中的应用
  • 开辟sys节点用户层直接操作物理地址(比/dev/mem方便)
  • Angular2开发踩坑系列-生产环境编译
  • css布局,左右固定中间自适应实现
  • C语言笔记(第一章:C语言编程)
  • Github访问慢解决办法
  • go语言学习初探(一)
  • JAVA_NIO系列——Channel和Buffer详解
  • java2019面试题北京
  • Mysql数据库的条件查询语句
  • SpiderData 2019年2月16日 DApp数据排行榜
  • 产品三维模型在线预览
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 设计模式走一遍---观察者模式
  • 小而合理的前端理论:rscss和rsjs
  • 延迟脚本的方式
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 大数据全解:定义、价值及挑战
  • #前后端分离# 头条发布系统
  • (02)Hive SQL编译成MapReduce任务的过程
  • (26)4.7 字符函数和字符串函数
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ./configure,make,make install的作用(转)
  • .apk文件,IIS不支持下载解决
  • .NET MVC第五章、模型绑定获取表单数据
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net6Api后台+uniapp导出Excel
  • @Autowired注解的实现原理
  • @JoinTable会自动删除关联表的数据
  • @RequestBody与@ModelAttribute
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [Android] 修改设备访问权限
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [C++]:for循环for(int num : nums)
  • [C++]priority_queue的介绍及模拟实现
  • [dts]Device Tree机制
  • [hibernate]基本值类型映射之日期类型
  • [hive] 窗口函数 ROW_NUMBER()