我能否使用属性或yml文件配置@FeignClient的url?

42

我的目标是创建一个步骤不同的策略,从点对点通信的两个组件到使用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://dev59.com/j1cP5IYBdhLWcg3w2NiZ#54455735 - Forest10
3个回答

49

通常情况下,它不会用于绑定到Spring Boot的@ConfigurationProperties,但这仍然是Netflix原生的。 - Dave Syer
4
我试过了,但遇到了以下错误:com.netflix.client.ClientException: Load balancer does not have available server for client: foo。注意:我使用的是 application.yml 而不是 application.properties - Pleymor
你可能格式化YAML有误。或者我没有理解问题。 - Dave Syer
4
@Pleymor,我曾经遇到过同样的问题,不得不设置ribbon.eureka.enabled=false才能让Ribbon使用基于配置的服务器列表。我正在使用相当旧版本的Spring Cloud库(1.0.0.RELEASE)和Netflix相关库(feign-ribbon 7.1.0和ribbon 2.0-RC13)。也许在新版本中已经做出了改变。 - moxn
1
如果您有一个所有Feign客户端的基本URL,例如“/api”,会怎样呢? - dukethrash

45

这可以这样做:

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

fdmobile.ribbon.listOfServers : value 是在 application.properties 文件中的一个属性。

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


1
如果您的服务器列表中有多个服务器,则不是真的。这会将仅一个URL硬编码,并将listOfServers作为单个值处理。 - alrodi
2
这对我们来说很好用,因为我们只需要在本地环境中使用它,在其他环境中我们使用Eureka,所以名称就足够了。 - Tatha
能否在RequestLine注释中完成这个任务? - frlzjosh

0

我找到了一种非常简单的方法,在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: 在@FeignClient中,必须提供“名称”或“值”之一 - Stanislau Listratsenka
你必须向 feignCliente 添加 name 属性,因为在新版本中这是必需的。 @FeignClient(url = "https:/\${url}", name = "Cadastro", decode404 = true) - JHONATAN CASSIANO KRAMER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接