親からのスニペットであるSpringCloudを使用したマイクロサービスプロジェクトがあります。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
すべてのサービスはEurekaサーバーで実行されています。
すべてのサービスは正常に実行されています。私はPostmanで適切な電話をかけることができ、すべてが正常に機能します。
pom
からのスニペットであるHystrixダッシュボードを処理する別のサービスがあります。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-Tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
構成メインクラス:
@SpringBootApplication
@EnableHystrixDashboard
public class DashboardApp {
public static void main(String[] args) {
SpringApplication.run(DashboardApp.class, args);
}
}
およびconfigyaml
ファイル:
spring:
application:
name: Dashboard
server:
port: 8000
eureka:
client:
fetchRegistry: true
registerWithEureka: false
serviceUrl:
defaultZone: http://localhost:8761/eureka
次のダッシュボードを探しています:
コンソールからの完全なスタックトレースは ここ です。以下はいくつかのスニペットです:
2018-04-12 11:28:25.089 ERROR 15762 --- [qtp295055909-16] ashboardConfiguration$ProxyStreamServlet : Error proxying request: http://localhost:8082/hystrix.stream
Java.lang.RuntimeException: org.Eclipse.jetty.io.EofException
at org.springframework.cloud.netflix.hystrix.dashboard.HystrixDashboardConfiguration$ProxyStreamServlet.doGet(HystrixDashboardConfiguration.Java:208)
....
Caused by: org.Eclipse.jetty.io.EofException: null
...
Caused by: Java.io.IOException: Broken pipe
...
サービス自体は、スプリングアクチュエータでアクセスできます。
pom
からの抜粋:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
構成クラスの外観:
@EnableHystrix
@EnableEurekaClient
@SpringBootApplication
public class TableApp {
public static void main(String[] args) {
SpringApplication.run(TableApp.class, args);
}
}
この問題を解決する方法は?
最後に、私は解決策を見つけました。
問題は、Controller APIを HystrixCommand アノテーションで販売する必要があることでした。
ドキュメントからの抜粋:
Turbine AMQP by Spring Cloud offers a different model where each
application instance pushes the metrics from Hystrix commands to
Turbine through a central AMQP broker.
次のように、すべてのコントローラーのメソッドにパラメーターなしで追加しました。
@RestController
@AllArgsConstructor
public class GuestController {
private DinnerService dinnerService;
@HystrixCommand
@PostMapping("/dinner")
public Integer startDinner(@RequestBody List<Integer> menuItems) {
return dinnerService.startDinner(menuItems);
}
@HystrixCommand
@DeleteMapping("/dinner/{tableId}")
public void finishDinner(@PathVariable Integer tableId) {
dinnerService.finishDinner(tableId);
}
}
そして今、すべてが魅力的なように機能します:
今、私はそれにとても近かったことを理解しています。
Spring Boot 2を使用している場合は、hystrix.stream
エンドポイントが/actuator/hystrix.stream
に移動されました。
私にとってこのURLは機能しました:
http://localhost:8082/actuator/hystrix.stream
はい、次のプロパティを使用してこのアクチュエータエンドポイントを有効にします。
management.endpoints.web.exposure.include=hystrix.stream
もちろん、プロジェクトにアクチュエータの依存関係が含まれている必要があります。
Hystrixダッシュボード自体を使用して、一度に複数のインスタンスを監視することはできません。必要なのは タービン +ダッシュボードです。一言で言えば、タービンはいくつかのhystrixメトリックストリームのアグリゲーターです。
インスタンスの構成:
management:
endpoints:
web:
exposure:
include: hystrix.stream, info, health
spring:
application:
name: WRITING
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
ここで重要なことは、hystix.streamアクチュエーターを公開することです。このエンドポイントは、タービンがメトリックを読み取るために使用されます。また、アクチュエータスターターを追加することを忘れないでください。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
すべてを正しく行った場合http://localhost:8080/actuator/hystrix.stream
エンドポイントが利用可能になるはずです。
タービン構成は次のようになります。
server:
port: 8888
spring:
application:
name: TURBINE
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
turbine:
appConfig: WRITING,READING
clusterNameExpression: new String('default')
appConfig
で、監視するサービス名を指定する必要があります。
タービン始動後localhost:8888/turbine.stream
使えるようになる。
このURLをダッシュボードに渡して、検出されたインスタンスのhystrixコマンドについて集約されたすべてのデータを監視できます。
Github プロジェクトの例。
p.s.使用した依存関係は非推奨になりました。確認してください maven repo