Введение
Я хотел бы иметь возможность иметь два разных пружинных профиля и в зависимости от профиля менять адрес в жестком коде для наших симулирующих строителей.
В настоящее время было следующее:
return builder.target(cls, "http://" + serviceName);
Но я бы хотел сделать следующее и переопределить адрес:
return builder.target(cls, "http://our-server:8009/" + serviceName);
Почему
Иногда мы не хотим запускать все службы в нашей среде разработки. Кроме того, некоторые из услуг иногда доступны только через шлюз zuul.
Итак, мы запускаем один и тот же код в разных ситуациях и условиях.
Технические подробности
У нас есть следующий код, который мы используем для построения наших симулированных клиентов.
В прошлом мы использовали аннотацию @FeignClient
, но в последнее время решили начать сборку наших feignClients вручную.
Пример ниже:
@FeignClient(name = "ab-document-store", configuration = MultiPartSupportConfiguration.class, fallback = DocumentStoreFallback.class)
Мы вызываем класс feignRegistrar с помощью следующей команды:
return registerFeignClient(DocumentStoreClient.class, true);
@RequiredArgsConstructor
//@Component
@Slf4j
public class FeignRegistrar {
@Autowired
private Decoder decoder;
@Autowired
private Encoder encoder;
@Autowired
private Client client;
@Autowired
private Contract feignContract;
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Autowired
private List<RequestInterceptor> interceptors;
public <T> T register(Class<T> cls, String serviceName, boolean isDocumentStore) {
if(isDocumentStore){
encoder = new MultipartFormEncoder(new SpringEncoder(messageConverters));
}
//Client trustSSLSockets = new Client.Default(getSSLSocketFactory(), new NoopHostnameVerifier());
Feign.Builder builder = Feign.builder()
.client(client)
.encoder(encoder)
.decoder(decoder)
.contract(feignContract)
.logger(new Slf4Logger())
.logLevel(Logger.Level.HEADERS);
builder.requestInterceptor(new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
template.header("X-Service-Name", serviceName);
}
});
for(RequestInterceptor interceptor : interceptors) {
builder.requestInterceptor(interceptor);
}
log.debug("Registering {} - as feign proxy ", serviceName);
return builder.target(cls, "http://" + serviceName);
}
public static class Slf4Logger extends Logger {
@Override
protected void log(String configKey, String format, Object... args) {
log.info("{} - {}", configKey, args);
}
}
}
Переопределение свойства Spring Cloud
Мытакже использовали файлы свойств, такие как application-ENV.property
, с такими записями, как:
ab-document-store.ribbon.NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
ab-document-store.ribbon.listOfServers: localhost:8025
К сожалению, listOfServers
нам недостаточно. Мы хотели бы также иметь возможность назначить каталог / путь. Что-то вроде:
ab-document-store.ribbon.listOfServers: localhost: 8025 / ab-document-store
Otherworkaround
Я думал о том, чтобы пробраться в заголовок ввсе запросы, такие как X-SERVICE-NAME
с использованием симулированного перехватчика. Затем мы могли бы указать всем службам адрес (например, localhost: 9001) и перенаправить / прокси эти запросы на localhost: 9001 / X-SERVICE-NAME.
Однако я бы предпочел гораздо более простое решение, например:
ab-document-store.ribbon.listOfServers: localhost:8025/ab-document-store
Но это не работает: (