我可以使用属性/yml 文件配置 @FeignClient 网址吗?

Posted

技术标签:

【中文标题】我可以使用属性/yml 文件配置 @FeignClient 网址吗?【英文标题】:Can I configure a @FeignClient url using a properties/yml file? 【发布时间】:2015-05-30 10:37:13 【问题描述】:

我的目标是创建一个包含不同步骤的策略,从两个组件之间的点对点通信到使用 eureka、ribbon、hystrix 的“成熟的 netflix”通信风格。每次迭代时,我都想添加更多内容,同时尝试限制对实际代码的更改量。 Feign 是我首选的客户端框架来实现这一点。第一步是创建一个 FeignClient 与服务器通信:

@FeignClient(url = "http://localhost:9000")
interface Client 
    @RequestMapping(method = RequestMethod.GET, value = "/author/author/addedValue/addedValue")
    Result addToTotal(@RequestParam(value="author") String author, @RequestParam(value="addedValue") long addedValue);

这可行,但我不希望在注释中硬编码 URL。我想要这个:@FeignClient() 并具有如下属性构造:client.url:http://localhost:9000

到目前为止,我找不到有关如何配置它的任何线索,并且在 spring-cloud 源中找不到解决方案。

可以吗?如果可以;怎么样?

【问题讨论】:

希望这个答案可以帮助你。 https://***.com/questions/43733569/how-can-i-change-the-feign-url-during-the-runtime/54455735#54455735 【参考方案1】:

我得到了一个非常简单的方式传递环境变量的接口FeignClient,

    @FeignClient(url = "https://"+"\$url")
    interface Client 
    
  @RequestMapping(method = RequestMethod.GET, value = "/author/author/addedValue/addedValue")
    Result addToTotal(@RequestParam(value="author") String author, @RequestParam(value="addedValue") long addedValue);

属性

#URL
url.client=$URL

.env

URL=https:localhost:9000

【讨论】:

不行java.lang.IllegalStateException: Either 'name' or 'value' must be provided in @FeignClient 你必须将name属性添加到feignCliente,因为在新版本中这是必需的@FeignClient(url = "https:/\$url", name = "Cadastro", decode404 = true)【参考方案2】:

这可以这样完成:

@FeignClient(name="fd-mobileapi-service",url="$fdmobile.ribbon.listOfServers")

其中fdmobile.ribbon.listOfServers : valueapplication.properties 中的属性。

我已经测试过了,它正在工作。

【讨论】:

如果您的服务器列表中有多个服务器,则不正确。这仅对一个 url 进行硬编码,并将 listOfServers 作为单个值。 这对我们来说效果很好,因为我们只需要在本地环境中使用它,对于我们使用 Eureka 的其他环境,名称就足够了 这可以在RequestLine注解中完成吗?【参考方案3】:

可以使用“serviceId”而不是“url”来完成。例如

@FeignClient("foo")
interface Client  ... 

foo.ribbon.listOfServers: localhost:9000

例如有关文档,请参阅 http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-ribbon-without-eureka。

【讨论】:

如果是用来绑定Spring Boot @ConfigurationPoperties一般不会,但这仍然是Netflix原生的。 我试过了,但出现以下错误:com.netflix.client.ClientException: Load balancer does not have available server for client: foo。注意:我使用 application.yml 而不是 application.properties 你可能弄错了 YAML 格式。或者我没听懂这个问题。 @Pleymor,我遇到了同样的问题,必须设置 ribbon.eureka.enabled=false 才能让 Ribbon 使用基于配置的服务器列表。不过,我使用的是相当旧版本的 Spring Cloud 库(1.0.0.RELEASE)和 Netflix 的东西(feign-ribbon 7.1.0 和ribbon 2.0-RC13)。也许这已在较新的版本中进行了更改 如果你有一个所有 feign 客户端的基本 URL,比如“/api”?

以上是关于我可以使用属性/yml 文件配置 @FeignClient 网址吗?的主要内容,如果未能解决你的问题,请参考以下文章

优雅读取yml中的属性

SpringBoot项目属性配置

springboot属性类自动加载配置文件中的值

Wildfly Swarm YML属性文件

spring boot项目中使用@Value获取yml配置文件中的属性值不对的问题。

Spring Boot 配置文件