首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在使用SpringCloud OpenFeign时为每个Feign实例创建不同的客户端?

有没有办法在使用SpringCloud OpenFeign时为每个Feign实例创建不同的客户端?
EN

Stack Overflow用户
提问于 2021-02-07 18:18:25
回答 1查看 228关注 0票数 1

我们可以在使用OpenFeign时指定Feign实例的客户端,如下所示:

代码语言:javascript
复制
        his.fooClient = Feign.builder()
                .client(clientA)
                .target(FooClient.class, "https://PROD-SVC");

        this.adminClient = Feign.builder()
                .client(clientB)
                .target(FooClient.class, "https://PROD-SVC");

但是,如果使用SpringCloud OpenFeign,似乎没有办法做到这一点,所有的Feign实例将共享一个客户端,因为我们无法根据文件名:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/appendix.htmlFeign实例配置客户端。

那么,如何在使用SpringCloud OpenFeign的同时实现这一目标呢?

EN

回答 1

Stack Overflow用户

发布于 2021-02-13 23:26:40

您必须手动创建Feign实例,与使用OpenFeign的方式相同。

好消息是,您可以在@Import({FeignClientsConfiguration.class})中使用部分SpringCloud OpenFeign配置

同样,@RefreshScope也可以与这种方法一起使用。对于由@FeignClient注释创建的客户端,不可能使用@RefreshScope

对于简单的情况,可以使用FeignClientBuilder。但是它对Feign的配置能力很差。

这些beans将从FeignClientsConfiguration导入

DecoderEncoderContractFeignLoggerFactory

Contract用于使用像@PostMapping这样的Spring REST注解。

代码语言:javascript
复制
@Component
@RefreshScope
@Import({FeignClientsConfiguration.class})
class SomeClientFeign implements SomeClientApi {

    private static final boolean ALWAYS_FOLLOW_REDIRECTS = true;

    private final SomeConfig config;

    private final Decoder decoder;

    private final Encoder encoder;

    private final Contract contract;

    private final FeignLoggerFactory loggerFactory;

    private SomeClientApi clientApi;

    @Autowired
    public SomeClientFeign(SomeConfig config,
                           Decoder decoder, Encoder encoder,
                           Contract contract, FeignLoggerFactory loggerFactory) {
        this.config = config;
        this.decoder = decoder;
        this.encoder = encoder;
        this.contract = contract;
        this.loggerFactory = loggerFactory;
    }

    @PostConstruct
    private void createFeignClient() {
        Logger logger = loggerFactory.create(SomeClientApi.class);
        Logger.Level logLevel = config.isLogging() ? Logger.Level.FULL : Logger.Level.NONE;

        clientApi = Feign.builder()
                .client(client())
                .retryer(Retryer.NEVER_RETRY)
                .logger(logger)
                .logLevel(logLevel)
                .encoder(encoder).decoder(decoder).contract(contract)
                .options(requestOptions())
                .requestInterceptor(basicAuthRequestInterceptor())
                .target(SomeClientApi.class, config.getUrl());
    }

    private OkHttpClient client() {
        // to not recreate the client for each request, it is not important because the same dispatcher is used
        okhttp3.OkHttpClient client = new okhttp3.OkHttpClient.Builder()
                .connectTimeout(config.getConnectTimeoutMillis(), TimeUnit.MILLISECONDS)
                .readTimeout(config.getReadTimeoutMillis(), TimeUnit.MILLISECONDS)
                .followRedirects(ALWAYS_FOLLOW_REDIRECTS)
                .build();

        return new OkHttpClient(client);
    }

    private Request.Options requestOptions() {
        return new Request.Options(
                config.getConnectTimeoutMillis(), TimeUnit.MILLISECONDS,
                config.getReadTimeoutMillis(), TimeUnit.MILLISECONDS,
                ALWAYS_FOLLOW_REDIRECTS
        );
    }

    private BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor(config.getUsername(), config.getPassword());
    }

    @Override
    public SomeResponse create(SomeRequest request) {
        return clientApi.createSomething(request);
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66086739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档