@FeignClient无法支持同一service具有多种不同配置的FeignClient,因此,在必要时需要手动build FeignClient
首先创建FeignClientConfigurer类,这个类相当于build FeignClient的工具类
FeignClientConfigurer.java
@Import(FeignClientsConfiguration.class)
public class FeignClientConfigurer {
private Decoder decoder;
private Encoder encoder;
private Client client;
private Contract contract;
private LoadBalancedResourceDetails loadBalancedResourceDetails;
public FeignClientConfigurer(Decoder decoder, Encoder encoder, Client client, Contract contract, LoadBalancedResourceDetails loadBalancedResourceDetails) {
this.decoder = decoder;
this.encoder = encoder;
this.client = client;
this.contract = contract;
this.loadBalancedResourceDetails = loadBalancedResourceDetails;
}
public RequestInterceptor getOAuth2RequestInterceptor() {
return new OAuth2FeignRequestInterceptor(new DefaultOAuth2ClientContext(), loadBalancedResourceDetails);
}
public RequestInterceptor getUserFeignClientInterceptor() {
return new UserFeignClientInterceptor();
}
public <T> T buildAuthorizedFeignClient(Class<T> clazz, String serviceName) {
return getBasicBuilder().requestInterceptor(getOAuth2RequestInterceptor()).target(clazz, buildServiceUrl(serviceName));
}
public <T> T buildAuthorizedUserFeignClient(Class<T> clazz, String serviceName) {
return getBasicBuilder().requestInterceptor(getUserFeignClientInterceptor()).target(clazz, buildServiceUrl(serviceName));
}
private String buildServiceUrl(String serviceName) {
return "http://" + serviceName;
}
protected Feign.Builder getBasicBuilder() {
return Feign.builder().client(client).encoder(encoder).decoder(decoder).contract(contract);
}
}
使用工具类的方法创建多个FeignClient配置
FeignClientConfiguration.java
@Configuration
public class FeignClientConfiguration extends FeignClientConfigurer {
public FeignClientConfiguration(Decoder decoder, Encoder encoder, Client client, Contract contract, LoadBalancedResourceDetails loadBalancedResourceDetails) {
super(decoder, encoder, client, contract, loadBalancedResourceDetails);
}
@Bean
public UaaFeignClient uaaFeignClient() {
return super.buildAuthorizedFeignClient(UaaFeignClient.class, "uaa");
}
@Bean
public QueryUserFeignClient queryUserFeignClient() {
return super.buildAuthorizedUserFeignClient(QueryUserFeignClient.class, "uaa");
}
}
其中,super.buildAuthorizedUserFeignClient()方法中,第一个参数为调用别的服务的接口类,第二个参数为被调用服务在注册中心的service-id。
UaaFeignClient.java
public interface UaaFeignClient {
@RequestMapping(value = "/users", method = RequestMethod.GET)
UserDTO getUser(@RequestParam("userId") String userId);
}