2015-12-24 10 views
6

Şeridine here in section Customizing the Ribbon Client benim IRule şöyle görünür: Geçiş istek başlıklarını Bir Bahar Bulut uygulama var ve açıklandığı gibi ben kurdele istemci özelleştirme am IRule anahtar parametre

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 

    } 

Bir istirahat Kontrolörü var:

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

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

    return result; 
} 

IRule'imde bir sonraki sunucuyu başlıklardan birinin değerine göre seçmek istiyorum. nasıl? Benim özel IRule anahtar parametreye başlıklarını geçebilir sınıf AbstractLoadBalancerAwareClient içinde

Edit Olası Yön

(RestTemplate üzerinden ya feign veya Şeridi kullanan başka bir seçenek ... varsa)

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(); 

LoadBalancer komutunu bina ve ihmal:

.withServerLocator(request) 

işi yapacaktı! Ben ilkbaharda RibbonClientConfiguration sınıf I yapılandırabilir, yapılandırmasından bu yöntemi geçersiz kılabilirsiniz:

@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; 
} 

sorun adıyla şey çalışmıyor olmasıdır:

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

var gibi görünüyor Bu adla yapılması gereken bazı yapılandırmalar, çünkü loadbalancer sunucu listemin bir nedenle her zaman boş olduğunu görüyorum, eğer birisi bu özelliği nasıl yapılandırabileceğimi biliyorsa sorunu çözebileceğine inanıyorum ...

+0

Şerit, geçerli istek hakkında bilgi sahibi değil. Ayrıca başka bir iş parçacığında çalışır. – spencergibb

+0

IRule anahtar parametresini geçmek için geri kalanı şablonuna geçebilir ve altta yatan Şerit'e iletirse, sorunu çözerim sadece nasıl olduğunu bilmiyorum ...(belki de dinlenme şablonuna özel önleyici ekleyebilir veya yük dengeleyici gibi başka bir sınıfı geçersiz kılar ...) –

+0

Bu, aşağıdakilerden sonra bir şey olabilir: https://github.com/jmnarloch/ribbon-discovery-filter-spring-cloud- starter – spencergibb

cevap

3

Çalışmanızı sağlamak için bazı değişikliklerle yaklaşımınızı attım: ribbonRestClient çekirdeğinin yanısıra ribbonServerList fasulyesini de sağlamanız gerekiyor. ancak ConfigurationBasedServerList kullanan RibbonClientConfiguration içinde tanımlanan fasulye almayın. Boş bir liste almanın nedeni budur. Eğer eureka yerine EurekaRibbonClientConfiguration gelen fasulye almak kullanmayı tercih eğer, sunucu listesine yapılandırmanızı tanımlamak veya ya:

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

dinamik sunucu listesini doldurmak olacak. Bunun yanı sıra, ribbonRestClientBean'ı geçersiz kılmak için kullandığınız yapılandırma dosyasının otomatik taranmadığından emin olun. denemek ve uygulama yükleme sırasında doldurmak için

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

neden olan şey var . Ya farklı bir pakette ana uygulama sınıfı yapılandırmayı koymak veya

Son olarak tarayarak dışında tutmak, @RibbonClient/ana sınıfına @RibbonClients geçersiz kılınmış konfigürasyonda

@RibbonClients(defaultConfiguration = {my.non.autoScanned.MyRibbonClientConfiguration.class}) 
@SpringBootApplication() 
public class MyApp { 
işaret eklemek unutmayın
+0

harika, gerçekten işe yarıyor! –

İlgili konular