在使用 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);
}
}
上述代码适合已知服务地址直接进行调用的情况。