7

我知道我们可以通过提供 url Ex 来强制 FeignClient 使用 OkHttp 而不是 Ribbon。@FeignClient(url="serviceId", name="serviceId")

即使只提供了名称,我也希望使用 OkHttpClient。前任。@FeignClient(name="serviceId")

根据 spring cloud 文档“如果启用了 Ribbon,它是一个 LoadBalancerFeignClient,否则使用默认的 feign 客户端。”

如何禁用功能区以便使用默认的 feign 客户端。

4

3 回答 3

2

互联网上的解决方案都不适合我。

  1. 只需在该部分中设置绝对 urlurl就会导致负载平衡异常
// this resulted in java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: localhost

@Lazy
@Configuration
@Import(FeignClientsConfiguration.class)
public class MyConfig {

    @LocalServerPort
    private int port;

    @Bean
    public MyClient myClient(final Decoder decoder, final Encoder encoder, final Client client) {
        return Feign.builder().client(client)
            .encoder(encoder)
            .decoder(decoder)
            .target(MyClient.class, "http://localhost:" + localServerPort);
    }
}
  1. 设置spring.cloud.loadbalancing.ribbon.enabled=false导致应用程序上下文问题。需要禁用其他设置才能使其正常工作。我没有进一步探究
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eurekaLoadBalancerClientConfiguration': Invocation of init method failed; nested exception is java.lang.NullPointerException

    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:416)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)
...
...

我的工作解决方案

最后,在检查了源代码之后org.springframework.cloud.openfeign.ribbon.DefaultFeignLoadBalancedConfiguration,我想出了这个解决方案

@Lazy // required for @LocalServerPort to work in a @Configuration/@TestConfiguration
@TestConfiguration
@Import(FeignClientsConfiguration.class)
public class MyConfig {

    @LocalServerPort
    private int port;

    @Bean
    public MyClient myClient(Decoder decoder, Encoder encoder, Client client, Contract contract) {
        return Feign.builder().client(client)
            .encoder(encoder)
            .decoder(decoder)
            .contract(contract)
            .target(MyClient.class, "http://localhost:" + localServerPort);
    }

    // provide a default `FeignClient` so that Spring will not automatically create their LoadBalancingFeignClient
    @Bean
    public Client feignClient(SpringClientFactory clientFactory) {
        return new Client.Default(null, null);
    }
}
于 2021-08-23T04:28:52.970 回答
0

我有同样的问题,但我的设置有点不同,我没有让它在我的情况下工作(使用 spring-cloud-starter-openfeign 和 spring mvc 样式注释)。


仅供参考:我需要一个带有 SSLSocketFactory 的自定义客户端,最后只是为客户端创建 bean 并保持 url@FeignClient

 @Bean
 public Client myClient() {
     return new Client.Default(getSSLSocketFactory(), new NoopHostnameVerifier());
 }

但是,我们确实有使用 spring-cloud-starter-feign 的项目,其中没有在注释上提供 URL。不确定下面的配置是否完整(我没有设置),但它可能会为您指明正确的方向......

依赖关系

compile("org.springframework.cloud:spring-cloud-starter-feign") {
    exclude group: 'org.springframework.cloud', module: 'spring-cloud-starter-ribbon'
    exclude group: 'org.springframework.cloud', module: 'spring-cloud-starter-archaius'
}

配置

@Configuration
@Import(FeignClientsConfiguration.class) // org.springframework.cloud.netflix.feign.FeignClientsConfiguration
public class MyConfig {

    @Value("${client.url}")
    private String url;    

    @Bean
    public MyClient myClient(final Decoder decoder, final Encoder encoder, final Client client) {
        return Feign.builder().client(client)
            .encoder(encoder)
            .decoder(decoder)
            .target(MyClient.class, url);
    }
}
于 2018-10-30T17:05:36.063 回答
0

它与功能区无关。

检查这个:

feign:
  httpclient:
    enabled: false

这将禁用 spring cloud 自动配置的 httpclient,并将在上下文中搜索@Bean命名。所以在一个类中httpClient提供定义,仅此而已。@Bean@Configuration

FeignAutoConfiguration在 spring cloud feign 中检查类。

https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html

于 2019-06-28T13:33:18.537 回答