2015-11-26 2 views
1

Я следил за Spring Cloud Netflix's guide для настройки турбины. После включения Hystrix в двух микросервисах я подтвердил, что конечные точки /hystrix.stream генерируют правильный вывод.Spring Cloud Netflix Hystrix Turbine не получает информацию от услуг на том же хосте

Теперь в проекте панели hystrix я настроил Турбину, чтобы получить агрегированные результаты всех сервисов. Однако все это я получаю последовательность:

: ping 
data: {"reportingHostsLast10Seconds":0,"name":"meta","type":"meta","timestamp":1448552456486} 

Это мой конфиг:

HystrixDashboard + Turbine Применение:

@EnableHystrixDashboard 
@EnableTurbine 
@SpringBootApplication 
public class HystrixDashboardApplication { 

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

HystrixDashboard + Turbine application.yml:

spring: 
    application: 
    name: hystrix-dashboard 

server: 
    port: 10000 

turbine: 
    appConfig: random-story-microservice,storyteller-api 
    instanceUrlSuffix: /hystrix.stream 

logging: 
    level: 
    com.netflix.turbine: 'TRACE' 

UPDATE

Следуя указаниям kreel, я настроил турбина так:

turbine: 
    appConfig: random-story-microservice,storyteller-api 
    instanceUrlSuffix: /hystrix.stream 
    clusterNameExpression: new String("default") 

Он не терпит неудачу с исключением больше и в журналах я вижу, что турбина находит двух кандидатов хостов/microservices :

[  Timer-0] c.n.t.discovery.InstanceObservable  : Retrieved hosts from InstanceDiscovery: 2 

Однако только один из них, наконец, зарегистрирован. В InstanceObservable.run() добавлен только один из хостов, поскольку они имеют один и тот же хэш-код, поэтому при добавлении в newState.hostsUp они считаются одинаковыми. com.netflix.turbine.discovery.Instance хэш рассчитывается на основе имени хоста («MyHost» в обоих случаях), и кластер («по умолчанию»):

// set the current state 
      for(Instance host: newList) { 
       if(host.isUp()) { 
        newState.hostsUp.add(host); 
       } else { 
        newState.hostsDown.add(host); 
       } 
      } 

Что мы должны делать, когда же хозяин предлагает два различных microservices? В этом случае регистрируется только первый экземпляр.

+1

Существует усиление, что позволит турбине это. https://github.com/spring-cloud/spring-cloud-netflix/pull/661 – spencergibb

+0

Отлично! Спасибо за информацию! – codependent

ответ

0

Я думаю, что у меня есть ответ, но сначала, конечно, почему вы ожидаете «дефолт»?

+0

Я не настроил какой-либо кластер в 'turbine: aggregator: clusterConfig: XXXX', таким образом значение параметра clusterName' default' – codependent

0

На самом деле я думаю, вы непонимание документа:

The configuration key turbine.appConfig is a list of eureka serviceIds that turbine will use to lookup instances. The turbine stream is then used in the Hystrix dashboard using a url that looks like: http://my.turbine.sever:8080/turbine.stream?cluster=<CLUSTERNAME>; (the cluster parameter can be omitted if the name is "default"). The cluster parameter must match an entry in turbine.aggregator.clusterConfig. Values returned from eureka are uppercase, thus we expect this example to work if there is an app registered with Eureka called "customers": 

turbine: 
    aggregator: 
    clusterConfig: CUSTOMERS 
    appConfig: customers 

В вашем случае:

turbine: 
    aggregator: 
    clusterConfig: MY_CLUSTER 
    appConfig: random-story-microservice,storyteller-api 

Так он будет возвращать "случайная историю-microservice, сказочник-апи" в верхнем регистре.

+0

Спасибо за сообщение. Вы правы, я неправильно понял документацию.Однако (см. ОБНОВЛЕНИЕ 2 в вопросе), таким образом вы получаете информацию только об одной службе за один раз – codependent

0

Так что, я думаю, вам нужно применить эту часть:

The clusterName can be customized by a SPEL expression in turbine.clusterNameExpression with root an instance of InstanceInfo. The default value is appName, which means that the Eureka serviceId ends up as the cluster key (i.e. the InstanceInfo for customers has an appName of "CUSTOMERS"). A different example would be turbine.clusterNameExpression=aSGName, which would get the cluster name from the AWS ASG name. Another example: 

turbine: 
    aggregator: 
    clusterConfig: SYSTEM,USER 
    appConfig: customers,stores,ui,admin 
    clusterNameExpression: metadata['cluster'] 

In this case, the cluster name from 4 services is pulled from their metadata map, and is expected to have values that include "SYSTEM" and "USER". 

To use the "default" cluster for all apps you need a string literal expression (with single quotes): 

turbine: 
    appConfig: customers,stores 
    clusterNameExpression: 'default' 

Spring Cloud provides a spring-cloud-starter-turbine that has all the dependencies you need to get a Turbine server running. Just create a Spring Boot application and annotate it with @EnableTurbine. 

Добавьте это в вашей конфигурации: clusterNameExpression: «по умолчанию»

+0

При использовании clusterNameExpression: «default» Я получаю исключение при запуске: 'org.springframework.expression.spel.SpelEvaluationException: EL1008E: (pos 0): свойство или поле «default» не могут быть найдены на объекте типа «com.netflix.appinfo.InstanceInfo» - возможно, не public? ' – codependent

+0

Я попытаюсь настроить карты метаданных клиента Eureka с общим именем. Еще раз спасибо за вашу помощь. – codependent

+0

Нет, я думаю, что теперь вы отправляете вам сводную информацию прямо сейчас. Просто попробуйте распечатать результат вашего запроса juste, чтобы увидеть. – kreel

Смежные вопросы