Как заставить 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.