如何动态创建一个 Feign 客户端

在使用 open feign 的时候,我们都是直接在接口上添加 @FeignClient 注解, open feign 会通过服务发现,自动生成接口的实现类并交给 Spring 容器来管理。如果我们已知服务的地址,想直接进行调用,可以手动生成 Feign 客户端:

import feign.Feign;
import feign.Target;
import feign.codec.Decoder;
import feign.codec.Encoder;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import org.springframework.cloud.openfeign.support.SpringMvcContract;

/**
 * 动态构建RPC客户端
 */
public class FeignClientBuilder<T> {

    private Encoder encoder = new JacksonEncoder();
    private Decoder decoder = new JacksonDecoder();

    private Class<T> targetClass;

    public FeignClientBuilder(Class<T> targetClass) {
        this.targetClass = targetClass;
    }

  	// instanceHost: http://192.168.0.3:8088
    public T build(String instanceHost) {

        Feign.Builder builder = Feign.builder()
                .encoder(encoder)
                .decoder(decoder)
                .requestInterceptor(template -> {
                        template.header("Content-Type", "application/json");
                })
          			// 指定 Feign 如何解析注解。 使用 SpringMvcContract 让 Feign 能够理解 SpringMVC 的注解
          			// 例如 @RequestMapping, @GetMapping 等
          			.contract(new SpringMvcContract());

        // 显式指定 name 和 URL
        Target<T> target = new Target.HardCodedTarget<>(
                targetClass,
                instanceHost,  // 自定义唯一标识
                instanceHost
        );
        return builder.target(target);
    }

}

上述代码适合已知服务地址直接进行调用的情况。

使用 Hugo 构建
主题 StackJimmy 设计