2015-12-24 8 views
6

Mam aplikacji Wiosna Chmura i ja dostosowywania klienta taśmą jak wyjaśniono here in section Customizing the Ribbon Client mój IRule wygląda następująco:nagłówki żądania podaje do Ribbon IRule kluczowym parametrem

public class HeadersRule extends AbstractLoadBalancerRule { 

public HeadersRule() { 
} 

public HeadersRule(ILoadBalancer lb) { 
    this(); 
    this.setLoadBalancer(lb); 
} 

public Server choose(ILoadBalancer lb, Object key) { 

    //I want the key to contain the headers from the request so I can decide choose the server by one of the headers 

    } 

Mam kontroler rekreacyjne:

@RequestMapping("/") 
public String hello(HttpServletRequest request, HttpServletResponse response) { 

    //here I want to pass the key parameter to ribbon 

    return result; 
} 

Chcę w moim IRule wybrać następny serwer według wartości jednego z nagłówków. Jak mogę przejść do mojego nagłówki zwyczaj IRule parametru klucza? (Przez RestTemplate lub udawać, lub jeśli masz inną opcję, która używa Ribbon ...)

Edycja możliwego kierunku

w klasie AbstractLoadBalancerAwareClient

public T executeWithLoadBalancer(final S request, final IClientConfig requestConfig) throws ClientException { 
    RequestSpecificRetryHandler handler = getRequestSpecificRetryHandler(request, requestConfig); 
    LoadBalancerCommand<T> command = LoadBalancerCommand.<T>builder() 
      .withLoadBalancerContext(this) 
      .withRetryHandler(handler) 
      .withLoadBalancerURI(request.getUri()) 
      .build(); 

budynku komendy LoadBalancer i pomijając:

.withServerLocator(request) 

zrobiłby to zadanie! mogę zastąpić tę metodę od konfiguracji, na wiosnę RibbonClientConfiguration klasa mogę skonfigurować:

@Bean 
@Lazy 
@ConditionalOnMissingBean 
public RestClient ribbonRestClient(IClientConfig config, ILoadBalancer loadBalancer) { 
    RestClient client = new OverrideRestClient(config); 
    client.setLoadBalancer(loadBalancer); 
    Monitors.registerObject("Client_" + this.name, client); 
    return client; 
} 

Problemem jest to, że coś z nazwą nie działa:

@Value("${ribbon.client.name}") 
private String name = "client"; 

Wydaje się, że niektóre konfiguracje, które powinny być wykonane z tą nazwą, ponieważ widzę, że moja lista serwerów loadbalancer jest zawsze pusty z jakiegoś powodu, jeśli ktoś wie, jak skonfigurować tę właściwość Wierzę, że może rozwiązać problem ...

+0

Wstążka nie ma informacji o bieżącym żądaniu. Działa również w innym wątku. – spencergibb

+0

Gdybym mógł przekazać kluczowy parametr IRule, wybrałbym funkcję do reszty szablonu i przerzuci go do podstawowej wstążki, która rozwiąże problem, po prostu nie wiem jak ...(być może dodanie niestandardowego przechwytywacza do szablonu odpoczynku lub nadpisanie innej klasy, takiej jak moduł równoważenia obciążenia ...) –

+0

Może to być wzór do naśladowania: https://github.com/jmnarloch/ribbon-discovery-filter-spring-cloud- starter – spencergibb

Odpowiedz

3

Podjęłam twoje podejście z pewnymi modyfikacjami, aby go uruchomić: Poza tym do wzięcia fasoli ribbonRestClient musisz dostarczyć bean bean beanServerList. ale nie przyjmuj komponentu bean zdefiniowanego w RibbonClientConfiguration, który używa ConfigurationBasedServerList. to jest powód, dla którego dostajesz pustą listę. można też określić listę serwerów konfigurację albo, jeśli wolisz korzystać eureka podjąć fasoli z EurekaRibbonClientConfiguration Zamiast:

@Bean 
@ConditionalOnMissingBean 
public ServerList<?> ribbonServerList(IClientConfig config) { 
    DiscoveryEnabledNIWSServerList discoveryServerList = new DiscoveryEnabledNIWSServerList(
      config); 
    DomainExtractingServerList serverList = new DomainExtractingServerList(
      discoveryServerList, config, this.approximateZoneFromHostname); 
    return serverList; 
} 

że będzie dynamicznie zapełnić listę serwerów. poza tym upewnij się, że plik konfiguracyjny, którego używasz do zastąpienia wstążkiRestClientBean, nie jest skanowany automatycznie. to właśnie jest przyczyną

@Value("${ribbon.client.name}") 
private String name = "client"; 

spróbować wypełnić po załadowaniu aplikacji. albo umieścić konfigurację w innym opakowaniu, że głównym klasy aplikacji lub wykluczyć ze skanowania

Wreszcie, nie zapomnij dodać @RibbonClient/@RibbonClients do głównej klasy, aby wskazać zastąpionej konfiguracji

@RibbonClients(defaultConfiguration = {my.non.autoScanned.MyRibbonClientConfiguration.class}) 
@SpringBootApplication() 
public class MyApp { 
+0

Dobrze, że to działa! –

Powiązane problemy