Как заставить spring-cloud zuul использовать другую схему для разных служб

Я пытаюсь использовать spring-cloud-starter-zuul. Я установил Eureka и зарегистрировал простую услугу, которую я написал как клиент Eureka. Я регистрирую два экземпляра на двух разных хостах с двумя разными именами приложений, поэтому они являются двумя разными службами в Eureka. Моя цель состоит в том, чтобы гарантировать, что если serviceA работает хорошо, а serviceB работает плохо, то проксирование serviceA не зависит от отказа прокси-сервера serviceB.

если я запускаю тест нагрузки serviceA в одиночку через zuul я могу поддерживать пропускную способность 400 TPS без проблем. Если я затем бросаю serviceB и полностью перегружаю его и имею его тайм-аут повсюду, я ожидал бы, что serviceA будет продолжаться на 400, пока serviceB барахтается,но вместо этого serviceA падает до менее чем 50 TPS успеха и имеет кучу ошибок.

похоже, что все RibbonCommands, порожденные RibbonRoutingFilter, имеют одну и ту же схему в hystrix, что для меня не имеет смысла. Глядя в RibbonRoutingFilter, где он создает RibbonCommand, я не вижу никакого способа настроить его на использование другого.

В RibbonRoutingFilter:

    RibbonCommand command = new RibbonCommand(restClient, verb, uri,
            convertHeaders(headers), convertHeaders(params), requestEntity);

Я проверил, что restClient отличается для serviceA и serviceB, поэтому они используют свою собственную конфигурацию пула соединений, как я указал в приложении.файл yml, но есть еще тонна перекрестного загрязнения в качестве обслуживания между serviceA и serviceB.

для RibbonCommand существует другой конструктор, который принимает "commandKey" в качестве первого параметра, а тот, на который я ссылаюсь, просто делегирует тот, у которого значение commandKey "default". Я не вижу переключателей или опций для переопределения этого в RibbonRoutingFilter. Для меня это серьезно подрывает жизнеспособность Zuul при использовании из проекта spring-cloud.

есть ли способ настроить это из коробки, чтобы каждая служба имеет свой собственный контур?

применимые части моего пом:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-parent</artifactId>
      <version>1.0.0.RC1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
  </dependency>

приложение.в формате YML:

ribbon:
  ConnectTimeout: 5000
  ReadTimeout: 5000
  MaxAutoRetries: 0
  MaxAutoRetriesNextServer: 0
  OkToRetryOnAllOperations: false
  MaxHttpConnectionsPerHost: 200
  MaxTotalHttpConnections: 1000
echo1:
  ribbon:
    ActiveConnectionsLimit: 200
echo2:
  ribbon:
    ActiveConnectionsLimit: 400
spring:
  application:
    name: SpringCloudProxywall
server:
  port: 8080
zuul:
  routes:
    echo1:
      path: /echo1/**
      serviceId: echo1
      stripPrefix: false
    echo2:
      path: /echo2/**
      serviceId: echo2
      stripPrefix: false

мой класс применение:

@Configuration
@ComponentScan
//@EnableCircuitBreaker  <-- is already included in EnableZuulProxy
@EnableZuulProxy
@EnableTurbine
@EnableHystrixDashboard
@EnableAutoConfiguration
public class SpringCloudProxywallApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudProxywallApplication.class, args);
    }
}

1 ответов


Я думаю, если вы используете снимок, который уже является значением по умолчанию (разные схемы на бэкэнд):https://github.com/spring-cloud/spring-cloud-netflix/issues/160.