2016-03-07 67 views
3

我在我的本地機器上玩着所有這些夢幻般的Spring Cloud東西。我有一個基於Zuul的API-Gateway發現並調用Spring Data Rest服務。很棒。Spring Cloud Zuul,Spectator和Atlas配置

現在我想介紹一下Spectator和Atlas。我似乎無法正確配置此配置。如果我在Zuul服務上啓用Atlas,Atlas客戶端的RestTemplate將失敗,因爲Ribbon試圖包裝它並且Ribbon不知道「地圖集」。如果我爲Atlas添加Ribbon Client配置,那麼我的API網關調用會中斷。有沒有一種方法可以排除織帶包裝中的地圖集路線?我錯過了什麼?見下:

我已經定義了一個主機名「atlas」指向本地主機。 Atlas服務器正在運行。

Zuul/API網關的依賴關係:

spring-boot-starter-parent: 1.3.2.RELEASE 
spring-boot-starter-actuator 
spring-cloud-starter-config 
spring-cloud-starter-eureka 
spring-cloud-starter-hystrix 
spring-cloud-starter-zuul 
spring-cloud-starter-stream-rabbit 
spring-boot-starter-hateoas 
spring-boot-starter-test 
spring-cloud-starter-spectator 
spring-cloud-starter-atlas 

Zuul/API網關應用properties--

hystrix.command.default.execution.isolation.strategy: SEMAPHORE 
netflix.atlas.uri=http://atlas:7101/api/v1/publish 
server.port: ${PORT:8080} 

API網關引導屬性:

spring.application.name=reservationClient 
spring.cloud.config.uri=http://localhost:8888 

Zuul /尤里卡/色帶/ Hystrix客戶端全部按預期工作,但Atlas客戶端失敗。

@SpringBootApplication 
@EnableZuulProxy 
@EnableHystrix 
@EnableEurekaClient 
@EnableAtlas 
@EnableScheduling 
public class APIGateway { 

    @Autowired 
    Registry registry; 

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

阿特拉斯客戶端是通過絲帶包裹和色帶不知道阿特拉斯

2016-03-07 08:57:50.312 ERROR 184 --- [trace=,span=] [ask-scheduler-2] o.s.integration.handler.LoggingHandler : java.lang.IllegalStateException: No instances available for atlas 
    at org.springframework.cloud.netflix.ribbon.RibbonClientHttpRequestFactory.createRequest(RibbonClientHttpRequestFactory.java:58) 
    at org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:77) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:592) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:475) 
    at org.springframework.cloud.netflix.metrics.atlas.AtlasMetricObserver.sendMetricsBatch(AtlasMetricObserver.java:148) 
    at org.springframework.cloud.netflix.metrics.atlas.AtlasMetricObserver.update(AtlasMetricObserver.java:126) 
    at org.springframework.cloud.netflix.metrics.atlas.AtlasExporter.export(AtlasExporter.java:35) 
    at org.springframework.boot.actuate.metrics.export.MetricExporters$ExportRunner.run(MetricExporters.java:112) 
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

好吧,讓我們定義一個功能區客戶端地圖集。

@SpringBootApplication 
@EnableZuulProxy 
@EnableHystrix 
@EnableEurekaClient 
@EnableAtlas 
@EnableScheduling 
public class APIGateway { 

    @Autowired 
    Registry registry; 

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

@Component 
public class AtlasClientConfiguration { 
    @Bean 
    public StaticServerList ribbonServerList() { 
     return new StaticServerList<Server>(new Server("atlas", 7101)); 
    } 
} 

現在Atlas客戶端很開心。我看到POST到Atlas服務器。
但現在通過Zuul我的GET請求我的春節,數據服務,是用來工作,現正與失敗:

「HTTP方法不允許的,支持的方法:POST」

感謝您的幫助!

回答

3

我偶然發現瞭解決方案。

AtlasClientConfiguration不是一個組件它只是一個提供StaticServerList的Bean。刪除@Component。

我需要明確命名我的RibbonClient配置。即 @RibbonClient(NAME = 「地圖集」,配置= AtlasClientConfiguration.class)

@SpringBootApplication 
@EnableZuulProxy 
@EnableHystrix 
@EnableEurekaClient 
@RibbonClient(name = "atlas", configuration = AtlasClientConfiguration.class) 
@EnableAtlas 
@EnableScheduling 
public class APIGateway { 

    @Autowired 
    Registry registry; 

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


public class AtlasClientConfiguration { 

    @Bean 
    public StaticServerList<Server> ribbonServerList() { 
     return new StaticServerList<Server>(new Server("atlas", 7101)); 
    } 
} 
+0

不錯的工作,這是最終我會說。雖然地圖集使用啓用Ribbon的RestTemplate很奇怪。 – spencergibb

+1

我爲此添加了一個問題,您不需要執行您所做的操作。 https://github.com/spring-cloud/spring-cloud-netflix/issues/881 – spencergibb

+0

@spencergibb感謝您在此打開一個問題......並感謝您在Spring Cloud/Netflix上的所有工作。這真是太棒了。 – MarkOfHall

相關問題