Притворная регистрация - Spring Cloud - Смена цели без переброса ленты - PullRequest
0 голосов
/ 04 октября 2019

Введение

Я хотел бы иметь возможность иметь два разных пружинных профиля и в зависимости от профиля менять адрес в жестком коде для наших симулирующих строителей.

В настоящее время было следующее:

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

Но это не работает: (

1 Ответ

0 голосов
/ 07 ноября 2019

Введение

Я нашел решение для этого с помощью прокси, который обнаруживает заголовок. Итак, у меня есть симметричный перехватчик на стороне java, который присоединяет заголовок x-service-name к каждому feign-запросу.

У меня также есть прокси NodeJS, который анализирует запросы, находит x-service-name и повторнопишет запросы, чтобы стать: x-service-name / originalRequestPath.

Это позволяет мне иметь все микросервисы за шлюзом zuul, но также получать к ним доступ с помощью eureka-over-ride.

Java-Feign-Interceptor

 Feign.Builder builder = Feign.builder()
            .client(client)
            .encoder(usedEncoder)
            .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);
            }
        });

NodeJS-прокси

В этом примере мой шлюз zuul (или другой прокси-сервер) находится на localhost: 9001. Я слушаю localhost:1200.

let enableProxyForJava = process.env.ENABLE_PROXY_FOR_JAVA;
if (enableProxyForJava != undefined &&  enableProxyForJava.toLowerCase() === 'true') {
    var httpProxyJava = require('http-proxy');
    var proxyJava = httpProxyJava.createProxy();

    gutil.log(  gutil.colors.green('Enabling Proxy for Java. Set your Eureka overrides to localhost:1200.') );

    require('http').createServer(function(req, res) {
        console.log("req.headers['x-service-name'] = " + req.headers['x-service-name']);
        console.log("Before req.url:"+ req.url);

        if( req.headers['x-service-name'] != undefined){
            let change =  req.headers['x-service-name'] +req.url;
            console.log("After req.url:"+ change);
            req.url = change;
        }

        proxyJava.web(req, res, {
            target: 'http://localhost:9001/'
        });

    }).listen(1200);
}

Файл свойств внутри Java-приложения с симулированными клиентами

mbak-microservice1.ribbon.NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
mbak-microservice1.ribbon.listOfServers: localhost:1200

mbak-microservice2.ribbon.NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
mbak-microservice2.ribbon.listOfServers: localhost:1200

mbak-document-store.ribbon.NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
mbak-document-store.ribbon.listOfServers: localhost:1200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...