SpringCloud–feign的配置加载

spring cloud feign我们使用 @FeignClient注解,其中有几个核心属性:

java;gutter:true; @AliasFor("name") String value() default "";</p> <p>@Deprecated String serviceId() default "";</p> <p>/*<em> * This will be used as the bean name instead of name if present, but will not be used as a service id.这个注释我理解的似乎有点问题,不知道理解的对不对 </em>/ String contextId() default "";</p> <p>@AliasFor("value") String name() default "";</p> <p>String qualifier() default "";</p> <pre><code> spring会用FeignClientsRegistrar这个类注册当前client,其中有一个很重要的属性就是clientName,因为clientName会影响到我们配置该client,clientName的定义看下面代码,可以看到contextId的优先级最高,当你定义了contextId后clientName取的就是contextId。 </code></pre> <p>org.springframework.cloud.openfeign.FeignClientsRegistrar.getClientName</p> <pre><code> ;gutter:true;
private String getClientName(Map client) {
if (client == null) {
return null;
}
String value = (String) client.get("contextId");//可以看到contextId的优先级最高>value>name>serviceId
if (!StringUtils.hasText(value)) {
value = (String) client.get("value");
}
if (!StringUtils.hasText(value)) {
value = (String) client.get("name");
}
if (!StringUtils.hasText(value)) {
value = (String) client.get("serviceId");
}
if (StringUtils.hasText(value)) {
return value;
}

throw new IllegalStateException("Either ‘name’ or ‘value’ must be provided in @"
+ FeignClient.class.getSimpleName());
}

其中有一个很容易搞错的问题,就是client beanName(区别于clientName),首先看出qualifier的级别最高,如果没有定义qualifier但定义了contextId后实际的bean名称是contextId+”FeignClient”

org.springframework.cloud.openfeign.FeignClientsRegistrar.registerFeignClient

java;gutter:true; String alias = contextId + "FeignClient";//拼接了FeignClient AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();</p> <p>boolean primary = (Boolean)attributes.get("primary"); // has a default, won't be null</p> <p>beanDefinition.setPrimary(primary);</p> <p>String qualifier = getQualifier(attributes); if (StringUtils.hasText(qualifier)) {//如果有qualifier就用qualifier alias = qualifier; }</p> <pre><code> 但是FeignClient注解contextId源码中的注释 This will be used as the bean name instead of name if present, but will not be used as a service id.我理解起来这个注释有点问题 spring cloud feign的配置都是基于clientName来识别的,例如 feign.client.clientName.connect-timeout=100 相关配置会被装载到FeignClientProperties,其中支持配置的属性如图 ![SpringCloud--feign的配置加载](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/866987-20211229185849233-673640189.png) 最终通过FeignClientFactoryBean将FeignClientProperties中相应client的配置装配到feignclient中,核心方法为 _org.springframework.cloud.openfeign._ _FeignClientFactoryBean.configureFeign_ ;gutter:true;
protected void configureFeign(FeignContext context, Feign.Builder builder) {
FeignClientProperties properties = applicationContext.getBean(FeignClientProperties.class);
if (properties != null) {
if (properties.isDefaultToProperties()) {
//三种配置依次装载
configureUsingConfiguration(context, builder);//先配置Java代码中的配置
configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()), builder);//配置文件中的默认配置
configureUsingProperties(properties.getConfig().get(this.contextId), builder);//配置了clientName的配置
} else {
configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()), builder);
configureUsingProperties(properties.getConfig().get(this.contextId), builder);
configureUsingConfiguration(context, builder);
}
} else {
configureUsingConfiguration(context, builder);
}
}

Original: https://www.cnblogs.com/minjay/p/15746223.html
Author: minjay26
Title: SpringCloud–feign的配置加载

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579836/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • liquibase 数据库同步工具

    记录在开发环境对数据库的变更操作,整理为sql文件后,发布测试环境或者生产环境时,自动执行配置的sql文件,不对生产环境进行直接操作 参考: 官方文档:https://docs.l…

    Java 2023年6月16日
    096
  • 性能调优——小小的log大大的坑

    引言 “只有被线上服务问题毒打过的人才明白日志有多重要!”我先说结论,谁赞成,谁反对?如果你深有同感,那恭喜你是个社会人了:) 日志对程序的重要性不言而喻,…

    Java 2023年6月15日
    0112
  • [Java] Hashtable 源码简要分析

    线程安全。 Key、Value均不能为null。 包含了一个Entry[]数组,而Entry又是一个链表,用来处理冲突。 每个Key对应了Entry数组中固定的位置(记为index…

    Java 2023年5月29日
    0103
  • docker

    P1.docker镜像无法删除(检索关键词:无法删除) &#x73B0;&#x8C61;&#xFF1A;删除提示:Error:No such image:x…

    Java 2023年6月16日
    077
  • Java 注解

    Java的注解是个很神奇的东西,它既可以帮你生成代码,又可以结合反射来在运行时获得注解标识的对象,进行逻辑处理,它能帮助我们完成很多很多不可能完成的任务,这回我们就来一起来了解下它…

    Java 2023年5月29日
    095
  • 初学JAVA-10-java代码的组织结构

    在上一篇笔记中,我们进行简单的人机交互介绍时,引入了一个Scanner类,在所有使用到Scanner的类里,在最开始都有一段代码 import java.util.Scanner;…

    Java 2023年5月29日
    080
  • MQTT 入门(3)–MQTT QoS 详解

    本文主要介绍 MQTT 协议中 QoS(服务质量) 的详细内容。 1、概述 MQTT 协议 中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下…

    Java 2023年6月16日
    094
  • 云原生系列3 pod核心字段

    pod是容器化的基础,好比大楼的地基。 Pod跟容器的关系 类比一下: POD: 物理机 容器: 物理机上的一个进程; 容器只是Pod的一个普通字段。 Pod的作用范围 跟容器的l…

    Java 2023年6月8日
    0111
  • Nginx 的安装和使用

    Nginx是一款轻量级的 Web 服务器、 反向代理服务器及电子邮件(IMAP/POP3)代理服务器,是 lgor Sysoev 为俄罗斯访问量第二的 rambler.ru 站点设…

    Java 2023年6月16日
    088
  • 北京思特奇2023年校招笔试(Java)

    北京思特奇2023年校招笔试(Java) 1、表达式 (short)10/10.2*2 运算后结果是什么类型? 答案:double,浮点数默认是double,自动类型向上转换为浮点…

    Java 2023年6月15日
    083
  • HIT软构博客2–java异常和final语法

    final的用法: 修饰变量:final关键字修饰的基本数据类型变量称为常量,不可更改。 final修饰的引用类型是不能改变其引用地址的,但可以改变地址内部属性。 修饰方法:fin…

    Java 2023年6月5日
    069
  • 函数式编程 jdk10中stream流里面peek方法

    最近在我的课程里面SpringBoot2.0不容错过的新特性 WebFlux响应式编程里面,有学员提出了以下问题,在jdk10里面代码没有执行(课程中stream流是用jdk8演示…

    Java 2023年6月9日
    076
  • Spring(四):HelloSpring

    上一篇学习了控制反转(IoC)的本质和具体实现方法,这次我们就学习写一个小的项目来体验这个过程。 一、项目构建 1.Maven依赖(导包) <dependencies>…

    Java 2023年6月15日
    096
  • RabbitMQ——ACK确认机制

    一。介绍 1.消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除 2.消费者在处理消息出现了网络不稳定、服务器异…

    Java 2023年5月30日
    0123
  • Java8的Lambda表达式简单介绍

    Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。 JDK 也提供…

    Java 2023年5月29日
    082
  • JVM学习笔记之Java内存区域与OOM【二】

    Java 内存区域与 OOM 虚拟机基本结构图示 一、运行时数据区域 运行时数据区域 图示 标注颜色的两块区域:所有线程共享的数据区域 1.1 程序计数器(progams coun…

    Java 2023年6月5日
    0112
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球