From 0f5f86aa5e66b7cc650510660faf7abfa94ad231 Mon Sep 17 00:00:00 2001 From: Dab Date: Tue, 6 Mar 2018 16:31:46 +0800 Subject: [PATCH 01/12] commit : hystrix --- .../api-gateway-with-eureka/pom.xml | 0 .../main/java/com/didispace/AccessFilter.java | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/application.yaml | 0 .../pom.xml" => 2-Dalston/api-gateway/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/application.yaml | 0 .../config-client/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/bootstrap.yml | 2 +- .../config-server-git/pom.xml | 0 .../main/java/com/didispace/Application.java | 29 ++++++++++ .../src/main/resources/application.yml | 6 +-- .../consul-client/pom.xml | 1 + .../main/java/com/didispace/Application.java | 2 +- .../main/java/com/didispace/DcController.java | 5 ++ .../src/main/resources/application.properties | 20 +++++++ .../consul-consumer/pom.xml | 1 + .../main/java/com/didispace/Application.java | 2 +- .../main/java/com/didispace/DcController.java | 10 +++- .../src/main/resources/application.properties | 21 ++++++++ .../eureka-client/pom.xml | 0 .../main/java/com/didispace/Application.java | 2 +- .../main/java/com/didispace/DcController.java | 42 +++++++++++++++ .../src/main/resources/application.properties | 0 .../eureka-consumer-feign-hystrix/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/java/com/didispace/DcClient.java | 0 .../java/com/didispace/DcClientFallback.java | 0 .../main/java/com/didispace/DcController.java | 0 .../src/main/resources/application.properties | 0 .../eureka-consumer-feign/pom.xml | 7 +++ .../main/java/com/didispace/Application.java | 1 + .../src/main/java/com/didispace/DcClient.java | 30 +++++++++++ .../main/java/com/didispace/DcController.java | 0 .../src/main/resources/application.properties | 0 .../eureka-consumer-ribbon-hystrix/pom.xml | 4 ++ .../main/java/com/didispace/Application.java | 22 +++++++- .../main/java/com/didispace/DcController.java | 17 ++++-- .../src/main/resources/application.properties | 0 .../spring-cloud-starter-dalston-5-1-4.png | Bin 0 -> 80317 bytes .../eureka-consumer-ribbon/pom.xml | 14 +++++ .../main/java/com/didispace/Application.java | 42 +++++++++++++++ .../main/java/com/didispace/DcController.java | 0 .../src/main/resources/application.properties | 0 .../eureka-consumer/pom.xml | 0 .../main/java/com/didispace/Application.java | 5 +- .../main/java/com/didispace/DcController.java | 4 +- .../src/main/resources/application.properties | 0 .../eureka-feign-api/pom.xml | 0 .../java/com/didispace/api/HelloService.java | 0 .../eureka-feign-client/pom.xml | 0 .../com/didispace/api/impl/Application.java | 0 .../src/main/resources/application.properties | 0 .../eureka-feign-consumer/pom.xml | 0 .../didispace/api/consumer/Application.java | 0 .../src/main/resources/application.properties | 0 .../eureka-server/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../resources/application-peer1.properties | 0 .../resources/application-peer2.properties | 0 .../src/main/resources/application.properties | 0 .../hystrix-collapser-consumer/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../main/java/com/didispace/UserService.java | 0 .../src/main/resources/application.properties | 0 .../src/test/java/CollapserTest.java | 0 .../hystrix-collapser-provider/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../java/com/didispace/UserController.java | 0 .../src/main/resources/application.properties | 0 2-Dalston/hystrix-dashboard/pom.xml | 50 ++++++++++++++++++ .../HystrixDashboardApplication.java | 7 +-- .../src/main/resources/application.properties | 0 .../pom.xml" => 2-Dalston/pom.xml | 0 .../stream-hello/pom.xml | 0 .../com/didispace/stream/SinkApplication.java | 0 .../com/didispace/stream/SinkReceiver.java | 0 .../src/main/resources/application.properties | 0 .../com/didispace/SinkApplicationTests.java | 0 .../pom.xml" => 2-Dalston/trace-1/pom.xml | 0 .../java/com/didispace/TraceApplication.java | 0 .../src/main/resources/application.properties | 0 .../pom.xml" => 2-Dalston/trace-2/pom.xml | 0 .../java/com/didispace/TraceApplication.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/logback-spring.xml | 0 .../turbine-amqp/pom.xml | 0 .../com/didispace/TurbineApplication.java | 0 .../src/main/resources/application.properties | 0 .../pom.xml" => 2-Dalston/turbine/pom.xml | 0 .../com/didispace/TurbineApplication.java | 0 .../src/main/resources/application.properties | 0 .../zipkin-server-stream/pom.xml | 0 .../java/com/didispace/ZipkinApplication.java | 0 .../src/main/resources/application.properties | 0 .../zipkin-server/pom.xml | 0 .../java/com/didispace/ZipkinApplication.java | 0 .../src/main/resources/application.properties | 0 .../main/java/com/didispace/Application.java" | 15 ------ .../java/com/didispace/DcController.java" | 27 ---------- .../main/resources/application.properties" | 5 -- .../main/resources/application.properties" | 7 --- .../main/java/com/didispace/DcClient.java" | 17 ------ .../main/java/com/didispace/Application.java" | 22 -------- .../hystrix-dashboard/pom.xml" | 50 ------------------ 106 files changed, 325 insertions(+), 164 deletions(-) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/pom.xml" => 2-Dalston/api-gateway-with-eureka/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java" => 2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/src/main/java/com/didispace/Application.java" => 2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/Application.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/src/main/resources/application.yaml" => 2-Dalston/api-gateway-with-eureka/src/main/resources/application.yaml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway/pom.xml" => 2-Dalston/api-gateway/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway/src/main/java/com/didispace/Application.java" => 2-Dalston/api-gateway/src/main/java/com/didispace/Application.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway/src/main/resources/application.yaml" => 2-Dalston/api-gateway/src/main/resources/application.yaml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/pom.xml" => 2-Dalston/config-client/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/src/main/java/com/didispace/Application.java" => 2-Dalston/config-client/src/main/java/com/didispace/Application.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/src/main/resources/bootstrap.yml" => 2-Dalston/config-client/src/main/resources/bootstrap.yml (86%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/pom.xml" => 2-Dalston/config-server-git/pom.xml (100%) create mode 100644 2-Dalston/config-server-git/src/main/java/com/didispace/Application.java rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/src/main/resources/application.yml" => 2-Dalston/config-server-git/src/main/resources/application.yml (52%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/pom.xml" => 2-Dalston/consul-client/pom.xml (97%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/java/com/didispace/Application.java" => 2-Dalston/consul-client/src/main/java/com/didispace/Application.java (74%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/java/com/didispace/DcController.java" => 2-Dalston/consul-client/src/main/java/com/didispace/DcController.java (60%) create mode 100644 2-Dalston/consul-client/src/main/resources/application.properties rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/pom.xml" => 2-Dalston/consul-consumer/pom.xml (97%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/java/com/didispace/Application.java" => 2-Dalston/consul-consumer/src/main/java/com/didispace/Application.java (79%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/java/com/didispace/DcController.java" => 2-Dalston/consul-consumer/src/main/java/com/didispace/DcController.java (68%) create mode 100644 2-Dalston/consul-consumer/src/main/resources/application.properties rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/pom.xml" => 2-Dalston/eureka-client/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/java/com/didispace/Application.java" => 2-Dalston/eureka-client/src/main/java/com/didispace/Application.java (71%) create mode 100644 2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/resources/application.properties" => 2-Dalston/eureka-client/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/pom.xml" => 2-Dalston/eureka-consumer-feign-hystrix/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/Application.java" => 2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/Application.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClient.java" => 2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClient.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClientFallback.java" => 2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClientFallback.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcController.java" => 2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcController.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/resources/application.properties" => 2-Dalston/eureka-consumer-feign-hystrix/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/pom.xml" => 2-Dalston/eureka-consumer-feign/pom.xml (79%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/Application.java" => 2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/Application.java (85%) create mode 100644 2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/DcClient.java rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/DcController.java" => 2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/DcController.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/resources/application.properties" => 2-Dalston/eureka-consumer-feign/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/pom.xml" => 2-Dalston/eureka-consumer-ribbon-hystrix/pom.xml (83%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java" => 2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java (52%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java" => 2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java (56%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/resources/application.properties" => 2-Dalston/eureka-consumer-ribbon-hystrix/src/main/resources/application.properties (100%) create mode 100644 2-Dalston/eureka-consumer-ribbon-hystrix/src/main/resources/spring-cloud-starter-dalston-5-1-4.png rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/pom.xml" => 2-Dalston/eureka-consumer-ribbon/pom.xml (66%) create mode 100644 2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java" => 2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/resources/application.properties" => 2-Dalston/eureka-consumer-ribbon/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/pom.xml" => 2-Dalston/eureka-consumer/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java" => 2-Dalston/eureka-consumer/src/main/java/com/didispace/Application.java (70%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/java/com/didispace/DcController.java" => 2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java (77%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/resources/application.properties" => 2-Dalston/eureka-consumer/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-api/pom.xml" => 2-Dalston/eureka-feign-api/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-api/src/main/java/com/didispace/api/HelloService.java" => 2-Dalston/eureka-feign-api/src/main/java/com/didispace/api/HelloService.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-client/pom.xml" => 2-Dalston/eureka-feign-client/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-client/src/main/java/com/didispace/api/impl/Application.java" => 2-Dalston/eureka-feign-client/src/main/java/com/didispace/api/impl/Application.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-client/src/main/resources/application.properties" => 2-Dalston/eureka-feign-client/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-consumer/pom.xml" => 2-Dalston/eureka-feign-consumer/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-consumer/src/main/java/com/didispace/api/consumer/Application.java" => 2-Dalston/eureka-feign-consumer/src/main/java/com/didispace/api/consumer/Application.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-consumer/src/main/resources/application.properties" => 2-Dalston/eureka-feign-consumer/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/pom.xml" => 2-Dalston/eureka-server/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/java/com/didispace/Application.java" => 2-Dalston/eureka-server/src/main/java/com/didispace/Application.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/resources/application-peer1.properties" => 2-Dalston/eureka-server/src/main/resources/application-peer1.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/resources/application-peer2.properties" => 2-Dalston/eureka-server/src/main/resources/application-peer2.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/resources/application.properties" => 2-Dalston/eureka-server/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/pom.xml" => 2-Dalston/hystrix-collapser-consumer/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/main/java/com/didispace/Application.java" => 2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/Application.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java" => 2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/main/resources/application.properties" => 2-Dalston/hystrix-collapser-consumer/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/test/java/CollapserTest.java" => 2-Dalston/hystrix-collapser-consumer/src/test/java/CollapserTest.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/pom.xml" => 2-Dalston/hystrix-collapser-provider/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/java/com/didispace/Application.java" => 2-Dalston/hystrix-collapser-provider/src/main/java/com/didispace/Application.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/java/com/didispace/UserController.java" => 2-Dalston/hystrix-collapser-provider/src/main/java/com/didispace/UserController.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/resources/application.properties" => 2-Dalston/hystrix-collapser-provider/src/main/resources/application.properties (100%) create mode 100644 2-Dalston/hystrix-dashboard/pom.xml rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/src/main/java/com/didispace/HystrixDashboardApplication.java" => 2-Dalston/hystrix-dashboard/src/main/java/com/didispace/HystrixDashboardApplication.java (60%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/src/main/resources/application.properties" => 2-Dalston/hystrix-dashboard/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/pom.xml" => 2-Dalston/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/pom.xml" => 2-Dalston/stream-hello/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/main/java/com/didispace/stream/SinkApplication.java" => 2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkApplication.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java" => 2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/main/resources/application.properties" => 2-Dalston/stream-hello/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/test/java/com/didispace/SinkApplicationTests.java" => 2-Dalston/stream-hello/src/test/java/com/didispace/SinkApplicationTests.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-1/pom.xml" => 2-Dalston/trace-1/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-1/src/main/java/com/didispace/TraceApplication.java" => 2-Dalston/trace-1/src/main/java/com/didispace/TraceApplication.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-1/src/main/resources/application.properties" => 2-Dalston/trace-1/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/pom.xml" => 2-Dalston/trace-2/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/src/main/java/com/didispace/TraceApplication.java" => 2-Dalston/trace-2/src/main/java/com/didispace/TraceApplication.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/src/main/resources/application.properties" => 2-Dalston/trace-2/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/src/main/resources/logback-spring.xml" => 2-Dalston/trace-2/src/main/resources/logback-spring.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine-amqp/pom.xml" => 2-Dalston/turbine-amqp/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java" => 2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine-amqp/src/main/resources/application.properties" => 2-Dalston/turbine-amqp/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine/pom.xml" => 2-Dalston/turbine/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine/src/main/java/com/didispace/TurbineApplication.java" => 2-Dalston/turbine/src/main/java/com/didispace/TurbineApplication.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine/src/main/resources/application.properties" => 2-Dalston/turbine/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server-stream/pom.xml" => 2-Dalston/zipkin-server-stream/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java" => 2-Dalston/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server-stream/src/main/resources/application.properties" => 2-Dalston/zipkin-server-stream/src/main/resources/application.properties (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server/pom.xml" => 2-Dalston/zipkin-server/pom.xml (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java" => 2-Dalston/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java (100%) rename "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server/src/main/resources/application.properties" => 2-Dalston/zipkin-server/src/main/resources/application.properties (100%) delete mode 100644 "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/src/main/java/com/didispace/Application.java" delete mode 100644 "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/java/com/didispace/DcController.java" delete mode 100644 "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/resources/application.properties" delete mode 100644 "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/resources/application.properties" delete mode 100644 "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/DcClient.java" delete mode 100644 "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/java/com/didispace/Application.java" delete mode 100644 "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/pom.xml" diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/pom.xml" b/2-Dalston/api-gateway-with-eureka/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/pom.xml" rename to 2-Dalston/api-gateway-with-eureka/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java" b/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java" rename to 2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/src/main/java/com/didispace/Application.java" b/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/Application.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/src/main/java/com/didispace/Application.java" rename to 2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/Application.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/src/main/resources/application.yaml" b/2-Dalston/api-gateway-with-eureka/src/main/resources/application.yaml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway-with-eureka/src/main/resources/application.yaml" rename to 2-Dalston/api-gateway-with-eureka/src/main/resources/application.yaml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway/pom.xml" b/2-Dalston/api-gateway/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway/pom.xml" rename to 2-Dalston/api-gateway/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway/src/main/java/com/didispace/Application.java" b/2-Dalston/api-gateway/src/main/java/com/didispace/Application.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway/src/main/java/com/didispace/Application.java" rename to 2-Dalston/api-gateway/src/main/java/com/didispace/Application.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway/src/main/resources/application.yaml" b/2-Dalston/api-gateway/src/main/resources/application.yaml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/api-gateway/src/main/resources/application.yaml" rename to 2-Dalston/api-gateway/src/main/resources/application.yaml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/pom.xml" b/2-Dalston/config-client/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/pom.xml" rename to 2-Dalston/config-client/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/src/main/java/com/didispace/Application.java" b/2-Dalston/config-client/src/main/java/com/didispace/Application.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/src/main/java/com/didispace/Application.java" rename to 2-Dalston/config-client/src/main/java/com/didispace/Application.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/src/main/resources/bootstrap.yml" b/2-Dalston/config-client/src/main/resources/bootstrap.yml similarity index 86% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/src/main/resources/bootstrap.yml" rename to 2-Dalston/config-client/src/main/resources/bootstrap.yml index 0d92aeb9..730830c9 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-client/src/main/resources/bootstrap.yml" +++ b/2-Dalston/config-client/src/main/resources/bootstrap.yml @@ -4,7 +4,7 @@ spring: cloud: config: uri: http://localhost:1201/ - profile: default + profile: dev label: master server: diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/pom.xml" b/2-Dalston/config-server-git/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/pom.xml" rename to 2-Dalston/config-server-git/pom.xml diff --git a/2-Dalston/config-server-git/src/main/java/com/didispace/Application.java b/2-Dalston/config-server-git/src/main/java/com/didispace/Application.java new file mode 100644 index 00000000..9e78c356 --- /dev/null +++ b/2-Dalston/config-server-git/src/main/java/com/didispace/Application.java @@ -0,0 +1,29 @@ +package com.didispace; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.config.server.EnableConfigServer; + +//添加@EnableConfigServer注解,开启Spring Cloud Config的服务端功能。 +@EnableConfigServer +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + new SpringApplicationBuilder(Application.class).web(true).run(args); + } + +} +/** + * Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。 + * + * 其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口; + * 而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。 + * + * Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。 + * + * 由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器, + * 天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。 + * + * 当然它也提供了对其他存储方式的支持,比如:SVN仓库、本地化文件系统。 + */ \ No newline at end of file diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/src/main/resources/application.yml" b/2-Dalston/config-server-git/src/main/resources/application.yml similarity index 52% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/src/main/resources/application.yml" rename to 2-Dalston/config-server-git/src/main/resources/application.yml index c3154087..bd25b8f4 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/src/main/resources/application.yml" +++ b/2-Dalston/config-server-git/src/main/resources/application.yml @@ -5,10 +5,10 @@ spring: config: server: git: - uri: http://git.oschina.net/didispace/config-repo-demo/ + uri: https://gitee.com/pdb2010/config-server # search-paths: repo -# username: -# password: + username: pangdabo2010@hotmail.com + password: ZXCVbnm.123 server: port: 1201 diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/pom.xml" b/2-Dalston/consul-client/pom.xml similarity index 97% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/pom.xml" rename to 2-Dalston/consul-client/pom.xml index 467dca3b..dbefbaba 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/pom.xml" +++ b/2-Dalston/consul-client/pom.xml @@ -24,6 +24,7 @@ + org.springframework.cloud spring-cloud-starter-consul-discovery diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/java/com/didispace/Application.java" b/2-Dalston/consul-client/src/main/java/com/didispace/Application.java similarity index 74% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/java/com/didispace/Application.java" rename to 2-Dalston/consul-client/src/main/java/com/didispace/Application.java index 13dba6a3..a50e3531 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/java/com/didispace/Application.java" +++ b/2-Dalston/consul-client/src/main/java/com/didispace/Application.java @@ -4,7 +4,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -@EnableDiscoveryClient +@EnableDiscoveryClient // Discovery Client 标识,并会自动化读取相关配置,向服务注册中心发现服务并进行调用。 @SpringBootApplication public class Application { diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/java/com/didispace/DcController.java" b/2-Dalston/consul-client/src/main/java/com/didispace/DcController.java similarity index 60% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/java/com/didispace/DcController.java" rename to 2-Dalston/consul-client/src/main/java/com/didispace/DcController.java index 4a90799a..c82dab0c 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/java/com/didispace/DcController.java" +++ b/2-Dalston/consul-client/src/main/java/com/didispace/DcController.java @@ -16,6 +16,11 @@ public class DcController { @Autowired DiscoveryClient discoveryClient; + // - DiscoveryClient 服务发现客户端,具有以下方法: + // - String description(); 获取描述 + // - ServiceInstance getLocalServiceInstance(); @Deprecated 方法被删除,推荐不要使用。获取本地服务实例 + // - List getInstances(String serviceId); 通过服务 ID,获取当前服务的服务实例 + // - List getServices(); 获取所有服务 ID 列表 @GetMapping("/dc") public String dc() { diff --git a/2-Dalston/consul-client/src/main/resources/application.properties b/2-Dalston/consul-client/src/main/resources/application.properties new file mode 100644 index 00000000..058a4670 --- /dev/null +++ b/2-Dalston/consul-client/src/main/resources/application.properties @@ -0,0 +1,20 @@ +spring.application.name=consul-client +server.port=2001 + +#基于consul服务治理的服务提供者 +spring.cloud.consul.host=localhost +spring.cloud.consul.port=8500 + +# 关闭 健康检查 +management.health.defaults.enabled = false + +#Spring Cloud Consul项目是针对Consul的服务治理实现。 + +# Consul是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。 +# 它包含了下面几个特性: +# 服务发现 +# 健康检查 +# Key/Value存储 +# 多数据中心 + +#由于Spring Cloud Consul项目的实现,我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上,并通过此实现微服务架构中的服务治理。 \ No newline at end of file diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/pom.xml" b/2-Dalston/consul-consumer/pom.xml similarity index 97% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/pom.xml" rename to 2-Dalston/consul-consumer/pom.xml index 436115f3..d6b6fd1f 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/pom.xml" +++ b/2-Dalston/consul-consumer/pom.xml @@ -24,6 +24,7 @@ + org.springframework.cloud spring-cloud-starter-consul-discovery diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/java/com/didispace/Application.java" b/2-Dalston/consul-consumer/src/main/java/com/didispace/Application.java similarity index 79% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/java/com/didispace/Application.java" rename to 2-Dalston/consul-consumer/src/main/java/com/didispace/Application.java index 72e9100d..8f62ad6d 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/java/com/didispace/Application.java" +++ b/2-Dalston/consul-consumer/src/main/java/com/didispace/Application.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; -@EnableDiscoveryClient +@EnableDiscoveryClient // Consul Discovery Client 标识,并会自动化读取 Consul 相关配置,向服务注册中心发现服务并进行调用。 @SpringBootApplication public class Application { diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/java/com/didispace/DcController.java" b/2-Dalston/consul-consumer/src/main/java/com/didispace/DcController.java similarity index 68% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/java/com/didispace/DcController.java" rename to 2-Dalston/consul-consumer/src/main/java/com/didispace/DcController.java index d258e96f..b63780c6 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/java/com/didispace/DcController.java" +++ b/2-Dalston/consul-consumer/src/main/java/com/didispace/DcController.java @@ -1,5 +1,7 @@ package com.didispace; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; @@ -15,8 +17,14 @@ @RestController public class DcController { + private static final Logger LOGGER = LoggerFactory.getLogger(DcController.class); + + // LoadBalanced 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。 + // 即可以在获取的服务提供者实例列表中,通过 Ribbon 进行选择某实例,然后调用该服务实例。 @Autowired LoadBalancerClient loadBalancerClient; + + // HTTP 访问操作类 @Autowired RestTemplate restTemplate; @@ -24,7 +32,7 @@ public class DcController { public String dc() { ServiceInstance serviceInstance = loadBalancerClient.choose("consul-client"); String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/dc"; - System.out.println(url); + LOGGER.info("URL : "+url); return restTemplate.getForObject(url, String.class); } diff --git a/2-Dalston/consul-consumer/src/main/resources/application.properties b/2-Dalston/consul-consumer/src/main/resources/application.properties new file mode 100644 index 00000000..822da5a1 --- /dev/null +++ b/2-Dalston/consul-consumer/src/main/resources/application.properties @@ -0,0 +1,21 @@ +spring.application.name=consul-consumer +server.port=2101 + +logging.file=${spring.application.name}.log + +#基于consul服务治理的服务提供者 +spring.cloud.consul.host=localhost + +# 关闭 健康检查 +management.health.defaults.enabled = false + +#Spring Cloud Consul项目是针对Consul的服务治理实现。 + +# Consul是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。 +# 它包含了下面几个特性: +# 服务发现 +# 健康检查 +# Key/Value存储 +# 多数据中心 + +#由于Spring Cloud Consul项目的实现,我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上,并通过此实现微服务架构中的服务治理。 \ No newline at end of file diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/pom.xml" b/2-Dalston/eureka-client/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/pom.xml" rename to 2-Dalston/eureka-client/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/java/com/didispace/Application.java" b/2-Dalston/eureka-client/src/main/java/com/didispace/Application.java similarity index 71% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/java/com/didispace/Application.java" rename to 2-Dalston/eureka-client/src/main/java/com/didispace/Application.java index 13dba6a3..6aabe56a 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/java/com/didispace/Application.java" +++ b/2-Dalston/eureka-client/src/main/java/com/didispace/Application.java @@ -4,7 +4,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -@EnableDiscoveryClient +@EnableDiscoveryClient // Eureka Discovery Client 标识,并会自动化读取 Eureka 相关配置。还有向服务注册中心发现服务并进行调用。 @SpringBootApplication public class Application { diff --git a/2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java b/2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java new file mode 100644 index 00000000..87a2ada8 --- /dev/null +++ b/2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java @@ -0,0 +1,42 @@ +package com.didispace; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author 翟永超 + * @create 2017/4/15. + * @blog http://blog.didispace.com + */ +@RestController +public class DcController { + + @Autowired + DiscoveryClient discoveryClient; + // - DiscoveryClient 服务发现客户端,具有以下方法: + // - String description(); 获取描述 + // - ServiceInstance getLocalServiceInstance(); @Deprecated 方法被删除,推荐不要使用。获取本地服务实例 + // - List getInstances(String serviceId); 通过服务 ID,获取当前服务的服务实例 + // - List getServices(); 获取所有服务 ID 列表 + +/* @GetMapping("/dc") + public String dc() throws InterruptedException{ + // 服务请求超时异常 测试 + Thread.sleep(5000L); + + String services = "Services: " + discoveryClient.getServices(); + System.out.println(services); + return services; + }*/ + + @GetMapping("/dc") + public String dc(){ + String services = "Services: " + discoveryClient.getServices(); + System.out.println(services); + return services; + } + + +} diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/resources/application.properties" b/2-Dalston/eureka-client/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-client/src/main/resources/application.properties" rename to 2-Dalston/eureka-client/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/pom.xml" b/2-Dalston/eureka-consumer-feign-hystrix/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/pom.xml" rename to 2-Dalston/eureka-consumer-feign-hystrix/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/Application.java" b/2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/Application.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/Application.java" rename to 2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/Application.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClient.java" b/2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClient.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClient.java" rename to 2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClient.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClientFallback.java" b/2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClientFallback.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClientFallback.java" rename to 2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcClientFallback.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcController.java" b/2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcController.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcController.java" rename to 2-Dalston/eureka-consumer-feign-hystrix/src/main/java/com/didispace/DcController.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/resources/application.properties" b/2-Dalston/eureka-consumer-feign-hystrix/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign-hystrix/src/main/resources/application.properties" rename to 2-Dalston/eureka-consumer-feign-hystrix/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/pom.xml" b/2-Dalston/eureka-consumer-feign/pom.xml similarity index 79% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/pom.xml" rename to 2-Dalston/eureka-consumer-feign/pom.xml index f2822981..d144318e 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/pom.xml" +++ b/2-Dalston/eureka-consumer-feign/pom.xml @@ -28,6 +28,13 @@ org.springframework.cloud spring-cloud-starter-eureka + org.springframework.cloud spring-cloud-starter-feign diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/Application.java" b/2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/Application.java similarity index 85% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/Application.java" rename to 2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/Application.java index 96bba90d..2037dd81 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/Application.java" +++ b/2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/Application.java @@ -5,6 +5,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; +/*通过@EnableFeignClients注解开启扫描Spring Cloud Feign客户端的功能*/ @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication diff --git a/2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/DcClient.java b/2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/DcClient.java new file mode 100644 index 00000000..66b345f2 --- /dev/null +++ b/2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/DcClient.java @@ -0,0 +1,30 @@ +package com.didispace; + +import org.springframework.cloud.netflix.feign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * @author 翟永超 + * @create 2017/6/24. + * @blog http://blog.didispace.com + */ +/** +* 使用@FeignClient注解来指定这个接口所要调用的服务名称,接口中定义的各个函数使用Spring MVC的注解就可以来绑定服务提供方的REST接口 +*/ +@FeignClient("eureka-client") +public interface DcClient { + + @GetMapping("/dc") + String consumer(); + +} +/* +通过Spring Cloud Feign来实现服务调用的方式更加简单了,通过@FeignClient定义的接口来统一的生命我们需要依赖的微服务接口。 + +而在具体使用的时候就跟调用本地方法一点的进行调用即可。 + +由于Feign是基于Ribbon实现的,所以它自带了客户端负载均衡功能,也可以通过Ribbon的IRule进行策略扩展。 + +另外,Feign还整合的Hystrix来实现服务的容错保护,在Dalston版本中,Feign的Hystrix默认是关闭的。 + +*/ \ No newline at end of file diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/DcController.java" b/2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/DcController.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/DcController.java" rename to 2-Dalston/eureka-consumer-feign/src/main/java/com/didispace/DcController.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/resources/application.properties" b/2-Dalston/eureka-consumer-feign/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/resources/application.properties" rename to 2-Dalston/eureka-consumer-feign/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/pom.xml" b/2-Dalston/eureka-consumer-ribbon-hystrix/pom.xml similarity index 83% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/pom.xml" rename to 2-Dalston/eureka-consumer-ribbon-hystrix/pom.xml index 42287838..d71739f0 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/pom.xml" +++ b/2-Dalston/eureka-consumer-ribbon-hystrix/pom.xml @@ -40,6 +40,10 @@ org.springframework.boot spring-boot-starter-actuator + org.springframework.cloud spring-cloud-starter-hystrix diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java" b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java similarity index 52% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java" rename to 2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java index 690fa594..dd899e0f 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java" +++ b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java @@ -5,10 +5,11 @@ import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; +/**使用 @EnableCircuitBreaker 或 @EnableHystrix 注解开启Hystrix的使用*/ +/**Hystrix具备 服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控 等强大功能。*/ @EnableCircuitBreaker @EnableDiscoveryClient @SpringBootApplication @@ -25,3 +26,22 @@ public static void main(String[] args) { } } + +// 可以使用Spring Cloud应用中的 @SpringCloudApplication 注解来修饰应用主类,该注解的具体定义如下所示。 +// 我们可以看到该注解中包含了上我们所引用的三个注解,这也意味着一个Spring Cloud标准应用应包含服务发现以及断路器。 +/* +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@SpringBootApplication +@EnableDiscoveryClient +@EnableCircuitBreaker +public @interface SpringCloudApplication { +}*/ + + +/* +* +* +* */ \ No newline at end of file diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java" b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java similarity index 56% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java" rename to 2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java index 640d1f15..d7be3026 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java" +++ b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java @@ -1,9 +1,7 @@ package com.didispace; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; -import com.netflix.ribbon.proxy.annotation.Hystrix; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,7 +19,13 @@ public class DcController { ConsumerService consumerService; @GetMapping("/consumer") - public String dc() { + public String dc() throws InterruptedException{ + + for (int i = 0; i < 20; i++) { + Thread.sleep(400); + consumerService.consumer(); + } + return consumerService.consumer(); } @@ -31,15 +35,18 @@ class ConsumerService { @Autowired RestTemplate restTemplate; + // 在为具体执行逻辑的函数上增加 @HystrixCommand 注解来指定服务降级方法 @HystrixCommand(fallbackMethod = "fallback") public String consumer() { return restTemplate.getForObject("http://eureka-client/dc", String.class); } public String fallback() { - return "fallbck"; + return "fallbck:"+"服务请求超时异常测试,服务提供方输出延迟5秒。" + + "服务消费方触发了服务请求超时异常,服务消费者就通过HystrixCommand注解中指定的降级逻辑进行执行,因此该请求的结果返回了fallback。" + + "这样的机制,对自身服务起到了基础的保护,同时还为异常情况提供了自动的服务降级切换机制。"; } } -} +} \ No newline at end of file diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/resources/application.properties" b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon-hystrix/src/main/resources/application.properties" rename to 2-Dalston/eureka-consumer-ribbon-hystrix/src/main/resources/application.properties diff --git a/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/resources/spring-cloud-starter-dalston-5-1-4.png b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/resources/spring-cloud-starter-dalston-5-1-4.png new file mode 100644 index 0000000000000000000000000000000000000000..6abf3f63d9ffa732b24d99f490cdb48d4b49dc4c GIT binary patch literal 80317 zcmeFZXH-*N*EVXQ_YQ&(2u(pikX{W02zUbmiqfkPq=VE@lp+D7gepigf+Es;M^Kt{ zlpcC-L0Tvw=m<@ zZ>%YDt=+Y~>CsNEnd#o%$rh#~DYurXPM1i=z#YX+2fvkgA40?vPDFN?>0P=Rigb)( zd7f(;h^`-lY?hRmJT{LVpBb#oKC%=Dr&A^438w>!B;=A4J_#4#3~mtPpPQ<1Nl@s2 zMmUBN>0FK^{AGlQJmc@zRP)FgB>&zFhcNO%|9*`OApjZr&x3XT{|EoyECq1K@%i(L zN{2xc+oc=$M#AzATOcmC1On5|QGPbvD{a!#Am!7v3f) z=f|*mEN+9wJ_t1!ZP<3uBQd@6Aqi&gwCEIbCF* zrwGza%}y!Rtev>dVL0cUB6Ybc7#(ycHoQLBmO|prlDt!E?OOUXq}zmO(eX+d*D?mu zvs~Os{Js~tmO8;gb3Vn_uMJdy%4WP*wb3~>34MDKdlyWq@PF=KYK_Rl9g@%QbN!$9 zSDd{qR>a@;C*qGv&lRI zD5gtk__oBYmI8H)G-sl`z(QjOnV|^xD`pby)Njlwj~{PkxAxSBdv#QWc26#xeUlDa zy94v`e*)v)qHgrJCvEf|c;GXQO54HImrlg^=RA$~zV7VbL7@=y5Ii1-+5Na-ZaFkM*o>ljdIQ25&tmGaLe_|)UPh{DVe64Ix1HJK#aA&#TI%Mpc9xMvrNKH=O*!9iytsK+q6aFXQ0$d zvGLT$cWM!)oztemEj4&4oH4+BI?%3?(@~ZI=G~iTF_f8^rC@7RIci?TW&a@i#m57M z%8d|h4v>>>5p)=f92D_5j>2ZSv`3x?H>eX0RJ(d$;ezQ{sh{ZoEija`{|7K^JZ9=g zYEC=@z{Sb&C8tZJt(eulPTFfefD2AW>fYXwQzw4 z1#n`Ojv@c#kY!Y2e=7-SkBKwzD*$}om_rc@$#BY=QO@?cKJnXauG73}*RcGmOYwBuqgp`r zR_YRlRT-_Z@{BjM>%(MEKALa5G$b2(jcqUF)tF)rH31+F@6s9R zwP)Ctf_Rq#6Tmd`nSl@#Jh&;`?-M80>+3dQCTN!@qkE>({}C^zMASb6?jLY@L2YcS zJRwp`bbPHgcZU=n0+ zvM?H2B>j%wJ?Qdyr0{BM9y8-%#vO7YB^(AN4x2ZTS>M^rw*8IjSK^X5+K9pHYSLuN zT6y`3m8BghSL4}zB60p>lw-vw^5pEp_k?6vLY_(EgDd5HNjg9YRgyvs3>u|@!d}M_ zjew60Io3>H;u-Tluaw8m1o;P>x;>po8T@Lb@P)(4EsuhxS61;Lz&c z?`>sz`>1?tD|QMVc*7AG;NcnK>(Lr{-8!e_=p{_lm5!>PA_I1%hl9RVG@0Xfwo2Ue z$4U#{*zA3i#BYyhAsoMoJ z-!9|QH>OpyG=Z5&6-kl@IZ1r+V66{KoZNqs`DVr`bxZVoKOQo+~cLS^dsRL_V}(UhwWC4*(F{mc%)z(VkdIL00_OK-G6P8iRAXhi1To3 z-|E~N_|&U%boX6vscS;kKQgCqVJi0O)&9%uSoI~6HQC5Dc z_tHymL=%z@54EJ9{QE8;RDj1ZRPNtYsgwZZ!P56cU5tj#&vPeUO8rm=vT?k$WFU{K zIsmdx`xL^g>4Rc80zX}6BC(z|-g|F@{a8?&}SR?l}cT{*ic|k z0t3iae=|TZ+?2FI=E7JIil#QlASY|A?KwgyzTe3rXf_nw5O{d|;=+B`-|N`)d?}4t zvg>n-D<0vW5(R|rZ2VCYjXz4lBR|G3h|#1{$&ICQ4+6gg6>tpZ=()V$opg15hwNUT zpna1C@Apw@^p=Kwm&#sc<78mcf&(CoxNgsOI8k=#n>7<)n{DxD(gu=I9x<(~rU5#+ zFA9chYiZO|l2aG*SaobEz3*fQb@R*xAc?Db%~QE5y>WFa>YiXAg`GqmcqpNAGq6(C z7qK?$l8VioY$y$jD6FLxf44hZ@Pa{7P&Rnh7(6sE2=Y3%79tkO2GdtzJVPjWzzw{F zoB~x>N6+sBK}Z|zkbHX&i`|+hc^_mGA`34-ASdJ!ud%fF3zW>rwv z@mW{Y*Bb7AA`xlLJr-XveI_DM1ZZ$2V)FwYmkJ z9W6(iNH(a?Hk%?>Dy<;@8ylWyu1u&&>W7VWSKU)Nk`0`f6^y4`%*se3ue^D{rUD@tH>7AQZ-u3k9 zYKoI?a7LzZiB>1Y3O09Fzm_JSnk1?G8QJgihKeQsWAa5F{+aZS-m5qL4Kq=bmSNsQ z0vCWbFU6We$I2|*zD*2K{%NUrUT1)o=dQ1VubAKGA0D-u!gJ1IP_#v?wpms55`P^I zi{#l0Wl4O0{E1H0j)H(IzQ;y!fPK8Lv1r^_{OogmfyR|i`vp*Yn5?o9HJ{Yx=#~HN z+Y$0<-+1qh?*_mR^lwa~g8A6$_s`;7@wKw#+nZA&eNHi2i??e5B&`dJUq7Md-&R%9 zlvs|#=*(aZV?xi5r{lNIrt#88J-N5wPQC*>>oK7Z`}dxHE6@AM{-H{1=;_;rz3|ER z%=Y=s{nE0gw=aOuh@6b#0GWjH4c&>44KZ>%tGRHpY0eiis@Ffqjh}3GqSK0gUwElR zS)9VeeDG#99msDzd9wCw&oE=^i$~d3>0)#Y`dc-zEj6f}1K?EK|A;*DibAG4 z=zGy8juU~K-y7(6w?)yXb=RnQM$vn^Ck1s4)mF zjG3ws+wPT8+G#{u265CsYg*avt-ijTA^_5k4(AK~)xp@<=Og`uie$B_GcCy5SkeZSqp+)hp%d$L$ zRFf|OYu)QVSTryE+fk&8;gN=EgG`rzbIz2FX@&1+)`rcq<;2;Nj9di9Z?(>NN4hfl zPGwMK*z@?V-fMD=G@~35bgHO{zmHIQqH_sr;gV{X_y)N12cOmH{{grV*dO%kdYPIN zVlCGtLWXl(TB|BN*>m;HWE7)4%tvN&3MtUr>sW!x*DS+W`N#o%0+6sdXy5 z<&th3Nn@|R7qeND%24^vbzg?%6= z*{0f>He}F>3aeFI6a!7Y%G{aT8gS803Oe&oQo7jn!c5#-+ipI7=X}^LFx`;f6UPT#)VrFqzs$-Vv*pEHQL^OodGscsam zR-%nG8e8&nd;S>60@>YgjU}2cf9oC5Xl&Hr0`u|6(eoXwKAZKxtuLO5VIn)K^$7OmeEJk-CahPLe{tNDe}p9<-!UK|R^?^hl(`aU1>TNl z8+EmUJM;ZKpMbYL4qZcDmyh!@bdWiDgUhPB7zQ*hOz7K4*Ro=b``?=cr zG5FycX1dalw42Jr8%(cx zd^Y;TxLldHO{V^;zr4u#^e;OfOwsAB$#!C$u~y5ZpaYkrqwPsM6+FsL<$TDl^y>JF)EGwS9|3jmrnqu~sTO*`_xvObLdgeW~@gBi+(rowRRJxv$;!k{q+&=IVGa zGAN@-%@*eSlrA8$Ru6_u*a2~VUtJiP6>9f%(B%h~Zw`Dzg9M&0c(j9N9?8gJ!a63D z{git-zl1RsQjp|wzDrY#Z`3uM!5F_0`W95zrBR2AgPR#*CNDFmjF--c28jI9@tn+L zt?mE`jdO*|Go2dPlcfH)V|FUIUv^ouat=Q~k?2eE5mHSa=-NQ`!N_CrFTcjTjptXK zx5RpPPExh!eBwnbs4YdSm^lTeX34jp#1@h2?YA!r>$d1I(OFD=)m`YkwEZ4c{SgWer+FpZN?solLt_N>t1}$l$nA zq2p(=kUK!TXf`KggXNaM+`q#tK5SK^Zi6L@_u%q9A3%F#H|BLve=X%dIzpog`vl@> z`KWHZQ>yF{%G7(zDPfud0FQ9_9cCVFj@l{INE!E+PsE6+2@w_VEjxZu@k9BX8(E!- z>D0tpiq$k5j!pOAx{6wmoirjduJ2mRZ79*~Hm1Qp4n{fytG39G&w0zClE;6-le;3W$5~?*%F(w`cG<&4L8}7%&Fm{UL~$rQ8TBwaiR!N@G1XW zUk!O)1E1xxN%HZo9n*J3ZaD&trx>rXm7fBpm4!Vtk2@^_FEzD$EUNgiMSBH+-SJ&W zUv=R#1zh00Y~CXeuVb@!dyUF9=p#1_8nj7D!=V&bMA?$gqB~|LQkiA%$A_V&4-X-MQ#W^kld1Xh)e#E!7FStO<(=#~> zUALMXg21Ti-);cwmcBjY?`Peozw~MkXwW8i^=KWbRlIlt$9ALDaf^H7mHDd{TgSV> zgC1B~>=y5va(E7%Y90e2i~;k1$JV5MocMZIUf1U320u{xYkfh7dY&q%5t>kWH`sTpv+<8ThJ2`i#0p`9m9a~;z7!E*hZM4k}K&b9F0EXOD6Ve;dp z1Wcrf@*0j5yRlxOcl`A5y&Xx@!cl>bSl-vGSU3%Z7SG}B43E!7%8BzOZAV1(!qX@_ z%aEUTwKKj00mrTtM^0h4jLowqTa;E~!s$R;XOELs>_~^J?I01kS%vb}U1N_=es!Mu z(o~2j9c*`JH2XAsoMqR`tY|Qgbb+;|Nbh3i0x9@XIHO9;#o!D%t)EajlRPY1F^RW? zSoHjM4;O-?$>@)FpRMpUSHCMg$b6h+f{V>HElIOVyJxxVL zJIKg+B*e&>tCvisj&kii(~)@Nk>fZZuFEQ+N__nMTwE}~d}eppYcI6(<-M`Alg=6u zn)|%hHNp|l`)dpE zlSa9GLm#{OeD(I*&l7;Hp57mVgzzn<5<;2e2;1#^y_L@T5WxCc4yW+vvU}CkJ~im7 zER=7b54E{%44Tv4NhQ+>`_Z|q!P6mYJZz%*#w;LE-~9p?H_tDa?ytXau^1kTm7bJ? zGNUWo9CkLIf~b)-oG6FokH5VbcrSXR?TAG(KTM)-R>iF5cADq>rc7cO@0#3}0U}v( zSo#ajIl!^(fufstj@-pe{gF{^$g$f?6%pTsZ(=dX;TLBIFSdKR{`JG(N86}}*oMHJ zj>U|Uq+z#7ApIKIsO!9_uUi5#Zv(zdt)~6stpI<+EVh`q$Q|e5`cQg+`g=mDsB7-l z2M5)*m_g%LTJ4xn46+gyIi)MMPm4Z2->XE zgU4pvE}!F#k7qoOBb80p3eok>gVAN1u+c4Z^El{41xf(6*6d|51aZi_Pqq=e7mD#n z6W~yge;awZzEuq~kvsEEA}yI0s1T~EouDUYiD%%!MPllxX}K3EmaIDg^cp@!4KN^k zy|wETSyGpq41fo|Z=@}`zs>AgOP-vkU8m=10HR97mOL#eQvLTp$mF(Z@ra?})Y}wbqxF%o(q91v(r9w6Jj?4Ql}T zubzGn2kNUin{a@(Hc9TEbE@PPdaFtd^dQ8Jl@>$!nCs_o=d6PF`hv)bDH&Kuqx2s< zx3$Bsd6YUN_$c=eQ~!c|K0Fv(gwtq$U|yE@^~OaX@m?s3-hkNGzd}x5oM)zXOUbPa z)PGU<^t(Fw34op>2z$}!v?5(!Qid_cAO&CtJNJjqj$HN+1{lcM^=lTsg-Q)4@-T;X zPB}2&lQwP>HoOMfS|f6KU;{Ee>U=Rh7Lq^etjq>GI(k*$#-HRqVGk7>Njduo*4v9k2yq)I?F?2(I2B(tB}49(`bElqs9+H zm`x|z9M%!$#(Jz*O(Sa*+MyLX#k1h^ zwI>#7;HtOyp4`lN`~y8N2qzE>NRoE+cXTCsnarpjJI>|lO9;Z+to=Oqo&AeEnCrvVHYnv zu6LTEtcG(+r)j5$LPp9O?1`^;5$-7P1;6}Z_3l(OPgh@EG{7QQ`JYF3XKcah4H6KY zB)5Iz>&13KNkNBN+|VL#qlWUHw7GcJDz_GwilS4UmI_;mygW#E+mesnsD*H#Lu&si z_KNUUbzfX@Y1zFlF%bq;=C0`Ue52Ym==SIa<*^w3BfydOe#e@q@OdAPJ370mBS`d? z)b6g#@x(7tgo`Th*txRKwrs#!_PCHAWGnLZ?r7pQ-Yhc!GV-5WP=s8@p2$U|()0{= z=|qMb;|rfFot7R}hVBul?mNBav?cm4HYi#%HSgH4sPbK0^)*w5Sx1)>vKMwjU|lTy zTDt}=O89UvvS^jiasSpPG?;stB!z#NG>NVXtpDLbUf1wXP8Ih01~QT|SIf#QIwgh; zhnTRAr+GX9escg{E~eXibvb*}eLmPNhV<6df>H~CUC;3z&NW3>Zpcy7dWQSg+LN1M zTbVRBy+qZtmuOWaCzWVPLyf9F_NW9ehEJmR1vupMdeDJ)3l0lx3&UqsL2m>~-gY}$k;X)@`ZDQn|{yB{v6r@QUNCq z&KO%`r*F?SM2-_NQ1eBF9=-r}S#ypUG+ zf#8e!o_)`ZqQW2NCeUQmr$c4R$00}Fbmq1@Rev(N&yK$jhO|Sv%QH1Kr$4$r2>QXh z*l9DWIlglo-+vMW5I%j5;52WY)8+KB_g8Ws_pE_gDts?|HM@y^rHszL6F-~a$^mTF zJ0J$12hF2D=%Ourl%Mn3BqDwXdtu@DMIPl2@c=guF^%3c*wuej3j+^@_vPWcdS8h8 zy$inw`8YHl?2b*EhfR2^7BFP3@z>GXla2%M9xt+fcupHy!GAsEdT^4D2n!K|a|;CM zlJOWs5Kb@1Un*sp;q4zbsOzyIm+^0-zUmAIBo&z zLKK^SCmX#UEU#s{p)AHMo_@HtQKI&UWa&0^1?&fdsduPY%IvX!lu!XS z@W5mx(M360gWY!HSWY?G$9>PJRg^un1`}5AV>N59U~cHPrYqBFk;V1fVlL%Y#wz#O z57j;Rw1}=nXU7aJ>x`RtxpvK7I@Ow|#<<CPz76hx$MIM*k$s+Etx`(?mD8;jB4{Sr4Q@lh z9T4-p0N(uLsDj~5;pf}GhUFDtn{V_YnJyV#(o5;-9QA~VFDYz@!~YAZT%~zQLN99k zsn7!MXnoGrcTF7g>)bxPU1>-STJq(xW#Am7Bs^yP>K_)mN-#fk?4g^Hv2~4e)MR&? z{Y@a4$hv1NM)#dz#wr70% zDJX4e`M6c)wud$QX#jCbbg$Md{Mw2>3SeFmLiE*t=c`Q=JFM*ZM%b(W3?qTv=B*r5 zk>*eULRA87F{7XCEdy;*mF9}ZVy6Z(Q*qsN@`02^WVhRPHGYSw*GqJu? z+5>Yd6kCTk+SSfJH!@*A*9l?Z{8T@dDcLqwJdnQY>o&O7);>bVEZJ0_`*pjd@ft|M zlh5zw)5V1}%g_U-7jc}-RapxCv;JMqy{T5yJZgO{=MobHZ$9#u(618Y4}G0EdQ*x+ zW@I}y&K}T!zfL<0IqXj{sBZX#c~hlh?b zboZ#>H+0=Jf6JSwM@%}En)?L-e92opT&LKzE zrxH^WV7;yAY{)IBpzhn|<7{L61#5PEXju>@eG;?7N)(Ip-dsj0D7brDXyVuUqM8X{ z?Qf+X{8C;Gu=8LEckJFmWM)dBwX|X%Niv7=ceL~FDYwb<+Bq(847ZS=HIa}Iv~Q+iC6yc5 zAuY+pyVd1DInv0eRXZ*mhIVf>nbh zlA03uLY2&;`9Jy%gj#zf=(;jpgy4O-ZNWVW_Y7`Cl~A9IZV!f#6S-i1&6jTx9pu5Y z`!gL=(|q6eXK{doTX2}gu5UFXSvIn6U-&`1LBGG0hC-f7_S4qGw#&IiB(sh*B0{T7M4;{URed7dz2}0 zf54x{Pwua@&HbNJKC;g{=@J%uiz~(7D_DGLa5GOC2vrT0~xBbYKIb4`xxh^v!4Et)eNwfmkSu ze(}S?MbmS$hFf49-Q#F@)7f+G_r9|?Zbq(k#?vmN`(^rdv#Bh+=3h=G>1DW}*v>@= zE`{=6mqM@uXPtM@v4tCz_$|CNc15tVpT8}`fxu)CkU2OYBc&w1`D9AfBWAXlk@f3+ zT>=X_la-^J&H&*auDhFp=t3?s@auadBycI2JfTih<&0q^9WGXa+0b^*qcYy%Ss1c4 z&%F!2P?m5qXc1BCFR>?(L{Y7-k`U5vGj~z=4Q_iflapG4riuNlX&gF3CfCyIcU$ha zh-y9vWr^k`aglNKjuXggZYGL7*y+n4FF4qbf(X@DUG9Z)->iATyhFJDA_}` zHqHwR=Xckoa^t%>oQfkVdTj4!to4dHU8K`3o?RA5kRdRH_~7Fz^=`p=-d{$DmYDkL z13oCHrQ{a=0k`}3+q>k^1C%p!V5dfrGmwBxzkg2K}7UusfZ;wBtQR-WkQ0V^11N+uQy; z4_;neOKDpn5(!jBJgxqPd_d_Q+$YFOoqRye>k1L1e9ZfqC$l$8$9+btB>AU5iB@%j z)-oADYJ3IYZnN?e8_uZvV7gQVG@0EUi?8r9p2x>?ZZ#@xEBRAELTqkF(6Fs|(toit zxfSz1m*0d^gn$p6!MIx&^c3uCoo61~4wiN|8j;BPb0nhqZZ$&LOjP0)!9FPdYabfP zZzMGgH~{_=+cA2fNS-?y{mN-#QrOL(R>AE1ugf?U7+`xx5uvQREgX-usCW(Emw9h2 zqADX?fp_k-px&z`oWb+JlwQB@3HK7*k~9{#d)+viwT^(i=*puh7)R+X1I6J}>VQw> zHSCW$mWc0U#&quXt50M+@Br5#Z>JmveS4itn`ft+!v*HL9X|49yd$({mq{How3tIU zNZq;wD1Ws}AxP+Haz_2L(#GL4m>Y2ldu<9yY*$o?(s{xp97ITrT0}96Ti5xQG-D~i zya+hG($<^`{0)y0#8k02mH76{b1J-j$eow{TiK@X;GK8g1hc`oGA))ggA$BRi7oBHsc9ZFg zgcA?vVhIO)Rj%e`uUV(>sl*<&!nJwK;hK^{oqEg8BYF25{ASL&pI_UKxy2EqsF%rh z9#p@`-4~&DD9b|s8H^TtQXry9M;L4GAEgwolgD3-R`N;0gI1ssl9zb@8p%?CHgyic}BvzGRV*|h7X#giP3@l zi5-cFxzW#%LP_9@01OrK`TvefLYI{eVD^7~;vaKF-TK!mkB$V3%dFB@?qoPcei5>b zry%5^JG6g|Vr_e}(r4K{g|o1z%K*-Sac3KSJB_|uY??Z>l2-|HL@NE2$0K|rRv%=T@qthpf_eEzyEW*GXW8b2goJENFXc@CtMeM-t|(bC z+u>7(gZ)K$W21k%6|r{ zArCvt{tu~a2~wFp|1(QO&)>Nd_2kLC{yR$v=0Dr?hM!5|e=p*naaA&Zc1eQe&k)S( zKf-rj(%WRivwzp?>7Nl(9DgN^`7;9cw_wKhk5NF~{=V|gpAkFMf8VBlIRRwzWmf|k zqWu5*Wh0M=GBPrX%FBo2xRjnx*SJ&`o7PSZWGUe0)&{Z;20tYdS}LZZ7zLfjOU#Xo zjO-PBw#y0&h2}`J6}&f-cjj8>YMdu+rfc15qoXODpirox%7mM_dDhNsGxj`~mQ&u& zVIWhk)iT&~JB*a}ESQ;vW$Nr`%VjWI$!B{)93NO%db!r}f2aGPfr5SCbAMS&SX8ve zGWfJ3_~O)oLlT;R#~yC{v=}iU4mGs2+$DBA`MrSosi!je^6K?FGBV?oOt^xQlA0U$ z>?ded&aHy5nCi(&2biPkd3i}P1FukE6uJ9DLJ zmcf&=A^0E;8P`mgiLy48oF7h?%KjJjz2P?}rrx{%C{@hTH7EG&bI{?i=2)?*jA@N? zdi<@3Ye^JzH^I(7Kk8V7(&d&C3RYJ8(wDIJ?Wk{Xh}(oW9}Fm9I#?|y-iq5g@6I-} zsyCWkF9n^$qmR%t)AGLP?RYt_)qemtY+EyzUR@`>qoOiLdD9bViTilvl z)s7P*h;!pV8=aaRs*#*f6L9n#U<|`dI_$iUUpsert|Iv`DL#C=9 zKeVTt{41$B<$uivY>B}3I#_qU(W)FerZ&AE7pf*$A;Vu6RBo4;8+1J58*IVW{ykG1 z9DB=9mR8sz`Q%-fKNrFV#@?!FnIr^S5?t(V`9}8CD`?rFDL3e7^ohk+8i2AhVfm^Y ze||h&nt|;$x9Hh+#Z~X`d$zW^tLXdPQJh;ZUm8qf!Q2ZJZD>8gg_klD`dt1Rzikf_ zh=6!}oAdN@ZTFXZTC5;B%0bS{-H00KFi=d?84yjP5)V*80|t9~_B_ML_Sl!BAvYi2 z@TcA%HX_I~otm0D)gD2KJHVYCRa%DNMqA^Q4L&25!b`RIpw7LS_bx%lG-mTl>6vXD zKxOuUsg910s_~+D_J@&`ME(bX3-lCUhDa%*i_Gdro@D36S9x!ZO@_a9(*L5;&5xSE^WqS1nu_-T4c-nY(w>w zj*|6o1Ps619L~dRT}3)c_AEjup?iQ)PjO+*lSdJUJw7f4&BG;m_@4lwHzSug*_uieIc};a=5r45| ziQkL~CFFbR9{^DX3UbQ(-}ew|--`@C>0%~q<0o73I5)A{RvhNt%F4>=!HU`2uFi5u z4jAY!vPPj8&*zzKW?8}<+OP5<1nXqs3Z%-Q{5W8Uy$ z4^d6f)2V1?;lM`}d)73p2lWXF*-Ef8I7cX$f(O}QyPbwB6QR!&rk6AjaV*k%{j}VY zC>G9|zZYdd--ZOh8K=ucaD45o6zuI$iX(K5q+EVqU0Y7=E!mcvk7o}SJJ=nqlZ7d; zKz3R0&0jHbYIyoi>u;}550GEU5Q^GZFLP2_F6TiNd{fZH=~|6_KYJ^hgWJhWA@0FS zH^Eh%1q%_J;h!cSLcwq9KLj~&@YR3b-fhF|Ot0lfC#!_R55J1Fo{#jhItIh3h^76| z`DqsW*T8(SUGz6FlV6^Q!Or)(n(KJ%^YG?Txje>)5syG;@NMpxJh~B9cFG5gZHscq zmwC|F25c1U20jGko#ymKEv#ko*vBiM72pV4vd38xAA6l$(4!3%DI{umH>cS-w{wVeSL(OZhQR*oy|bbuYU-AN<@F7#pM+E zLUX_`6PWVI-{0p`#%|vOsPjILNd7HrpgO8X6bUuZ(u$e`Ff&Ba?KKGI1dcqox!;*# zLr^OSU@`pnOfYt*C4t;CoXnF(ayh=MK-GUO%lFK71OUFrBxyj8zc_A%$*BpY$G=v5 z{W1Kf$W|DM6Fy%G_FUW2{y8flxSk$6a_fA};bR_diTa z+}?P&G^7RT_WRLT25*Gu794yqx5bKGvot|3*FuDGBGk=9h1 zbyynL2#ddxR|7@%2eBbkTIvjP($l=LdHP0Ao?xNeQL6rPo zCz{R&1%Jw5l>AQqioy_ppc^5_|Bh6dD6XB|cu~2 zVGlj2Wqo_n>3~W9v0JU7_K3nIVruK>x{_N=NOT6bXAw^0Isf>T8rPXkbw-fw04L(^2*YR5 z^!31RP&TjA1mh7lmgaE zGcKSq^Je8-@V(>oyT=yqV1r?6r7Y-FkK+%MsUoXr9k1hpN#6Lk%&c9~a1fp==ocYG zWA5KePJ5?x@TPvyd;1kxCf?L7T_=MHb{{VNZ^~Sy3F7q@OBRTBD|>p+tA&n#nberK zBVmzeI|t6}RZ8eCn-FABOOCn52`+iN#3HJ#qt<@wv0lhip_lcZhX^vGM?=za0m_C?v}c#7nBLenB81%P|y*hwMr`?E`czn?6PkJ1mErb zK@omOTY_M3N9)#@AHsohbg;Yaow4@uN-U5}I+s5w>EG>l=Fx*NRz$o&T!Tv@p2Pjb zb7CbhkF@iUJQZF93hX71>LY#dKms4oj*MIX4!dJG6YYXOUu^57SgDiN&`U`Tq=)t9 z0`7Qj_a`kvks|)LBI0h`xB3JDtv1>`O8RHY9N6XRZqD&=+kJM5kReh7f%;Cf_;)Bs z=BcY0fG>VMy-=oxssh}2^ZjqaSqe_e3FT(UygrIy%X6Wx z3ZbF4wpC^;T?ky4DYb4*W0VBiK^Q*6o3fwBgB$2TXOULr0E@7Ph*XHsv-49Rd?8b! zX5}PLai4LR_Xh+)PZSGfcZ`2jL&fWl^iQbtdk_6ACCCA8LYZ!t`2Rj$$-9;P@Ja|C z%l&MmKA5AM8o)1Yk^!kYN{{2?*o^f82zzCg-p?Bwu%oO%O5|5kXs|5E}mz(_y< z(CwIZUP2nA-=4h`c`dAf$3KsqAs=Yd5h%{yW#9VcNht>Lr7Q#@U=#Vs;~$_ExH6#~ z`YYO&ju~7+I3_B(BS)7lhP8&(@YuZW=7IKU@rp2{b13)}6-)+wVTySB2t33vYy$GCO^FY$ukBaMxh#e%PqU=qi=O)szR04|bw}SaLC6<& zD*1qmmbgEN38lm&8B98m?iH_bZG-h-@?^vH8Fu{x<#c2?HYGRePhC9$f#rS4#5SRP;-qh0C`_Y_m^4MfEZ^U+UGE-?e@AG-dCss~~EB2TtnMQIAL3My$n@(UUKU104?KxCSDb9wL*AI3kG*loAhE(*z&W zSNWL;L-!;Fp?Uwz`a2{{u?-T4UZQ~+nhWoymU^#Scc_3?eK%q#*b^%J@i=>R^|mW})7A@sxPRgkaqbS3oS)QdjPcB7<` z-r!}h4P6|#;#bCNzeh$S3}DIVic>;sR0@#2^&a~(j)uQ%()Y)6ZG1-VzJ1Fwi9GwKZfxRvm3wzrX; zfwi9vKTX{mR9s>`u*XS8mvcMxmBtLbV(kB!>Br5?)B-uYDI#<~0Wx$;LGO0p+K)A@ z{M_MVKUL7u#QgwZheCrlB{1+&df+-wrOvz1HMK=-gfrq=4-oaW+yd5Lgal5crrvrE zS-`yq5(rWg`?KjEj97)H-QmCA5Cza)BqEI}OD1DDdJsCUlU?q)JdyQAI zuNP@zlk5lLZA?Bj--}Q*;l0yOZepB1=~8Q+Pbah8}oXjZbJ1`P73eeP7-dCv~&( z2V+Xj@rlK>VP#h>q07^Fv`2{0yXxRDkQLPol!I8BR@g=9;9GxhgcwNA`T)mC;OK77>e@HnCy5p!I?;mBTZAY<5DbO{A&DNn zGXx{eI>A-@YT+%@M zFE}w_p#yd?-3c)erLhh_cJ(?C8mh%3-mmfzvCpKO$aZ1I9aX|{R3m-E185=YK0XP%xIWD z+$9lS_Qcls`jpAx@ut7J&A=Kn=PR+uB%0+lcNu1@F;a{9u1=!OVB#n9cp7Y!pIII% z*1gt1!)6fhS5Z`BbM-)6h7K-@FE$V2rWU?lCCJFFczSta`=?wqRJ`1W3bChS!%)Z` zIsc5VX?3mx<`A`t_X|LA1Y8nG_|NX*Sr;?X47E%~i2S-S_y}Fif6s2e-jXP~wI?-IM1eMbBm1nCgD5TK) z^?5JE2(vn?ze-DxH`OeNcwL@m!b^jVV%@qzSyb_`&#FlEIWnT4ewQf6_TWe+(hz^_ z;?>1svyv68OXQ{iZ%jdzzBXCdQ~1puLsY~2w_9%=mUjNp|sBU#uZbnQSZ?G4>uw&~2N91AkOe z%hy4d>@f#U+sM@z{w!^wChDFclQ%3eEO=YTEo5y}k?|(pqubLa0R@CT#Mx@TB2q(r z#0tcb^;g)Mr#ttQ_Tw&svR#yyamR$_@psHNIkWXZUK5NqmS?$gZ+@|~gh;*x@9GrS zkF@l+=F#V~TefXU%JuykB^TGZQfh;E-cf1UPNWcCBHR9SV2*o>mu}XfGNPc`KwCkp z$@9p_V8K3BViVO!n&CtHihp&ASz@ORtpE<+y=VNEg?&A=lSDl$A#X;dAdHwHKM~v< z19AFh*{t|<lo%yy_#VH&I! zQLAIUNbFC8s}q1TBU`8KpwlIa5a-efFedJjvD;s-ctf!3m;mL|M z;O_^j^q@fMF%&6p9Cq--M+GIJk!|_+<*!a;=HxC? zq{M!ih_E{=pCe2}w7KVg^d!zbQI zFq++6cjly80?9=jK8sSNCiC<@nq*z>4sTgX73JdFV^ZiuBD6uD69a;ZiKZW#+`X~d z=oxA78}VHB&nFa}3EmP(2@PB_JeFM8a+zW}oR8vFZtZ~WW8=3X-`K3pBK&q_-VfFS zwTMF1zwv|;dhjSPKI8AvohMzivK=MXKY5+-jDuC-=*;xaCuT?)oF%^n=(! zDQOsZqdsR+s4A3wNPQ=xeJ@}3M+Zxm!?%B+@22nEW*?gY(B$w=kteU7x|N#v&l@lq{!U2|Q4Z20(xlF`yI<;gCV zge%jlbgVOOB}Q%*O|pReZTKBMl&ujT%j)jG-jQY95SOWM&7XEp;5-o}!cA8v1Ozhs z9T(3@16L|X-HD3MWYZo{S(*7EoE5A3l`BhmG%CS9 zCM2dn^$f(D9)AN&K%t#wX+)S6OvD*IN;k%rKLe4cPPeHbTaJBRZ~ZkkZ{RXfBQNp6 z8wNBWX0reF)m&bisaLJ!M&UfIv!|nxHs56}uI`^41kiSMVJA9WCt@SmC))(C{cra@DaPt>`{Hej~;aW_Au5MtsPSHa~5e^6o zf{5^-3KF*J4q?a-?jb%J;vK#k*ObTOiv&WDp_KWb8q*~m9W^;2Sq_6VlSJ7T19I#^ zv69yDIoU~sS`Rw-@WSqFw6fVE?6kSagd3R-Z|EbqBoDS9Cp7pryQtURe?qHFGLPHE zMc=6)JvbD3{E>j@E8;m3#a{!`Wis<2(ZSG^Zb^-=!`Z2%&45gU#UV5H7eWR4VwCl| zB&DNP4UQ*bh|r$am9nF^OW3gF#w}|2OG)Otj8*2hP*tjw6lZFM!QJFP%3g@Zq`c@L zzYo%V<-*|um()cZ!Yd#_;Bf1Qa(DFEj^IQFjhPfdir;zWK5v&fXT9!EB>e3UG?>fn zvo_%EUy5%2UGAa~3xKck=Xn@NL~|#_*}oaCteX7~k-2IhthwSoL&aGy zw|qFemN+PIFikP|MeAv3x-AfAhzE(x(umk<+k+cB;8tCIzger?l9 zEoXzVewAYjxh~La0WNUiO?YLTjmFuj)ylIj^s`Fi3PY7S`9JG2Tec87AC9(;l_oF3 zAaIgba309KC`7!kNfW}jb``el;>h<*#DAR$obnSY4>`HZmOe$q@RA6XppdzQ32=15 z?b9B3bV_``@7n)eVdRgu6PbSrn@Tjn#kU7!xRoPIa;lzn?6Nb`F48-ML!L^P@$c^+ z@9#(BCCHMHZP4e#-T%7P{34qrNnxZ8T%CMPmp|4$`r#ahpq2UGGo#1 zdxgr)?57>;^EB}@i{~kfH==-;$HDIV>}oWiR&;7S#tONvuYo^LK;9b*j@rvBYJ?s> zbVZ1O*k1!-T^6`#8!h6D?FoWwpDHXni!ECjk3bkix<6$YAU3j$FZkTW5?VEdcnq@b zVb20<-6j422sVv$x?h(+NIoVEk0Do8{D=3c0td{O&8FzLvL)Oh=tqS(gU{+mcQ_0FN%}*^QS@RGS-tte>9u-*L8a zq5;`g{en`-e8*Eag8tPXw23LogDXjmhh&E@=Z3|y5wh^g>GfvoadFK`!AZlS=JJII zBL~~K%rqG*4~G2Ydje|eychHm4e)ijoAfDurBsh3zFIO@{q`eDUn!qU9PrR^$*L6M z8C<*x3;-(o^-%1~e~u^aAuedJF0Z%Rmyz5dWZuz<6IyG~}M!_`TcQUju?O z%LLhn%79Rh;vO8xTyHa>fP$G3Z?Uaoy{ z9=JTTj~8^vp_zwhlF5O=e(pov(XDmy+YASD3|j+t>sl|ZB|?RMV^+IWNs3RTE5$PK zMZ~*R$BJ4WyEKULfZ99=)5t|@M`ut8<7)<-w%|OTL;3i8-BMNsB|i2FF*j>+W_Foj z%s3ssJUGwwwA*ZIsoD|N7uI9w=2rDV zaG32qge*UZh=GkLOJ~mt%WJG~7@l)8)D_O%<$%699dhaRg!p@mM7PUhIjqb(+lQW^ z8~5ZNovqKB5mHmKamGSX(Ri5fpT%nlOAVjE9F%$M+Duff=meg9TIiluEud>8>GT%U zt3&aIFgp!G3v`RT=SQVw8oF{Dk;>H9O{SsW+a|hNt|_*L zo3pZngUpF}%=uB^i8hbfFttJPN~nduQsKtDMZ!^8+$Xc0On|%dhSJCBOD4sneAYb- zn_eIrIcs1*uPlNkI2J5<@#0g`N~h-gJ1hX@Dmss{)Q01$?Kk^N>lWRL7h+c1`RPA| z+k*<=LRs$`0k8yD2w6+n3o**>S*OTP=$lJ-qQ+~S-#Wd@GOFf-?omR>6z4HU1!|df=!5R*HBL5tQ>QYpiWeStpBfT$?2O)zYGtr=oX>AHh{&^})*MvW+|| zXDL&XDNN;g@fYOQi(;spo<+(rOC>w^+)v%P7u%03+N~Xv&76n*(3cNS$UF{WQhe|* zlai&g({(23(n8v364`8LZ zp~%7W=kq_pQmN9%ZD+=j0_{W$lXu8jmBSJA`|fhCU}6yd)6f{U7o*cu3Yj-=9#rbt zz!Vt39ig8nzBQy~3cGr2tSW_W#xfDMW)l(mDB|(H*HmMxGeg*c!cyt7=lDO%vb`d@ zzcJS2^@1?%)eB3p=jc25urA5i_la>-h)=G}?f7+^wz_wmA1&T^h##~2Pwo5%w9Cea zWcw1O8t&R;$9Kh&F`VD+K^jFb?~6N0Ug|$hZ;K{AGAGLH3i#t9>zzm*PRF9(-11|O zZH_KVNS zM>eTd0{usY_JdAhmV1nZIs)Lr{sE?JypeY)9xA5|+)@O`Jd9G5ztgcDCGGEN+bCN! z)}sk}5vg~Zo4nXI@C#6;3;4f(gdBqQvl>wd~h#15(i44>r zU*f^zEGQdq>Y_SY8IM;9%VvzoHJvrDp!H@y(>_oQVe8UclkLP%`b#qK&zQ%T`S8pz zhwHT5DA!#k8N2q1{-XX9G3@U^F>HIJI~JWaIOXLO=Kj8g4ih=hLo0!&vKc+IUNDGs zJQhiLEne7}P$NA|GQV`Tsw@T2ogiLMRyq(hJ%@KS8pKf;N`Z05|O>5Be6g9=gi*eKJV0_hax8x$Oo(^SHW_V-@z zAIlu$Wvj0O0TLkALczunp}_G( zA|i{UQ#$W1oaY_qrDn|x(ZZV1Ti~Dp zOHdGqt>=|nMf|V2li&d`phP&6;KGn*?UcDslyjePvD;GfLT@L`uh0@7cdC4fCaihD zBGY{J(~H2#<&5|LKD^~{$qj-hUWJ-^i>Hjm2R+_6^JNB{tM)ga9WbnAk)ghAU+v}N zP+Ey6z}wOW7vc#9YTd8X2iJxA&b#Zf+JndSNMN3J2wF1 zMQ9!7HkTW2Uxtu{#apgE4X7PRfZ8FH-@kk)|B+3xD+P!C>PvwNT4$!gQ&+kOg#mxNksA=7_Ro8f~Lp2x`dDBQ>r z4(DR}RQ8ZAGEB5)o|cGOE`R4_{=GZ{E4z*M4S0ej9*j&H4W|s_pjb9VsI3uo2*=B5 zGkG#!Cywlksmo@)V$-Sv5 zF$5yc7ChZu+ujjReG{_p^E^P<)C`|AJB zGLX9D`;uNPOG)KxLw=~^f_MtjKJhhk^f}$Cl;Ty?g!s&C+H36A98gq#95Avm(a>AL z6YMs2iN#Khtf{$B^XAMGGXw@n@$|_PgDR8)LqqAzm0pG0zHrMAcoN+4aFg>QnuoD; zgBwSpOQ-CpaL;G#-YF&D&&Q6METKh8(d{0M2~bH1`c>kgE+Py8RS81Yk1>&7lW@+HEDc?D$betD4U?(gwuMpY=rXZ_2}bR0?X z;yDaE9}nWTk(~PGjBJ{a>rUYD_h@gMNs^~q@gdN*T!*W6i|F8mmmq?{0Pt=*xzc0v zgjc!|Q-=c_%fy%*%DP^{L)9q(3}Ya~B8GC^3a+H4sL^Jt2l^lj z#5x<}eAFyq0>?dE0bKT)PU?wP( zAzy_ZdtP3c@o~%ljLFLk>b4q`z^jl1esg;uLJIumD|p4WDql$7RG^G;g2S@RHGLjB z-!*&Bl#fj&eL^(#jO~Iho;Wo5U^rZRmItvbk=5A!Pexuv8z8TfZh;iTD)fbl=A!9h z=))0EnSz){_@|a~(9%qs%JM_FtsPKNmsbzsps{PxpGo zuZmBRPA5`@3r5f*6?2n9Zs1(2(uI(K!vQ~sNaLm}?ROFJX+WiKxecC+dEmRT5g|k% zW~~?S2LHWE}9@0{=m%D89U5b@7<5VQufiy~cs&q_Qrg4$}d=`rQcgnU?Wu2T8_bTn|d~ z(KPDUoXD1}PqECrSNTOH?j{aU;!r_rmqtmITuygB6!t!0S3{c0zjzh>TMg)YUuNs= zN7R9yGiJFOcu&1~hENzeY5QrkB3Z~+Tp{=fspmWFZFqL7ZHThSajrAjFt{8(Mf!Gp zlz!p;gJFyD0^18@kuVgpE;OqBjmmzql;^(}G9a49P*c)LH z8H>s!g__E@@nIV$5(Scy?8T4xK0c?IJXCh62CQ!Q_f(f#ZRZsM;;asFO%mQYKGHco z;usn8quimB8|y~|zh_;_x+Ux$7SkG082F6LWGpT71iq^|`)bnr}$FXU-H#5qHlFKs5dyL-P%gX=EK*AlD%( zu~O_}TJI>qeo?I}QE#Ef6PS`i=}6U0Xxx{zgOT>;NU4p0y@IZ`JNgG+`uzF>d zQ&YvQHPgK@#PZT^`;lpnKeSEVHFR(@Npa|JF>y-Cbw;k>q6{&Y2K>XkH8k_OGqt#G zRDp@Er=5kYfyiG^v+8Yq0g?$zrLPPFeMsuIuvbVzm9U|C`@)*nvp2cznygEYgVbd+%4QSdw<|5UHBJvGBnY058HDF;mFjsoh1l=@Ha|w?nmRCeZIm#?^I__J<6=%NxjL~oI9+p^<)Mg?1NHbF= zM_QRGGh zt9}LFDL5@avad&YDHZTAfWBwd5L&_s0QNAJld6SAy1!pCb}vXw=^W`>(FD;qj_+mMRJBsca=8BDfk}#gACqWs!avP-Y2#RB9Uc8>>NIq=q;JIz z{s01YoG-CYsr#6yZd5*>;56qf#x2CLMx}4@ZS!}bhrX41lUQm(<~&bK7ewD@O63x_ zcuU^mh5;8Y?y`sSO&oWM%#}B*Ekcgcl%F@i9HzRd&Y-(h2fQc z`MxV^SH@{erKINeRjMf}!wQ}7+i-iPWYzT{=k?&vEP&&`xX>OLC#H+lb;F$8(Z zkopgW&zb8og9(r2D~)6!eN6*1sez3wzkW5cnVuXg*-rRje_rMw|AIwYut1F+zBF`q ziApEYwADmgjH2cp1Vx=6P(4g5C;|lkpN3sYm@Ua)tLJcl+)~2h-9vq4Go0vpZuPg z6t_5ffY$On&)R^D7P*Vm^rl^HPp?pM!L&^ZPWWjrnXNT{_k3m{?sm!xBF{O->D(Clj1nkaB=pM-oI(NwZCjkn@a!2BemP!I8$M; z*c&Q{$g=F0VEOY5?;#x&{h2|?lFhNEp?> z)(nAsvz00OjC4vv*<|4RcNy4la>}1xe30Lo8g#ro&%6d7DU9gdDmHfy5DxVCL+^9g|Q2WCX97 z!jPO>1^|gJZju}GqL;1zf^WJ@?(qV#FK?L-KJJ{s7BUNms(4#(-SD`Kwmgu?##UQ9p97>}k9_1yEvmD^tsxi&hlxZw;=U;jZ(?DoQ znt>K0W0cilG)41f^W4-kDYx9Vj}~2_ooDmN?DH7Xq=wc7kFmq&yPe|Zb|@u(<(#e? z`YDaiW4rFX*%Fw(JvAK{;kX>mjGXFa(Q1zgXLm<_X!m8rtd?#R9T^jwFvi;qUwnlM z9St9~bv4&%fDV36fegfkprS zk)bIPdatQ9ad!AZYFe!;;bb3I1wBBb_IDG}tKD3Ndn4w58AAU#&5Q`ii+oAMPx13q z8RuTU*@|#tm6@z2MLHhbV66C1nL#3+TQ)~Rs+IRXr1VhXrB7qCJHBWe1eN^gb9|jV zf?1OCIjwn2!~0Uf{&`cAJNove=M^JTSbcLzesRO!!D-lo)k&<{qNCSgH@>*-5|^~k zdJ+0f+%Es`=v!%-TIMZ{1=uV}i&RAkZUY2=Y?kLtnr=_}CY7v=D?(Z>@E}0z6kA30 zBln{qlJ0D6W@BaggFH+vt%qr-9{scGAo&Y_0CAMu1@$!+Xl*SS#y|s}O!8Yd>ROEY z7wYV0Gwi8~{?gR1G77O6*iGKewv|rYKHSP;vqfcCqp|qt;&0zuhq&rS>i@UvF`LRx z{n-}OsMVQ~h$8`ZzoaIOG4Wk#^GcoFiW?dWNiAXn(6~1hi+s_O=!A=IZ(u%2VaDL~ z(_4}jc+cWz}Si9*u--8u{^Hh!bsFDd2QIxY?0L1u@pO0q5Dx< zKE=>6h=^vp1lFu)IEhH)nrkB)Z8Z5>0T7r9g1nEAy=Yaf+;|mKI?0&U$U_{{;z&PDvPG zS`ENlZpibu_6$Z&lJZ>c|V{9hLb+uH)AUxWgM6)5#xW*3?88!(6eUtvht+I z_1vDF``w?45Ue@I30CF$r8*BE8JPxf3DjITi0jP{&Fj4X8KbUO(W}x+jJ#jf&dpG? zw~a4v;WR(enF8%9cw-D;wfuFES4mWZgR-42OZ80}Po`%hcDxtqn?W(-OZ*oH)KnD7 z&yrq81TOJ;9TQ-Fwr1)PxlKYs9IqYOEOW#I?I!pb4m@F7O;fGoR|SA~#m?UKO#QFQ zH6rxJgQCPUhK}Q@s)pDPpxCdja=Y7KZq#A7g`RCMmcW;5?RF_LDCw0)$VFFkH$RZ< zQ$|J7<39p%rIphQlb{v2Eu1f7t(-6FM`W36d#s-iR_c%MZ<8L+#A%F>*O;xiLUniS zrJH@@(sv#C0u4W+*6C*VUMo%6JTJ*mQSn>m*P_Mb zReaXZk^KUnP}gQv)C*+fwYa}fP#m(Io4l14V~vX+CR5o!_iJeTr8iw>O%we~S;8>? zJ(vR>);HhyrajEE&48IeR}!5oWe?PfR(=?Hm1rWHW`w$h{!vFn`m?Tu*!#?~9E|BW zN}A&Ca_2p}uVZ66L~jQJ55>kjnmzyB-xw)OhRIz5zSyVGJ1- zjI`^9llzk%PyAq{OmP-0(RyZENZqqGwpZ`(u!+T;x+0*~#q$m{Dl7QVCZWof=JPV? zT*2np6|(UNpL%wOlJb9$cm9r6O}C;<93lxaHyDbllX;@yiIuS5CxN4HsE3ihtzJMY^PGV5=;b~QdC_J46Fu&N7BBq2{d zIn{>DJ;i|qYiN5**#>ex>em+mOAo15`38F2Sfg-YoS2a-R=2;4rATB2%je&U#<*! zqd@8L#0fK#+`KwXy`_rFG__U?=40otcUWXkj(wHXQPy1XB(r^6Ri zl0PENjOi@EeKVC9pqtV7;NewXhsVKNG*#>CGd5cJy-guw=)=`}Hy=FcpQIdd?``cZ z2@&*_`e@9KV&VyPx4$QU(UaUCe2K*szS#-0Hj1u}_kYDF7Zr&bmbW&pQ7J6%m4|+UTdwI8clC}UWonxE_?Q=$ zw+O;H{se7pSwi<$jSR(Y>b?l}9>-z}y|ydmQAoSfdedgcTMK#}pD$tk=yi76M>>h< z1&EsUXK5QgJ#D-o?Xv+B60_T%OSx%I!@r>KPU+psk1O8@gd}IWWPohE@9L@JFg1he zo?Y80o56(-?M2RuPv>e&dBu_~In@8+39gy8wNXGPak0~GZ0ef~6x3f|*|NZR|0szq zegP#0&n!?tH@(m> zC~vo>+iB+T$M(*=zLZ>_Rw|SesfkkHsT%W9@sa<+(cQI7z{=@Q`~4;zbrLDP`BZTV z>Uc3lJ)Nn_#8()%r&4)6`__AV$02K6^*>v&iblHq;Uqm>(frCrhL1$fjIM-{zQ;pk zCw^3_?Vkvpmya#qX(Sgfc=P~d!&QO+vmdHom(~YwD;3pwSgU_a9n zk0+u&X`!$IagRVY7b=3)vOC=HYSefFYQL_(n8zVV)00V3cG_d3gqS$?t@rw$+RH$< zey-w~9g-|oW1FG$%CGg~NbiFixY^!c+im;LvMhj`yh@mZ6m^^=ZP8>CCt?$ubJfJ- zGM%tzKw@oJO&x}c=e1_>vBXa5S_6H%iO7ic&>aLUbhZa>jXO@6tbQRT_V>z1@ZW}$ zne8LE?tDAe2a8!%z;#uB)=w$2wR!CrK@xMf?%R1;V!Fx37rm+aCY?8iyChL3q5u4b z-67JCk@_4eHmyG*(zR7 z@o1$Y8-dE(8YAD;hbk{Tfip=_yKC+rDe9`^lF|YB?0ZD7dEk}H%#-4tYZ}+eSqsGd z$*bbjIw?J>DB_sPx!q?HIv?Pi^Ls_>i1`tKJQW&>K~W)uJ${)21PN<>{niV^HCeAh z-IVJo#%RAJcYt1rAnR5tO8L*;67}Mr0Q_``9m#D=%R=>cpzEr#uW;@kk-OkX9%?Po zjv!Ba&m5Y|^6w9u;8_F%a?e=J2dfFVZ72D4&>y%BhcBvra7k%dM4<+F>%^_kwfobn z=V%9w*2fuDBK!9$#AmC^cbwG@=!Eos<2kFp5Q~KbFlK^m(RU|Ki0Ff!h6YpYSr{|y zi}|8FT0R|d+I@|hJ$uxAlj93Za=S8nPF&Tn``V<28l$;kI3pa$=)sMfdrq*1l_4y5 zwHXc$2BYqi?krYRJY4{8Ei7`F&NPL@cEh zG!O4j-OD~>=lv9fE(E$E3>GMNTOfyZUCIvTZ&g3X#Ks1Kri`TP3P$b<7_Q-C)-vd3 z+UWa>7i5rf@4sM%c+0+?iy?jNKC5TM+O&5)sFr1~z~q`eE1Lepsk6Fzr&ZeU7dGf# zLLy;+5qG-u-TO7ConGhW6F%$E!-K&Xkpx;+^*F0r5W~n2PJD);)arQ+ZMx#c4Z1(y z&t*%q4}HVp^j%hBDdkBb0=)ObP;cJjizvt6k!1e@|26w($(l^|9?|UiX{*J5Rw?2J zU?eGvwfC!+n=j0M&gOyjlQXY)e{=jMdeMNh38VX zEQf}c{Tn4^ZW^_ly2a&E$4o#t&&=qdMKUQ%;>ud>VSEx{Bwjty$cWC`vOtiAq$P zA<=PW<0Vu63)Q~mdl@^mgF9xee!y`Rnv4g81mN51~;d&lqtqUY9 zQ!5$1%(B~L=A{{foD3(9sxsgsSrc^gH8>`I{#Pe;gTQ z#k>0wsEuZ#Rz%1!KjnpNi=2_(Zb9mA6{g-BheccQ74d-pVeX zX#~-;8Txu(hVUkJ>nE54sVCD{x^0%M!<7-y^OG=!T z2L59aYPCJTM>#!!5RD!R&(<+qA_&lZNC>;hVo1Azi#=sIG_mYY4efMRq<~Kz+>*!5 zKot>C1XWeB#`cgiodh9lGkzeNy?Sp&xNtkojQ>1UvZG>uMm1v!#gIpI+V#`w(k2Lf zTwecDc0O*Ix996kdkF$wifiWO`jFVx#BcvhHq$V?VmF&gv-X>xpWOs1MupI8MFXU0 z_CP0^eycI_3r5CK>`O>#Uib#D)IW{P$TP|G}(P;cd&*f7x0iiIRC!L9y+&?vtwu9yR*3&1Y0?5?*CaMmOKtf zmI^@G!&Mw{u1$JWZO+gX2Y7twv^Q*dn?qMMOu(h#!qJCx8C5f}Zy6UNDLM{yOp&ul z#tg!U4CbV4D0jYATAx2n6|# z+9U=r8F@zSzbnfHmAtq({kt|0wKGM}=qej_#ka<}Pf|Jy!?GxD-4}(BRtrt75)JLRCficXiXaq z(*5cM5^wzOoXSMQ&WcGoBs+fON`@4$gW1mWqCfsjDxHO_ZgpNtVo@iPzJj8(znq{n z%Ha_)W0KXTxk4>h#kjOQrUUdk&F8z35|uE%i%2+O$HNE5)QoAok`; zTfSZ#m0FwlL3Lh`d!NSqcTM;M31Eg6?}p-8U_wJ>%b&U!iUzvSCP0OAgkl%ToI=0=3JUeQI*X{ zq4MZ1>X~(*lKE)ikQ=#{pfhtkK6Q39VO`2w^T0wE#ed7q$EusY(BssK7>v8-n*Phz zGx^ZE9l`?e^|qt=5d8BtKf751PVIUa+dQ`Qwmbjh|5)-|>)wEVfU31>tv3&eN)s(C zB_j@cm=PRb{CHGtg1kyhqfamNOSzf(pVKAj!O73 z5y!oq3npNZ38;T*PIpv@1-%O_p|z_!%4Jed(? zXa(4Fl|o!adqIjEwtv^$c&>21sS_%M<*U!0(u;h!kc90Mjd#V0gq1EU{=eumiaGwy z>iz{9i^MOdOB{MrYhbzMP*iC0oS%2|26jh8sdVaRft<@%HWWFU^CB=Q$2@43N)ynJX z01I%GJt;+56xPO8-t%YeKMzg4?g}%ipUgcLD*PkXMidE?__CakVb}<2Le< zbQoE!pGeG5+$%;~=!=^c5V9BJ*G2zU;Qoa06V44;QC|O|b(XGulAVx%a?n65+^=st zll*2$TE%bHzSAx~6-KWhC6YTJ6>ao;quS>o-y+w>ZWR?}6{9~;NxUr;Sp+y)&3BBBJ{TR8H2j#j1>!`QfpS!m>Z6$8< zQi=Y2hEE(&1dL=lr=yaD<=tG@vK@#Lq>UZ^^HSrF)INA)!&wPXbKa~o2Ps0?9&F>;$z4M#X z3JnnNp>$GW4<=bA2m`#z8Vrr5s;V1L^pwXz2ekS1C;T(_K4KLO*j;H8CZi+LgHoNI zY>iWxY-U)nMD^7yp$r|b;Po?=#Q}8=B-6V`Tj^}J8BuSncJG=jDZwDiF1Ke%|1B82 z0Nyn?xWaB%i!rTcGWT44aM2FXCScW_JZ65r6t*0sVY8LoF`~pDJHi<3A}VtQ58OtA zqx;LpItPguN|%ndL#mWPHa+?z56Pgj1!>J6*&|+Qx?CK(t(E-K;beu97xFCn4CL%m z3|1q8So1?1wu<*0&9$g8A!lbF`FVKClp<*LU%!66J$m@9q-02^NY4y~LhWR4$a-CK z5c&TWG>(8FpP0(BwrUADSAV5L@BmKAvtBqx6l8~B5#bgr+JW5mvo*kDQ^bVah>U@eabBf( zmXDu*UInc62JmKz|9zL$%Sq9xus+o08h6Wfrk|saXEi3TXz!rKerxz-LWQmQXmAoa;e*Qa_ci`*>T^^1m#=hU;FReNR0&VYi z%3Mbe0Nbq$Xh}f+v&B)}r9x54 zl}feocB0qxXpi7^^fd(?d`)M7e{+<6Veu%nh}DL=H`BByGbm@u3rlePp-#x91$CQ( zHwMLsMR|api@CS@H*`l6!pi~(q20k4aWgCf<0F|xu0cIJw2ri}Viy)eq83@nj6RTB zy>mlN+kfUxGMl{zV9-pa*&q75asH`48;9xm{;JLJQ|V*hD#DZ$RL`l?T-TFpj&r+6 z>G!WWVQw=!;J1TOiaWKqdE8q8R6p=KfdMOhV1-!nAVi0FXEFG&cXGrw-om~xpC=!` zWaPU4v`vdP@DVnH!SvJui^uq)JJt3oe?9nZ=I)M!dIiCZ%NCS}4IN(6l~iI=gj>aG!hi25tBFbVSQUNqe~U>b`Yz0-NmH5(c1}%c{N_BTSkHoEc7jtmJ>Zk8be021NyjCm-OW+qK%Q-iH-@^tGxZH_ zsm=C@%&wH-9d88rQcplO^Qq*nO=0F0>nXt70IsmP4&8iXH57QktRv=aGehi!sd=*X z1hnXDsAtdUq3Z?zHDZ&WSX17QJgw^apl9OPW6o_WY3KvKyVox|wNv0RojF6N&W68l zpD<^m!QxQv^9y|P`h64c2vCG357oJCcz>n}FO83nKjDiPuzKjZZKKGvnqbnqKYMMgWNsMiXI2)q%hV{3uGm-oY`fCv(2x4tMUWh_`)Rv6T zq=w1t6~?UJ2M@ND&_~2@6T%U9FtcJwza%i{(!=5f=w>?ZjSFhW_mA?w03!jgCbdxh z5U*6L8{rWV#m2{7XmwxXGf!WwyKOigtPhI2u0n998yT2}-R8SXk1?`2{af2xy+Ko*s`nzq54`-iZK((DHP%i56$D_Hn_#kK8R!0yyRUZe($>uSzeA@pZCmf<}sC}tGp^()DW3(x4J}a1a?H4po+Ns}q(16=%z(h&!{4qZ|S&2r6 zu=v^@Yz!agha?(qz$Z(d(Gz z+IK6yCZYH@l>3Z<1OMvOJxpf74X#=E+$x-X>}Yj3VtWI{=xDrm-_O{j;W*yn*flmy z*I+67v`G5$F}Gt;yRy==QE_tM&iRtOyt3DYI{NbRpNro#OsOO&v_T;U78jh3_ekSIo|TD9UdDX7@5H_}#q@zejZ=zR3-( zxw4m1H63!;p|{+2+50~4c+&yFYs#m~fJKRa#^5)*Te33h(!#fySu6L{;aJa;m?VwW z-l^<2bW0mK7CgsON)G=q|Lo^_F|_#9yr3jhr`ei;)LH!N3dKrXnyedq`Ftv zo_R8zB=X(fG;)l~I;x$LM2Us7MQowx9XLCaPAjp{z!%hXQYC&keFo&vVTMPX>vYFq zX;2*%ZfJ{Y2vtj^4Lf9U`g@4uXu0iRsilU9%|^pXk;sytM=*aFibxNgMu5|nh1SbL zo-d|=!@F~$zK)H@UDs5Op=6ahT){4Zt<#YWw*iC7%k`zc>;}%R5QKkXLV~r|{_57y zn?;=Lak~Ow@y-muZ0nwT9jxyaKa!hE__m!Ctzfr487AMWb%+|rcx}EuU@#midIna0 zC7SoZ*&&;BvqppC3g!d3JL~8dmuF9ElGQ#)ljDfEmG--arz!2w

e#_N{qO8{vkD6lQQ*m&$4X*oC9jn2zzlHW4*%bzz~MJny`;Mz>E-b!7TkZPDcJC!QvG zB+AC%{MQ+3zuFD!1k_+b7uUpjp0MCd$uxx(vI~y)K-&V*YYCXlI~M2Z5#3{dlTe2? zFB{xk+srnXdRr^zF%2@|vG@czcs##G2+hVLYXu=j|w0*S09L$RM+&u>+T z(K^;eyo)_@@bvUN8y`-BzhLCz8!vd&Sq8?P7rDFZAME$s`quCkVcL8Bj%e-jheX!4 z>T!+UquL3ds*w_NA&M-TWuU5Kug)7z*z#VNRJc?GCWt3sHcphXPbMoez{bNi%4Z?b zQ19T@#nS~+N8nvNF+YB6_B7k-z`Q^q{g@p4h?V=2i*oOWxs5wt(!M6lAZ%KcN!KEk zJxzPDnYhWrm&Gj#VQx*K4~z${vg+01)19__2SS6Yv~!Sld>0r6g!YnV}A*x)qR0;T$r=4zHf-;ptjCVGo) zEN~3Lh-I8<+TX>k#W3R?nz2yRyD_|QgSzyypf>ePo4Viz-dOsDSm^xUq2i1TM)h*L z-b`iF|7596zhn46>ygiOOHZv9@VnkQ9%ieH+L>`fHliZ&f7%t#kMz6_r$Y#*l>j(C zrPzb1PB-y7=1k|+FV)XhKU!k-nW>?x$fj4c%}rDEG3WF>8Jk+w^F5Ap!W+_98DO8mK+iBtJVf z)^9ScE%hnMK|7EHoyuzCDNa4?OTZ*Y2CMwC(sTR7NIJK2V%yRXuMi386hTWFZj2~r zUsZ%k30!EsSGI`Vdvy^5mo5wis@wwQKC~PNE+b65DT0h&`!D2W^<5cVZJNML++0W} z)E-!z??isewO-9ZlF>kA4u?(2hN|0$&WhTm?%Ck**K*=>DL??TPMsD zHJ-y`A)v?Eu~zJ2m8QHpc;kw!%adK{uu7MPd5cAWCbM?07Uknjf=bubIAT) zWq8tak^Sw>=TVGW{j{33$R?S#q4C_bSy(|kd?>7pKrf*zFmn0iY+?hm$a<2Krl@~w zF1jOnRU}o#Gn-C59&`MIFm}(qbQ6$_CX5#*8?`f3{~o3Yz{0ecDN8A;LOZyaE6$IT zs!srolXU!KxK#T@3tbhF)VI-alXoSw>irh(&L(>>%@C1U�(ck|Vz;XBH$oZTI7 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 literal 0 HcmV?d00001 diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/pom.xml" b/2-Dalston/eureka-consumer-ribbon/pom.xml similarity index 66% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/pom.xml" rename to 2-Dalston/eureka-consumer-ribbon/pom.xml index 0ade22cd..75523640 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/pom.xml" +++ b/2-Dalston/eureka-consumer-ribbon/pom.xml @@ -28,6 +28,20 @@ org.springframework.cloud spring-cloud-starter-eureka + + org.springframework.cloud spring-cloud-starter-ribbon diff --git a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java new file mode 100644 index 00000000..b51fb0f0 --- /dev/null +++ b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java @@ -0,0 +1,42 @@ +package com.didispace; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; + +@EnableDiscoveryClient +@SpringBootApplication +public class Application { + + // HTTP 访问操作类,初始化RestTemplate,用来真正发起REST请求。 + // @LoadBalanced 标志着 RestTemplate 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。 + // 即可以在获取的服务提供者实例列表中,通过 Ribbon 进行选择某实例,然后调用该服务实例。 + @Bean + @LoadBalanced + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + public static void main(String[] args) { + new SpringApplicationBuilder(Application.class).web(true).run(args); + } + +} + +/* +Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 +它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。 + +当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务实例列表。 +同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。 + +而当Ribbon与Consul联合使用时,ribbonServerList会被ConsulServerList来扩展成从Consul获取服务实例列表。 +同时由ConsulPing来作为IPing接口的实现。 + +我们在使用Spring Cloud Ribbon的时候,不论是与Eureka还是Consul结合,都会在引入Spring Cloud Eureka或Spring Cloud Consul依赖的时候通过自动化配置来加载上述所说的配置内容, +所以我们可以快速在Spring Cloud中实现服务间调用的负载均衡。 + +*/ diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java" b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java" rename to 2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/resources/application.properties" b/2-Dalston/eureka-consumer-ribbon/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/resources/application.properties" rename to 2-Dalston/eureka-consumer-ribbon/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/pom.xml" b/2-Dalston/eureka-consumer/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/pom.xml" rename to 2-Dalston/eureka-consumer/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java" b/2-Dalston/eureka-consumer/src/main/java/com/didispace/Application.java similarity index 70% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java" rename to 2-Dalston/eureka-consumer/src/main/java/com/didispace/Application.java index 2cc33e07..6c7e7144 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java" +++ b/2-Dalston/eureka-consumer/src/main/java/com/didispace/Application.java @@ -3,16 +3,15 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; -@EnableDiscoveryClient +@EnableDiscoveryClient // Eureka Discovery Client 标识,并会自动化读取 Eureka 相关配置。还有向服务注册中心发现服务并进行调用。 @SpringBootApplication public class Application { + // HTTP 访问操作类,初始化RestTemplate,用来真正发起REST请求。 @Bean - @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/java/com/didispace/DcController.java" b/2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java similarity index 77% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/java/com/didispace/DcController.java" rename to 2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java index 42bb5bec..e1acabf5 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/java/com/didispace/DcController.java" +++ b/2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java @@ -15,10 +15,12 @@ @RestController public class DcController { + // LoadBalanced 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。 + // 即可以在获取的服务提供者实例列表中,通过 Ribbon 进行选择某实例,然后调用该服务实例。 @Autowired LoadBalancerClient loadBalancerClient; @Autowired - RestTemplate restTemplate; + RestTemplate restTemplate; // HTTP 访问操作类 @GetMapping("/consumer") public String dc() { diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/resources/application.properties" b/2-Dalston/eureka-consumer/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/resources/application.properties" rename to 2-Dalston/eureka-consumer/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-api/pom.xml" b/2-Dalston/eureka-feign-api/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-api/pom.xml" rename to 2-Dalston/eureka-feign-api/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-api/src/main/java/com/didispace/api/HelloService.java" b/2-Dalston/eureka-feign-api/src/main/java/com/didispace/api/HelloService.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-api/src/main/java/com/didispace/api/HelloService.java" rename to 2-Dalston/eureka-feign-api/src/main/java/com/didispace/api/HelloService.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-client/pom.xml" b/2-Dalston/eureka-feign-client/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-client/pom.xml" rename to 2-Dalston/eureka-feign-client/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-client/src/main/java/com/didispace/api/impl/Application.java" b/2-Dalston/eureka-feign-client/src/main/java/com/didispace/api/impl/Application.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-client/src/main/java/com/didispace/api/impl/Application.java" rename to 2-Dalston/eureka-feign-client/src/main/java/com/didispace/api/impl/Application.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-client/src/main/resources/application.properties" b/2-Dalston/eureka-feign-client/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-client/src/main/resources/application.properties" rename to 2-Dalston/eureka-feign-client/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-consumer/pom.xml" b/2-Dalston/eureka-feign-consumer/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-consumer/pom.xml" rename to 2-Dalston/eureka-feign-consumer/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-consumer/src/main/java/com/didispace/api/consumer/Application.java" b/2-Dalston/eureka-feign-consumer/src/main/java/com/didispace/api/consumer/Application.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-consumer/src/main/java/com/didispace/api/consumer/Application.java" rename to 2-Dalston/eureka-feign-consumer/src/main/java/com/didispace/api/consumer/Application.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-consumer/src/main/resources/application.properties" b/2-Dalston/eureka-feign-consumer/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-feign-consumer/src/main/resources/application.properties" rename to 2-Dalston/eureka-feign-consumer/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/pom.xml" b/2-Dalston/eureka-server/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/pom.xml" rename to 2-Dalston/eureka-server/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/java/com/didispace/Application.java" b/2-Dalston/eureka-server/src/main/java/com/didispace/Application.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/java/com/didispace/Application.java" rename to 2-Dalston/eureka-server/src/main/java/com/didispace/Application.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/resources/application-peer1.properties" b/2-Dalston/eureka-server/src/main/resources/application-peer1.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/resources/application-peer1.properties" rename to 2-Dalston/eureka-server/src/main/resources/application-peer1.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/resources/application-peer2.properties" b/2-Dalston/eureka-server/src/main/resources/application-peer2.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/resources/application-peer2.properties" rename to 2-Dalston/eureka-server/src/main/resources/application-peer2.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/resources/application.properties" b/2-Dalston/eureka-server/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-server/src/main/resources/application.properties" rename to 2-Dalston/eureka-server/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/pom.xml" b/2-Dalston/hystrix-collapser-consumer/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/pom.xml" rename to 2-Dalston/hystrix-collapser-consumer/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/main/java/com/didispace/Application.java" b/2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/Application.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/main/java/com/didispace/Application.java" rename to 2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/Application.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java" b/2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java" rename to 2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/main/resources/application.properties" b/2-Dalston/hystrix-collapser-consumer/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/main/resources/application.properties" rename to 2-Dalston/hystrix-collapser-consumer/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/test/java/CollapserTest.java" b/2-Dalston/hystrix-collapser-consumer/src/test/java/CollapserTest.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-consumer/src/test/java/CollapserTest.java" rename to 2-Dalston/hystrix-collapser-consumer/src/test/java/CollapserTest.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/pom.xml" b/2-Dalston/hystrix-collapser-provider/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/pom.xml" rename to 2-Dalston/hystrix-collapser-provider/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/java/com/didispace/Application.java" b/2-Dalston/hystrix-collapser-provider/src/main/java/com/didispace/Application.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/java/com/didispace/Application.java" rename to 2-Dalston/hystrix-collapser-provider/src/main/java/com/didispace/Application.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/java/com/didispace/UserController.java" b/2-Dalston/hystrix-collapser-provider/src/main/java/com/didispace/UserController.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/java/com/didispace/UserController.java" rename to 2-Dalston/hystrix-collapser-provider/src/main/java/com/didispace/UserController.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/resources/application.properties" b/2-Dalston/hystrix-collapser-provider/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-collapser-provider/src/main/resources/application.properties" rename to 2-Dalston/hystrix-collapser-provider/src/main/resources/application.properties diff --git a/2-Dalston/hystrix-dashboard/pom.xml b/2-Dalston/hystrix-dashboard/pom.xml new file mode 100644 index 00000000..01e21191 --- /dev/null +++ b/2-Dalston/hystrix-dashboard/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + com.didispace + hystrix-dashboard + 0.0.1-SNAPSHOT + jar + + hystrix-dashboard + + + org.springframework.cloud + spring-cloud-starter-parent + Dalston.SR1 + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.cloud + spring-cloud-starter-hystrix + + + org.springframework.cloud + spring-cloud-starter-hystrix-dashboard + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/src/main/java/com/didispace/HystrixDashboardApplication.java" b/2-Dalston/hystrix-dashboard/src/main/java/com/didispace/HystrixDashboardApplication.java similarity index 60% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/src/main/java/com/didispace/HystrixDashboardApplication.java" rename to 2-Dalston/hystrix-dashboard/src/main/java/com/didispace/HystrixDashboardApplication.java index d6f8eda9..85e028e2 100644 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/src/main/java/com/didispace/HystrixDashboardApplication.java" +++ b/2-Dalston/hystrix-dashboard/src/main/java/com/didispace/HystrixDashboardApplication.java @@ -4,12 +4,13 @@ import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; +/*为应用主类加上@EnableHystrixDashboard,启用 Hystrix Dashboard 功能。*/ @EnableHystrixDashboard @SpringCloudApplication public class HystrixDashboardApplication { - public static void main(String[] args) { - SpringApplication.run(HystrixDashboardApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(HystrixDashboardApplication.class, args); + } } diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/src/main/resources/application.properties" b/2-Dalston/hystrix-dashboard/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/src/main/resources/application.properties" rename to 2-Dalston/hystrix-dashboard/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/pom.xml" b/2-Dalston/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/pom.xml" rename to 2-Dalston/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/pom.xml" b/2-Dalston/stream-hello/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/pom.xml" rename to 2-Dalston/stream-hello/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/main/java/com/didispace/stream/SinkApplication.java" b/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkApplication.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/main/java/com/didispace/stream/SinkApplication.java" rename to 2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkApplication.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java" b/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java" rename to 2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/main/resources/application.properties" b/2-Dalston/stream-hello/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/main/resources/application.properties" rename to 2-Dalston/stream-hello/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/test/java/com/didispace/SinkApplicationTests.java" b/2-Dalston/stream-hello/src/test/java/com/didispace/SinkApplicationTests.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/stream-hello/src/test/java/com/didispace/SinkApplicationTests.java" rename to 2-Dalston/stream-hello/src/test/java/com/didispace/SinkApplicationTests.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-1/pom.xml" b/2-Dalston/trace-1/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-1/pom.xml" rename to 2-Dalston/trace-1/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-1/src/main/java/com/didispace/TraceApplication.java" b/2-Dalston/trace-1/src/main/java/com/didispace/TraceApplication.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-1/src/main/java/com/didispace/TraceApplication.java" rename to 2-Dalston/trace-1/src/main/java/com/didispace/TraceApplication.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-1/src/main/resources/application.properties" b/2-Dalston/trace-1/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-1/src/main/resources/application.properties" rename to 2-Dalston/trace-1/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/pom.xml" b/2-Dalston/trace-2/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/pom.xml" rename to 2-Dalston/trace-2/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/src/main/java/com/didispace/TraceApplication.java" b/2-Dalston/trace-2/src/main/java/com/didispace/TraceApplication.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/src/main/java/com/didispace/TraceApplication.java" rename to 2-Dalston/trace-2/src/main/java/com/didispace/TraceApplication.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/src/main/resources/application.properties" b/2-Dalston/trace-2/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/src/main/resources/application.properties" rename to 2-Dalston/trace-2/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/src/main/resources/logback-spring.xml" b/2-Dalston/trace-2/src/main/resources/logback-spring.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/trace-2/src/main/resources/logback-spring.xml" rename to 2-Dalston/trace-2/src/main/resources/logback-spring.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine-amqp/pom.xml" b/2-Dalston/turbine-amqp/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine-amqp/pom.xml" rename to 2-Dalston/turbine-amqp/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java" b/2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java" rename to 2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine-amqp/src/main/resources/application.properties" b/2-Dalston/turbine-amqp/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine-amqp/src/main/resources/application.properties" rename to 2-Dalston/turbine-amqp/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine/pom.xml" b/2-Dalston/turbine/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine/pom.xml" rename to 2-Dalston/turbine/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine/src/main/java/com/didispace/TurbineApplication.java" b/2-Dalston/turbine/src/main/java/com/didispace/TurbineApplication.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine/src/main/java/com/didispace/TurbineApplication.java" rename to 2-Dalston/turbine/src/main/java/com/didispace/TurbineApplication.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine/src/main/resources/application.properties" b/2-Dalston/turbine/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/turbine/src/main/resources/application.properties" rename to 2-Dalston/turbine/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server-stream/pom.xml" b/2-Dalston/zipkin-server-stream/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server-stream/pom.xml" rename to 2-Dalston/zipkin-server-stream/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java" b/2-Dalston/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java" rename to 2-Dalston/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server-stream/src/main/resources/application.properties" b/2-Dalston/zipkin-server-stream/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server-stream/src/main/resources/application.properties" rename to 2-Dalston/zipkin-server-stream/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server/pom.xml" b/2-Dalston/zipkin-server/pom.xml similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server/pom.xml" rename to 2-Dalston/zipkin-server/pom.xml diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java" b/2-Dalston/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java" rename to 2-Dalston/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server/src/main/resources/application.properties" b/2-Dalston/zipkin-server/src/main/resources/application.properties similarity index 100% rename from "2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/zipkin-server/src/main/resources/application.properties" rename to 2-Dalston/zipkin-server/src/main/resources/application.properties diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/src/main/java/com/didispace/Application.java" "b/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/src/main/java/com/didispace/Application.java" deleted file mode 100644 index a2e140c3..00000000 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/config-server-git/src/main/java/com/didispace/Application.java" +++ /dev/null @@ -1,15 +0,0 @@ -package com.didispace; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.config.server.EnableConfigServer; - -@EnableConfigServer -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); - } - -} diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/java/com/didispace/DcController.java" "b/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/java/com/didispace/DcController.java" deleted file mode 100644 index 4a90799a..00000000 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/java/com/didispace/DcController.java" +++ /dev/null @@ -1,27 +0,0 @@ -package com.didispace; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author 翟永超 - * @create 2017/4/15. - * @blog http://blog.didispace.com - */ -@RestController -public class DcController { - - @Autowired - DiscoveryClient discoveryClient; - - @GetMapping("/dc") - public String dc() { - String services = "Services: " + discoveryClient.getServices(); - System.out.println(services); - return services; - } - -} diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/resources/application.properties" "b/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/resources/application.properties" deleted file mode 100644 index 1e9d1d4c..00000000 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-client/src/main/resources/application.properties" +++ /dev/null @@ -1,5 +0,0 @@ -spring.application.name=consul-client -server.port=2001 - -spring.cloud.consul.host=localhost -spring.cloud.consul.port=8500 diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/resources/application.properties" "b/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/resources/application.properties" deleted file mode 100644 index 95c1be20..00000000 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/consul-consumer/src/main/resources/application.properties" +++ /dev/null @@ -1,7 +0,0 @@ -spring.application.name=consul-consumer -server.port=2101 - -spring.cloud.consul.host=localhost -spring.cloud.consul.port=8500 - -logging.file=${spring.application.name}.log diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/DcClient.java" "b/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/DcClient.java" deleted file mode 100644 index cecb9745..00000000 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer-feign/src/main/java/com/didispace/DcClient.java" +++ /dev/null @@ -1,17 +0,0 @@ -package com.didispace; - -import org.springframework.cloud.netflix.feign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; - -/** - * @author 翟永超 - * @create 2017/6/24. - * @blog http://blog.didispace.com - */ -@FeignClient("eureka-client") -public interface DcClient { - - @GetMapping("/dc") - String consumer(); - -} diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/java/com/didispace/Application.java" "b/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/java/com/didispace/Application.java" deleted file mode 100644 index 72e9100d..00000000 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/eureka-consumer/src/main/java/com/didispace/Application.java" +++ /dev/null @@ -1,22 +0,0 @@ -package com.didispace; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.context.annotation.Bean; -import org.springframework.web.client.RestTemplate; - -@EnableDiscoveryClient -@SpringBootApplication -public class Application { - - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); - } - -} diff --git "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/pom.xml" "b/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/pom.xml" deleted file mode 100644 index 487b8271..00000000 --- "a/2-Dalston\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/hystrix-dashboard/pom.xml" +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - com.didispace - hystrix-dashboard - 0.0.1-SNAPSHOT - jar - - hystrix-dashboard - - - org.springframework.cloud - spring-cloud-starter-parent - Dalston.SR1 - - - - - UTF-8 - UTF-8 - 1.8 - - - - - org.springframework.cloud - spring-cloud-starter-hystrix - - - org.springframework.cloud - spring-cloud-starter-hystrix-dashboard - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - From c2758585602ee05621dc5afad027824e314c7d15 Mon Sep 17 00:00:00 2001 From: Dab Date: Thu, 8 Mar 2018 16:50:17 +0800 Subject: [PATCH 02/12] commit : zuul --- .gitignore | 131 ++++++++++++++++++ .../Chapter1-1-1/compute-service/pom.xml | 0 .../didispace/ComputeServiceApplication.java | 0 .../com/didispace/web/ComputeController.java | 0 .../src/main/resources/application.properties | 0 .../java/com/didispace/ApplicationTests.java | 0 .../Chapter1-1-1/eureka-server/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/application.properties | 0 .../Chapter1-1-2/eureka-feign/pom.xml | 0 .../java/com/didispace/FeignApplication.java | 0 .../com/didispace/service/ComputeClient.java | 0 .../com/didispace/web/ConsumerController.java | 0 .../src/main/resources/application.properties | 0 .../Chapter1-1-2/eureka-ribbon/pom.xml | 0 .../java/com/didispace/RibbonApplication.java | 0 .../com/didispace/web/ConsumerController.java | 0 .../src/main/resources/application.properties | 0 .../Chapter1-1-3/compute-service/pom.xml | 0 .../didispace/ComputeServiceApplication.java | 0 .../com/didispace/web/ComputeController.java | 0 .../src/main/resources/application.properties | 0 .../java/com/didispace/ApplicationTests.java | 0 .../Chapter1-1-3/eureka-feign/pom.xml | 0 .../java/com/didispace/FeignApplication.java | 0 .../com/didispace/service/ComputeClient.java | 0 .../service/ComputeClientHystrix.java | 0 .../com/didispace/web/ConsumerController.java | 0 .../Chapter1-1-3/eureka-ribbon/pom.xml | 0 .../java/com/didispace/RibbonApplication.java | 0 .../com/didispace/service/ComputeService.java | 0 .../com/didispace/web/ConsumerController.java | 0 .../Chapter1-1-3/eureka-server/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/application.properties | 0 .../Chapter1-1-4/config-client/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../com/didispace/web/TestController.java | 0 .../src/main/resources/bootstrap.properties | 0 .../config-repo/didispace-dev.properties | 0 .../config-repo/didispace-prod.properties | 0 .../config-repo/didispace-test.properties | 0 .../config-repo/didispace.properties | 0 .../Chapter1-1-4/config-server/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/application.properties | 0 .../main/resources/didispace-dev.properties | 0 .../main/resources/didispace-prod.properties | 0 .../main/resources/didispace-test.properties | 0 .../src/main/resources/didispace.properties | 0 .../Chapter1-1-5/api-gateway/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../com/didispace/filter/AccessFilter.java | 0 .../src/main/resources/application.properties | 0 .../Chapter1-1-5/eureka-server/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/application.properties | 0 .../Chapter1-1-5/service-A/pom.xml | 0 .../didispace/ComputeServiceApplication.java | 0 .../com/didispace/web/ComputeController.java | 0 .../src/main/resources/application.properties | 0 .../java/com/didispace/ApplicationTests.java | 0 .../Chapter1-1-5/service-B/pom.xml | 0 .../didispace/ComputeServiceApplication.java | 0 .../com/didispace/web/ComputeController.java | 0 .../src/main/resources/application.properties | 0 .../java/com/didispace/ApplicationTests.java | 0 .../Chapter1-1-6/compute-service/pom.xml | 0 .../didispace/ComputeServiceApplication.java | 0 .../com/didispace/web/ComputeController.java | 0 .../src/main/resources/application.properties | 0 .../java/com/didispace/ApplicationTests.java | 0 .../Chapter1-1-6/eureka-server/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../resources/application-peer1.properties | 0 .../resources/application-peer2.properties | 0 .../config-client-eureka-kafka/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../com/didispace/web/TestController.java | 0 .../src/main/resources/bootstrap.properties | 0 .../Chapter1-1-7/config-client-eureka/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../com/didispace/web/TestController.java | 0 .../src/main/resources/bootstrap.properties | 0 .../config-repo/didispace-dev.properties | 0 .../config-repo/didispace-prod.properties | 0 .../config-repo/didispace-test.properties | 0 .../config-repo/didispace.properties | 0 .../config-server-eureka-kafka/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/application.properties | 0 .../main/resources/didispace-dev.properties | 0 .../main/resources/didispace-prod.properties | 0 .../main/resources/didispace-test.properties | 0 .../src/main/resources/didispace.properties | 0 .../Chapter1-1-7/config-server-eureka/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/application.properties | 0 .../main/resources/didispace-dev.properties | 0 .../main/resources/didispace-prod.properties | 0 .../main/resources/didispace-test.properties | 0 .../src/main/resources/didispace.properties | 0 .../Chapter1-1-8/config-client-eureka/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../com/didispace/web/TestController.java | 0 .../src/main/resources/bootstrap.properties | 0 .../config-repo/didispace-dev.properties | 0 .../config-repo/didispace-prod.properties | 0 .../config-repo/didispace-test.properties | 0 .../config-repo/didispace.properties | 0 .../Chapter1-1-8/config-server-eureka/pom.xml | 0 .../main/java/com/didispace/Application.java | 0 .../src/main/resources/application.properties | 0 .../main/resources/didispace-dev.properties | 0 .../main/resources/didispace-prod.properties | 0 .../main/resources/didispace-test.properties | 0 .../src/main/resources/didispace.properties | 0 2-Dalston/api-gateway/pom.xml | 1 + .../main/java/com/didispace/Application.java | 12 +- .../src/main/resources/application.yaml | 20 ++- 2-Dalston/eureka-client/pom.xml | 104 +++++++------- .../main/java/com/didispace/Application.java | 6 +- .../main/java/com/didispace/DcController.java | 2 +- .../src/main/resources/application.properties | 12 +- .../eureka-consumer-ribbon-hystrix/pom.xml | 5 + .../main/java/com/didispace/Application.java | 31 ++++- .../main/java/com/didispace/DcController.java | 9 +- .../main/java/com/didispace/DcController.java | 1 - .../src/main/resources/application.properties | 1 + .../com/didispace/TurbineApplication.java | 1 + .../src/main/resources/application.properties | 2 +- .../spring-cloud-starter-dalston-5-2-3.png | Bin 0 -> 67993 bytes 2-Dalston/turbine/pom.xml | 2 + .../com/didispace/TurbineApplication.java | 1 + .../src/main/resources/application.properties | 12 +- .../spring-cloud-starter-dalston-5-2-2.png | Bin 0 -> 65847 bytes 136 files changed, 270 insertions(+), 83 deletions(-) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/pom.xml" => 1-Brixton/Chapter1-1-1/compute-service/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java" => 1-Brixton/Chapter1-1-1/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/main/java/com/didispace/web/ComputeController.java" => 1-Brixton/Chapter1-1-1/compute-service/src/main/java/com/didispace/web/ComputeController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-1/compute-service/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java" => 1-Brixton/Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/eureka-server/pom.xml" => 1-Brixton/Chapter1-1-1/eureka-server/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/eureka-server/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-1/eureka-server/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/eureka-server/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-1/eureka-server/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/pom.xml" => 1-Brixton/Chapter1-1-2/eureka-feign/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/FeignApplication.java" => 1-Brixton/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/FeignApplication.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java" => 1-Brixton/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java" => 1-Brixton/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-2/eureka-feign/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/pom.xml" => 1-Brixton/Chapter1-1-2/eureka-ribbon/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java" => 1-Brixton/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java" => 1-Brixton/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-2/eureka-ribbon/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/pom.xml" => 1-Brixton/Chapter1-1-3/compute-service/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java" => 1-Brixton/Chapter1-1-3/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/main/java/com/didispace/web/ComputeController.java" => 1-Brixton/Chapter1-1-3/compute-service/src/main/java/com/didispace/web/ComputeController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-3/compute-service/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/test/java/com/didispace/ApplicationTests.java" => 1-Brixton/Chapter1-1-3/compute-service/src/test/java/com/didispace/ApplicationTests.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/pom.xml" => 1-Brixton/Chapter1-1-3/eureka-feign/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/FeignApplication.java" => 1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/FeignApplication.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java" => 1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClientHystrix.java" => 1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClientHystrix.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java" => 1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/pom.xml" => 1-Brixton/Chapter1-1-3/eureka-ribbon/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java" => 1-Brixton/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/service/ComputeService.java" => 1-Brixton/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/service/ComputeService.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java" => 1-Brixton/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-server/pom.xml" => 1-Brixton/Chapter1-1-3/eureka-server/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-server/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-3/eureka-server/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-server/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-3/eureka-server/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/pom.xml" => 1-Brixton/Chapter1-1-4/config-client/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-4/config-client/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/src/main/java/com/didispace/web/TestController.java" => 1-Brixton/Chapter1-1-4/config-client/src/main/java/com/didispace/web/TestController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/src/main/resources/bootstrap.properties" => 1-Brixton/Chapter1-1-4/config-client/src/main/resources/bootstrap.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace-dev.properties" => 1-Brixton/Chapter1-1-4/config-repo/didispace-dev.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace-prod.properties" => 1-Brixton/Chapter1-1-4/config-repo/didispace-prod.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace-test.properties" => 1-Brixton/Chapter1-1-4/config-repo/didispace-test.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace.properties" => 1-Brixton/Chapter1-1-4/config-repo/didispace.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/pom.xml" => 1-Brixton/Chapter1-1-4/config-server/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-4/config-server/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-4/config-server/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace-dev.properties" => 1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace-dev.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace-prod.properties" => 1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace-prod.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace-test.properties" => 1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace-test.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace.properties" => 1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/pom.xml" => 1-Brixton/Chapter1-1-5/api-gateway/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-5/api-gateway/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/src/main/java/com/didispace/filter/AccessFilter.java" => 1-Brixton/Chapter1-1-5/api-gateway/src/main/java/com/didispace/filter/AccessFilter.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-5/api-gateway/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/eureka-server/pom.xml" => 1-Brixton/Chapter1-1-5/eureka-server/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/eureka-server/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-5/eureka-server/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/eureka-server/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-5/eureka-server/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/pom.xml" => 1-Brixton/Chapter1-1-5/service-A/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/main/java/com/didispace/ComputeServiceApplication.java" => 1-Brixton/Chapter1-1-5/service-A/src/main/java/com/didispace/ComputeServiceApplication.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/main/java/com/didispace/web/ComputeController.java" => 1-Brixton/Chapter1-1-5/service-A/src/main/java/com/didispace/web/ComputeController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-5/service-A/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/test/java/com/didispace/ApplicationTests.java" => 1-Brixton/Chapter1-1-5/service-A/src/test/java/com/didispace/ApplicationTests.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/pom.xml" => 1-Brixton/Chapter1-1-5/service-B/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/main/java/com/didispace/ComputeServiceApplication.java" => 1-Brixton/Chapter1-1-5/service-B/src/main/java/com/didispace/ComputeServiceApplication.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/main/java/com/didispace/web/ComputeController.java" => 1-Brixton/Chapter1-1-5/service-B/src/main/java/com/didispace/web/ComputeController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-5/service-B/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/test/java/com/didispace/ApplicationTests.java" => 1-Brixton/Chapter1-1-5/service-B/src/test/java/com/didispace/ApplicationTests.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/pom.xml" => 1-Brixton/Chapter1-1-6/compute-service/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java" => 1-Brixton/Chapter1-1-6/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/main/java/com/didispace/web/ComputeController.java" => 1-Brixton/Chapter1-1-6/compute-service/src/main/java/com/didispace/web/ComputeController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-6/compute-service/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/test/java/com/didispace/ApplicationTests.java" => 1-Brixton/Chapter1-1-6/compute-service/src/test/java/com/didispace/ApplicationTests.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/pom.xml" => 1-Brixton/Chapter1-1-6/eureka-server/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-6/eureka-server/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/src/main/resources/application-peer1.properties" => 1-Brixton/Chapter1-1-6/eureka-server/src/main/resources/application-peer1.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/src/main/resources/application-peer2.properties" => 1-Brixton/Chapter1-1-6/eureka-server/src/main/resources/application-peer2.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/pom.xml" => 1-Brixton/Chapter1-1-7/config-client-eureka-kafka/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/web/TestController.java" => 1-Brixton/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/web/TestController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/src/main/resources/bootstrap.properties" => 1-Brixton/Chapter1-1-7/config-client-eureka-kafka/src/main/resources/bootstrap.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/pom.xml" => 1-Brixton/Chapter1-1-7/config-client-eureka/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/web/TestController.java" => 1-Brixton/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/web/TestController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/src/main/resources/bootstrap.properties" => 1-Brixton/Chapter1-1-7/config-client-eureka/src/main/resources/bootstrap.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace-dev.properties" => 1-Brixton/Chapter1-1-7/config-repo/didispace-dev.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace-prod.properties" => 1-Brixton/Chapter1-1-7/config-repo/didispace-prod.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace-test.properties" => 1-Brixton/Chapter1-1-7/config-repo/didispace-test.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace.properties" => 1-Brixton/Chapter1-1-7/config-repo/didispace.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/pom.xml" => 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-dev.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-dev.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-prod.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-prod.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-test.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-test.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/pom.xml" => 1-Brixton/Chapter1-1-7/config-server-eureka/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-dev.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-dev.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-prod.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-prod.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-test.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-test.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace.properties" => 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/pom.xml" => 1-Brixton/Chapter1-1-8/config-client-eureka/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/web/TestController.java" => 1-Brixton/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/web/TestController.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/src/main/resources/bootstrap.properties" => 1-Brixton/Chapter1-1-8/config-client-eureka/src/main/resources/bootstrap.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace-dev.properties" => 1-Brixton/Chapter1-1-8/config-repo/didispace-dev.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace-prod.properties" => 1-Brixton/Chapter1-1-8/config-repo/didispace-prod.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace-test.properties" => 1-Brixton/Chapter1-1-8/config-repo/didispace-test.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace.properties" => 1-Brixton/Chapter1-1-8/config-repo/didispace.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/pom.xml" => 1-Brixton/Chapter1-1-8/config-server-eureka/pom.xml (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/java/com/didispace/Application.java" => 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/java/com/didispace/Application.java (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/application.properties" => 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/application.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-dev.properties" => 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-dev.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-prod.properties" => 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-prod.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-test.properties" => 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-test.properties (100%) rename "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace.properties" => 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace.properties (100%) create mode 100644 2-Dalston/turbine-amqp/src/main/resources/spring-cloud-starter-dalston-5-2-3.png create mode 100644 2-Dalston/turbine/src/main/resources/spring-cloud-starter-dalston-5-2-2.png diff --git a/.gitignore b/.gitignore index 0f69c283..51ba8fa5 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,134 @@ target 2-Dalston版教程示例/trace-2/build/bootstrap.json 2-Dalston版教程示例/trace-2/build/springAppName_IS_UNDEFINED.json 2-Dalston版教程示例/trace-2/build/trace-2.json +### Eclipse template + +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# CDT- autotools +.autotools + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ +cmake-build-release/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +/2-Dalston/eureka-consumer-ribbon/eureka-consumer-ribbon.iml +/2-Dalston/eureka-consumer-ribbon/target/ diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/pom.xml" b/1-Brixton/Chapter1-1-1/compute-service/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/pom.xml" rename to 1-Brixton/Chapter1-1-1/compute-service/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java" b/1-Brixton/Chapter1-1-1/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java" rename to 1-Brixton/Chapter1-1-1/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/main/java/com/didispace/web/ComputeController.java" b/1-Brixton/Chapter1-1-1/compute-service/src/main/java/com/didispace/web/ComputeController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/main/java/com/didispace/web/ComputeController.java" rename to 1-Brixton/Chapter1-1-1/compute-service/src/main/java/com/didispace/web/ComputeController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-1/compute-service/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-1/compute-service/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java" b/1-Brixton/Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java" rename to 1-Brixton/Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/eureka-server/pom.xml" b/1-Brixton/Chapter1-1-1/eureka-server/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/eureka-server/pom.xml" rename to 1-Brixton/Chapter1-1-1/eureka-server/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/eureka-server/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-1/eureka-server/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/eureka-server/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-1/eureka-server/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/eureka-server/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-1/eureka-server/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-1/eureka-server/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-1/eureka-server/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/pom.xml" b/1-Brixton/Chapter1-1-2/eureka-feign/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/pom.xml" rename to 1-Brixton/Chapter1-1-2/eureka-feign/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/FeignApplication.java" b/1-Brixton/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/FeignApplication.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/FeignApplication.java" rename to 1-Brixton/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/FeignApplication.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java" b/1-Brixton/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java" rename to 1-Brixton/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java" b/1-Brixton/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java" rename to 1-Brixton/Chapter1-1-2/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-2/eureka-feign/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-feign/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-2/eureka-feign/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/pom.xml" b/1-Brixton/Chapter1-1-2/eureka-ribbon/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/pom.xml" rename to 1-Brixton/Chapter1-1-2/eureka-ribbon/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java" b/1-Brixton/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java" rename to 1-Brixton/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java" b/1-Brixton/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java" rename to 1-Brixton/Chapter1-1-2/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-2/eureka-ribbon/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-2/eureka-ribbon/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-2/eureka-ribbon/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/pom.xml" b/1-Brixton/Chapter1-1-3/compute-service/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/pom.xml" rename to 1-Brixton/Chapter1-1-3/compute-service/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java" b/1-Brixton/Chapter1-1-3/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java" rename to 1-Brixton/Chapter1-1-3/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/main/java/com/didispace/web/ComputeController.java" b/1-Brixton/Chapter1-1-3/compute-service/src/main/java/com/didispace/web/ComputeController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/main/java/com/didispace/web/ComputeController.java" rename to 1-Brixton/Chapter1-1-3/compute-service/src/main/java/com/didispace/web/ComputeController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-3/compute-service/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-3/compute-service/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/test/java/com/didispace/ApplicationTests.java" b/1-Brixton/Chapter1-1-3/compute-service/src/test/java/com/didispace/ApplicationTests.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/compute-service/src/test/java/com/didispace/ApplicationTests.java" rename to 1-Brixton/Chapter1-1-3/compute-service/src/test/java/com/didispace/ApplicationTests.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/pom.xml" b/1-Brixton/Chapter1-1-3/eureka-feign/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/pom.xml" rename to 1-Brixton/Chapter1-1-3/eureka-feign/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/FeignApplication.java" b/1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/FeignApplication.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/FeignApplication.java" rename to 1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/FeignApplication.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java" b/1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java" rename to 1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClient.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClientHystrix.java" b/1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClientHystrix.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClientHystrix.java" rename to 1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/service/ComputeClientHystrix.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java" b/1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java" rename to 1-Brixton/Chapter1-1-3/eureka-feign/src/main/java/com/didispace/web/ConsumerController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/pom.xml" b/1-Brixton/Chapter1-1-3/eureka-ribbon/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/pom.xml" rename to 1-Brixton/Chapter1-1-3/eureka-ribbon/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java" b/1-Brixton/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java" rename to 1-Brixton/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/RibbonApplication.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/service/ComputeService.java" b/1-Brixton/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/service/ComputeService.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/service/ComputeService.java" rename to 1-Brixton/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/service/ComputeService.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java" b/1-Brixton/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java" rename to 1-Brixton/Chapter1-1-3/eureka-ribbon/src/main/java/com/didispace/web/ConsumerController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-server/pom.xml" b/1-Brixton/Chapter1-1-3/eureka-server/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-server/pom.xml" rename to 1-Brixton/Chapter1-1-3/eureka-server/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-server/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-3/eureka-server/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-server/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-3/eureka-server/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-server/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-3/eureka-server/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-3/eureka-server/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-3/eureka-server/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/pom.xml" b/1-Brixton/Chapter1-1-4/config-client/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/pom.xml" rename to 1-Brixton/Chapter1-1-4/config-client/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-4/config-client/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-4/config-client/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/src/main/java/com/didispace/web/TestController.java" b/1-Brixton/Chapter1-1-4/config-client/src/main/java/com/didispace/web/TestController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/src/main/java/com/didispace/web/TestController.java" rename to 1-Brixton/Chapter1-1-4/config-client/src/main/java/com/didispace/web/TestController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/src/main/resources/bootstrap.properties" b/1-Brixton/Chapter1-1-4/config-client/src/main/resources/bootstrap.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-client/src/main/resources/bootstrap.properties" rename to 1-Brixton/Chapter1-1-4/config-client/src/main/resources/bootstrap.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace-dev.properties" b/1-Brixton/Chapter1-1-4/config-repo/didispace-dev.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace-dev.properties" rename to 1-Brixton/Chapter1-1-4/config-repo/didispace-dev.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace-prod.properties" b/1-Brixton/Chapter1-1-4/config-repo/didispace-prod.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace-prod.properties" rename to 1-Brixton/Chapter1-1-4/config-repo/didispace-prod.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace-test.properties" b/1-Brixton/Chapter1-1-4/config-repo/didispace-test.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace-test.properties" rename to 1-Brixton/Chapter1-1-4/config-repo/didispace-test.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace.properties" b/1-Brixton/Chapter1-1-4/config-repo/didispace.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-repo/didispace.properties" rename to 1-Brixton/Chapter1-1-4/config-repo/didispace.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/pom.xml" b/1-Brixton/Chapter1-1-4/config-server/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/pom.xml" rename to 1-Brixton/Chapter1-1-4/config-server/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-4/config-server/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-4/config-server/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-4/config-server/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-4/config-server/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace-dev.properties" b/1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace-dev.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace-dev.properties" rename to 1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace-dev.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace-prod.properties" b/1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace-prod.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace-prod.properties" rename to 1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace-prod.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace-test.properties" b/1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace-test.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace-test.properties" rename to 1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace-test.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace.properties" b/1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-4/config-server/src/main/resources/didispace.properties" rename to 1-Brixton/Chapter1-1-4/config-server/src/main/resources/didispace.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/pom.xml" b/1-Brixton/Chapter1-1-5/api-gateway/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/pom.xml" rename to 1-Brixton/Chapter1-1-5/api-gateway/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-5/api-gateway/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-5/api-gateway/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/src/main/java/com/didispace/filter/AccessFilter.java" b/1-Brixton/Chapter1-1-5/api-gateway/src/main/java/com/didispace/filter/AccessFilter.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/src/main/java/com/didispace/filter/AccessFilter.java" rename to 1-Brixton/Chapter1-1-5/api-gateway/src/main/java/com/didispace/filter/AccessFilter.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-5/api-gateway/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/api-gateway/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-5/api-gateway/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/eureka-server/pom.xml" b/1-Brixton/Chapter1-1-5/eureka-server/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/eureka-server/pom.xml" rename to 1-Brixton/Chapter1-1-5/eureka-server/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/eureka-server/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-5/eureka-server/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/eureka-server/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-5/eureka-server/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/eureka-server/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-5/eureka-server/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/eureka-server/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-5/eureka-server/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/pom.xml" b/1-Brixton/Chapter1-1-5/service-A/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/pom.xml" rename to 1-Brixton/Chapter1-1-5/service-A/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/main/java/com/didispace/ComputeServiceApplication.java" b/1-Brixton/Chapter1-1-5/service-A/src/main/java/com/didispace/ComputeServiceApplication.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/main/java/com/didispace/ComputeServiceApplication.java" rename to 1-Brixton/Chapter1-1-5/service-A/src/main/java/com/didispace/ComputeServiceApplication.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/main/java/com/didispace/web/ComputeController.java" b/1-Brixton/Chapter1-1-5/service-A/src/main/java/com/didispace/web/ComputeController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/main/java/com/didispace/web/ComputeController.java" rename to 1-Brixton/Chapter1-1-5/service-A/src/main/java/com/didispace/web/ComputeController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-5/service-A/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-5/service-A/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/test/java/com/didispace/ApplicationTests.java" b/1-Brixton/Chapter1-1-5/service-A/src/test/java/com/didispace/ApplicationTests.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-A/src/test/java/com/didispace/ApplicationTests.java" rename to 1-Brixton/Chapter1-1-5/service-A/src/test/java/com/didispace/ApplicationTests.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/pom.xml" b/1-Brixton/Chapter1-1-5/service-B/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/pom.xml" rename to 1-Brixton/Chapter1-1-5/service-B/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/main/java/com/didispace/ComputeServiceApplication.java" b/1-Brixton/Chapter1-1-5/service-B/src/main/java/com/didispace/ComputeServiceApplication.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/main/java/com/didispace/ComputeServiceApplication.java" rename to 1-Brixton/Chapter1-1-5/service-B/src/main/java/com/didispace/ComputeServiceApplication.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/main/java/com/didispace/web/ComputeController.java" b/1-Brixton/Chapter1-1-5/service-B/src/main/java/com/didispace/web/ComputeController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/main/java/com/didispace/web/ComputeController.java" rename to 1-Brixton/Chapter1-1-5/service-B/src/main/java/com/didispace/web/ComputeController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-5/service-B/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-5/service-B/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/test/java/com/didispace/ApplicationTests.java" b/1-Brixton/Chapter1-1-5/service-B/src/test/java/com/didispace/ApplicationTests.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-5/service-B/src/test/java/com/didispace/ApplicationTests.java" rename to 1-Brixton/Chapter1-1-5/service-B/src/test/java/com/didispace/ApplicationTests.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/pom.xml" b/1-Brixton/Chapter1-1-6/compute-service/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/pom.xml" rename to 1-Brixton/Chapter1-1-6/compute-service/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java" b/1-Brixton/Chapter1-1-6/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java" rename to 1-Brixton/Chapter1-1-6/compute-service/src/main/java/com/didispace/ComputeServiceApplication.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/main/java/com/didispace/web/ComputeController.java" b/1-Brixton/Chapter1-1-6/compute-service/src/main/java/com/didispace/web/ComputeController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/main/java/com/didispace/web/ComputeController.java" rename to 1-Brixton/Chapter1-1-6/compute-service/src/main/java/com/didispace/web/ComputeController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-6/compute-service/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-6/compute-service/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/test/java/com/didispace/ApplicationTests.java" b/1-Brixton/Chapter1-1-6/compute-service/src/test/java/com/didispace/ApplicationTests.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/compute-service/src/test/java/com/didispace/ApplicationTests.java" rename to 1-Brixton/Chapter1-1-6/compute-service/src/test/java/com/didispace/ApplicationTests.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/pom.xml" b/1-Brixton/Chapter1-1-6/eureka-server/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/pom.xml" rename to 1-Brixton/Chapter1-1-6/eureka-server/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-6/eureka-server/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-6/eureka-server/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/src/main/resources/application-peer1.properties" b/1-Brixton/Chapter1-1-6/eureka-server/src/main/resources/application-peer1.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/src/main/resources/application-peer1.properties" rename to 1-Brixton/Chapter1-1-6/eureka-server/src/main/resources/application-peer1.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/src/main/resources/application-peer2.properties" b/1-Brixton/Chapter1-1-6/eureka-server/src/main/resources/application-peer2.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-6/eureka-server/src/main/resources/application-peer2.properties" rename to 1-Brixton/Chapter1-1-6/eureka-server/src/main/resources/application-peer2.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/pom.xml" b/1-Brixton/Chapter1-1-7/config-client-eureka-kafka/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/pom.xml" rename to 1-Brixton/Chapter1-1-7/config-client-eureka-kafka/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/web/TestController.java" b/1-Brixton/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/web/TestController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/web/TestController.java" rename to 1-Brixton/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/web/TestController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/src/main/resources/bootstrap.properties" b/1-Brixton/Chapter1-1-7/config-client-eureka-kafka/src/main/resources/bootstrap.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka-kafka/src/main/resources/bootstrap.properties" rename to 1-Brixton/Chapter1-1-7/config-client-eureka-kafka/src/main/resources/bootstrap.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/pom.xml" b/1-Brixton/Chapter1-1-7/config-client-eureka/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/pom.xml" rename to 1-Brixton/Chapter1-1-7/config-client-eureka/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/web/TestController.java" b/1-Brixton/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/web/TestController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/web/TestController.java" rename to 1-Brixton/Chapter1-1-7/config-client-eureka/src/main/java/com/didispace/web/TestController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/src/main/resources/bootstrap.properties" b/1-Brixton/Chapter1-1-7/config-client-eureka/src/main/resources/bootstrap.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-client-eureka/src/main/resources/bootstrap.properties" rename to 1-Brixton/Chapter1-1-7/config-client-eureka/src/main/resources/bootstrap.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace-dev.properties" b/1-Brixton/Chapter1-1-7/config-repo/didispace-dev.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace-dev.properties" rename to 1-Brixton/Chapter1-1-7/config-repo/didispace-dev.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace-prod.properties" b/1-Brixton/Chapter1-1-7/config-repo/didispace-prod.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace-prod.properties" rename to 1-Brixton/Chapter1-1-7/config-repo/didispace-prod.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace-test.properties" b/1-Brixton/Chapter1-1-7/config-repo/didispace-test.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace-test.properties" rename to 1-Brixton/Chapter1-1-7/config-repo/didispace-test.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace.properties" b/1-Brixton/Chapter1-1-7/config-repo/didispace.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-repo/didispace.properties" rename to 1-Brixton/Chapter1-1-7/config-repo/didispace.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/pom.xml" b/1-Brixton/Chapter1-1-7/config-server-eureka-kafka/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/pom.xml" rename to 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-dev.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-dev.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-dev.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-dev.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-prod.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-prod.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-prod.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-prod.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-test.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-test.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-test.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace-test.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/didispace.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/pom.xml" b/1-Brixton/Chapter1-1-7/config-server-eureka/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/pom.xml" rename to 1-Brixton/Chapter1-1-7/config-server-eureka/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-7/config-server-eureka/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-dev.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-dev.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-dev.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-dev.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-prod.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-prod.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-prod.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-prod.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-test.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-test.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-test.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace-test.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace.properties" b/1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-7/config-server-eureka/src/main/resources/didispace.properties" rename to 1-Brixton/Chapter1-1-7/config-server-eureka/src/main/resources/didispace.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/pom.xml" b/1-Brixton/Chapter1-1-8/config-client-eureka/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/pom.xml" rename to 1-Brixton/Chapter1-1-8/config-client-eureka/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/web/TestController.java" b/1-Brixton/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/web/TestController.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/web/TestController.java" rename to 1-Brixton/Chapter1-1-8/config-client-eureka/src/main/java/com/didispace/web/TestController.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/src/main/resources/bootstrap.properties" b/1-Brixton/Chapter1-1-8/config-client-eureka/src/main/resources/bootstrap.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-client-eureka/src/main/resources/bootstrap.properties" rename to 1-Brixton/Chapter1-1-8/config-client-eureka/src/main/resources/bootstrap.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace-dev.properties" b/1-Brixton/Chapter1-1-8/config-repo/didispace-dev.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace-dev.properties" rename to 1-Brixton/Chapter1-1-8/config-repo/didispace-dev.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace-prod.properties" b/1-Brixton/Chapter1-1-8/config-repo/didispace-prod.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace-prod.properties" rename to 1-Brixton/Chapter1-1-8/config-repo/didispace-prod.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace-test.properties" b/1-Brixton/Chapter1-1-8/config-repo/didispace-test.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace-test.properties" rename to 1-Brixton/Chapter1-1-8/config-repo/didispace-test.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace.properties" b/1-Brixton/Chapter1-1-8/config-repo/didispace.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-repo/didispace.properties" rename to 1-Brixton/Chapter1-1-8/config-repo/didispace.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/pom.xml" b/1-Brixton/Chapter1-1-8/config-server-eureka/pom.xml similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/pom.xml" rename to 1-Brixton/Chapter1-1-8/config-server-eureka/pom.xml diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/java/com/didispace/Application.java" b/1-Brixton/Chapter1-1-8/config-server-eureka/src/main/java/com/didispace/Application.java similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/java/com/didispace/Application.java" rename to 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/java/com/didispace/Application.java diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/application.properties" b/1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/application.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/application.properties" rename to 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/application.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-dev.properties" b/1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-dev.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-dev.properties" rename to 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-dev.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-prod.properties" b/1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-prod.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-prod.properties" rename to 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-prod.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-test.properties" b/1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-test.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-test.properties" rename to 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace-test.properties diff --git "a/1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace.properties" b/1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace.properties similarity index 100% rename from "1-Brixton\347\211\210\346\225\231\347\250\213\347\244\272\344\276\213/Chapter1-1-8/config-server-eureka/src/main/resources/didispace.properties" rename to 1-Brixton/Chapter1-1-8/config-server-eureka/src/main/resources/didispace.properties diff --git a/2-Dalston/api-gateway/pom.xml b/2-Dalston/api-gateway/pom.xml index e720d3b1..2d1fddc9 100644 --- a/2-Dalston/api-gateway/pom.xml +++ b/2-Dalston/api-gateway/pom.xml @@ -24,6 +24,7 @@ + org.springframework.cloud spring-cloud-starter-zuul diff --git a/2-Dalston/api-gateway/src/main/java/com/didispace/Application.java b/2-Dalston/api-gateway/src/main/java/com/didispace/Application.java index 225959c6..5e3b54be 100644 --- a/2-Dalston/api-gateway/src/main/java/com/didispace/Application.java +++ b/2-Dalston/api-gateway/src/main/java/com/didispace/Application.java @@ -4,6 +4,7 @@ import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; +/*使用@EnableZuulProxy注解开启Zuul的功能*/ @EnableZuulProxy @SpringCloudApplication public class Application { @@ -11,5 +12,14 @@ public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } - } +/* +服务网关是微服务架构中一个不可或缺的部分。 + +通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。 + +Spring Cloud Netflix中的Zuul就担任了这样的一个角色, + 为微服务架构提供了前门保护的作用, + 同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面, +使得服务集群主体能够具备更高的可复用性和可测试性。 +*/ \ No newline at end of file diff --git a/2-Dalston/api-gateway/src/main/resources/application.yaml b/2-Dalston/api-gateway/src/main/resources/application.yaml index 70865f2a..52796f30 100644 --- a/2-Dalston/api-gateway/src/main/resources/application.yaml +++ b/2-Dalston/api-gateway/src/main/resources/application.yaml @@ -7,15 +7,29 @@ server: zuul: routes: -# single-instance +# single-instance 单实例配置:通过一组zuul.routes..path与zuul.routes..url参数对的方式配置 api-a: path: /api-a/** url: http://localhost:2001/ -# multi-instance +# multi-instance 多实例配置:通过一组zuul.routes..path与zuul.routes..serviceId参数对的方式配置 +# 可以指定为任意的路由名称 + api-b: path: /api-b/** serviceId: api-b api-b: ribbon: - listOfServers: http://localhost:2001/, http://localhost:2002/ \ No newline at end of file + listOfServers: http://localhost:2001/, http://localhost:2002/ +# 由于存在多个实例,API网关在进行路由转发时需要实现负载均衡策略,于是这里需要Spring Cloud Ribbon的配合,Spring Cloud Zuul中自带了对Ribbon的依赖。 + + +# 除了使用path与serviceId映射的配置方式之外,还有一种更简洁的配置方式:zuul.routes.=,其中用来指定路由的具体服务名,用来配置匹配的请求表达式。 + +# 没有配置任何实例地址的情况下,外部请求经过API网关的时候,它是如何被解析并转发到服务具体实例的呢? +# 在Spring Cloud Netflix中,Zuul巧妙的整合了Eureka来实现面向服务的路由。 +# 实际上,我们可以直接将API网关也看做是Eureka服务治理下的一个普通微服务应用。 +# 它除了会将自己注册到Eureka服务注册中心上之外,也会从注册中心获取所有服务以及它们的实例清单。 +# 所以,在Eureka的帮助下,API网关服务本身就已经维护了系统中所有serviceId与实例地址的映射关系。 +# 当有外部请求到达API网关的时候,根据请求的URL路径找到最佳匹配的path规则,API网关就可以知道要将该请求路由到哪个具体的serviceId上去。 +# 由于在API网关中已经知道serviceId对应服务实例的地址清单,那么只需要通过Ribbon的负载均衡策略,直接在这些清单中选择一个具体的实例进行转发就能完成路由工作了。 diff --git a/2-Dalston/eureka-client/pom.xml b/2-Dalston/eureka-client/pom.xml index 24400c25..91413352 100644 --- a/2-Dalston/eureka-client/pom.xml +++ b/2-Dalston/eureka-client/pom.xml @@ -1,64 +1,64 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - com.didispace - eureka-client - 1.0.0 - jar + com.didispace + eureka-client + 1.0.0 + jar - eureka-client - Spring Cloud In Action + eureka-client + Spring Cloud In Action - - org.springframework.boot - spring-boot-starter-parent - 1.5.4.RELEASE - - + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + - - UTF-8 - 1.8 - + + UTF-8 + 1.8 + - - - org.springframework.cloud - spring-cloud-starter-eureka - + + + org.springframework.cloud + spring-cloud-starter-eureka + - - org.springframework.boot - spring-boot-starter-web - + + org.springframework.boot + spring-boot-starter-web + - - - - - + + + + + - - - - org.springframework.cloud - spring-cloud-dependencies - Dalston.SR1 - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.cloud + spring-cloud-dependencies + Dalston.SR1 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file diff --git a/2-Dalston/eureka-client/src/main/java/com/didispace/Application.java b/2-Dalston/eureka-client/src/main/java/com/didispace/Application.java index 6aabe56a..12318ec6 100644 --- a/2-Dalston/eureka-client/src/main/java/com/didispace/Application.java +++ b/2-Dalston/eureka-client/src/main/java/com/didispace/Application.java @@ -8,8 +8,8 @@ @SpringBootApplication public class Application { - public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); - } + public static void main(String[] args) { + new SpringApplicationBuilder(Application.class).web(true).run(args); + } } diff --git a/2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java b/2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java index 87a2ada8..6353357a 100644 --- a/2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java +++ b/2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java @@ -32,7 +32,7 @@ public String dc() throws InterruptedException{ }*/ @GetMapping("/dc") - public String dc(){ + public String dc() { String services = "Services: " + discoveryClient.getServices(); System.out.println(services); return services; diff --git a/2-Dalston/eureka-client/src/main/resources/application.properties b/2-Dalston/eureka-client/src/main/resources/application.properties index 933eeb4c..20186591 100644 --- a/2-Dalston/eureka-client/src/main/resources/application.properties +++ b/2-Dalston/eureka-client/src/main/resources/application.properties @@ -1,17 +1,9 @@ spring.application.name=eureka-client + server.port=2001 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ + #eureka.client.serviceUrl.defaultZone=http://peer1:1001/eureka/,http://peer2:1002/eureka/ logging.file=${spring.application.name}.log - -#eureka.instance.prefer-ip-address=true - -# -#eureka.client.healthcheck.enabled=true - -# ˿ -#eureka.instance.instance-id=${spring.application.name}:${random.int} -#server.port=0 -#server.port=${random.int[10000,19999]} diff --git a/2-Dalston/eureka-consumer-ribbon-hystrix/pom.xml b/2-Dalston/eureka-consumer-ribbon-hystrix/pom.xml index d71739f0..342c4193 100644 --- a/2-Dalston/eureka-consumer-ribbon-hystrix/pom.xml +++ b/2-Dalston/eureka-consumer-ribbon-hystrix/pom.xml @@ -48,6 +48,11 @@ org.springframework.cloud spring-cloud-starter-hystrix + + + org.springframework.cloud + spring-cloud-netflix-hystrix-amqp + diff --git a/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java index dd899e0f..7d069497 100644 --- a/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java +++ b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/Application.java @@ -40,8 +40,33 @@ public static void main(String[] args) { public @interface SpringCloudApplication { }*/ +/* +断路器的三个重要参数:快照时间窗、请求总数下限、错误百分比下限。 + +这个参数的作用分别是: + + 快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。 + + 请求总数下限:在快照时间窗内,必须满足请求总数下限才有资格根据熔断。 + 默认为20,意味着在10秒内,如果该hystrix命令的调用此时不足20次,即时所有的请求都超时或其他原因失败,断路器都不会打开。 + + 错误百分比下限:当请求总数在快照时间窗内超过了下限, + 比如发生了30次调用,如果在这30次调用中,有16次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%下限情况下,这时候就会将断路器打开。 +*/ /* -* -* -* */ \ No newline at end of file + 那么当断路器打开之后会发生什么呢?我们先来说说断路器未打开之前,对于之前那个示例的情况就是每个请求都会在当hystrix超时之后返回fallback, +每个请求时间延迟就是近似hystrix的超时时间,如果设置为5秒,那么每个请求就都要延迟5秒才会返回。当熔断器在10秒内发现请求总数超过20,并且错误百分比超过50%,这个时候熔断器打开。 +打开之后,再有请求调用的时候,将不会调用主逻辑,而是直接调用降级逻辑,这个时候就不会等待5秒之后才返回fallback。 +通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。 + + 在断路器打开之后,处理逻辑并没有结束,我们的降级逻辑已经被成了主逻辑,那么原来的主逻辑要如何恢复呢? +对于这一问题,hystrix也为我们实现了自动恢复功能。当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑, +当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题, +断路器继续进入打开状态,休眠时间窗重新计时。 + + 通过上面的一系列机制,hystrix的断路器实现了对依赖资源故障的端口、对降级策略的自动切换以及对主逻辑的自动恢复机制。 +这使得我们的微服务在依赖外部服务或资源的时候得到了非常好的保护,同时对于一些具备降级逻辑的业务需求可以实现自动化的切换与恢复, +相比于设置开关由监控和运维来进行切换的传统实现方式显得更为智能和高效。 + +*/ \ No newline at end of file diff --git a/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java index d7be3026..87f4b82b 100644 --- a/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java +++ b/2-Dalston/eureka-consumer-ribbon-hystrix/src/main/java/com/didispace/DcController.java @@ -20,12 +20,6 @@ public class DcController { @GetMapping("/consumer") public String dc() throws InterruptedException{ - - for (int i = 0; i < 20; i++) { - Thread.sleep(400); - consumerService.consumer(); - } - return consumerService.consumer(); } @@ -49,4 +43,5 @@ public String fallback() { } -} \ No newline at end of file +} + diff --git a/2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java b/2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java index e1acabf5..de5c8d25 100644 --- a/2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java +++ b/2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java @@ -29,5 +29,4 @@ public String dc() { System.out.println(url); return restTemplate.getForObject(url, String.class); } - } diff --git a/2-Dalston/eureka-consumer/src/main/resources/application.properties b/2-Dalston/eureka-consumer/src/main/resources/application.properties index 7ccc1a89..1d2990e0 100644 --- a/2-Dalston/eureka-consumer/src/main/resources/application.properties +++ b/2-Dalston/eureka-consumer/src/main/resources/application.properties @@ -1,4 +1,5 @@ spring.application.name=eureka-consumer + server.port=2101 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ diff --git a/2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java b/2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java index e4cd0209..18edc539 100644 --- a/2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java +++ b/2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java @@ -8,6 +8,7 @@ @Configuration @EnableAutoConfiguration +/*在应用主类中使用@EnableTurbineStream注解来启用Turbine Stream的配置。*/ @EnableTurbineStream @EnableDiscoveryClient public class TurbineApplication { diff --git a/2-Dalston/turbine-amqp/src/main/resources/application.properties b/2-Dalston/turbine-amqp/src/main/resources/application.properties index 8ae292e2..c986e94b 100644 --- a/2-Dalston/turbine-amqp/src/main/resources/application.properties +++ b/2-Dalston/turbine-amqp/src/main/resources/application.properties @@ -3,4 +3,4 @@ spring.application.name=turbine-amqp server.port=8989 management.port=8990 -eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ \ No newline at end of file +eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ diff --git a/2-Dalston/turbine-amqp/src/main/resources/spring-cloud-starter-dalston-5-2-3.png b/2-Dalston/turbine-amqp/src/main/resources/spring-cloud-starter-dalston-5-2-3.png new file mode 100644 index 0000000000000000000000000000000000000000..16a65eefcc5b0f44d0dceb842cef8d0eff7ea8e9 GIT binary patch literal 67993 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 literal 0 HcmV?d00001 diff --git a/2-Dalston/turbine/pom.xml b/2-Dalston/turbine/pom.xml index 4e6d77ef..6f5e796e 100644 --- a/2-Dalston/turbine/pom.xml +++ b/2-Dalston/turbine/pom.xml @@ -9,6 +9,7 @@ jar turbine + 对服务的Hystrix数据进行聚合展示 org.springframework.cloud @@ -24,6 +25,7 @@ + org.springframework.cloud spring-cloud-starter-turbine diff --git a/2-Dalston/turbine/src/main/java/com/didispace/TurbineApplication.java b/2-Dalston/turbine/src/main/java/com/didispace/TurbineApplication.java index 99556459..516e6678 100644 --- a/2-Dalston/turbine/src/main/java/com/didispace/TurbineApplication.java +++ b/2-Dalston/turbine/src/main/java/com/didispace/TurbineApplication.java @@ -8,6 +8,7 @@ @Configuration @EnableAutoConfiguration +/*使用@EnableTurbine注解开启Turbine*/ @EnableTurbine @EnableDiscoveryClient public class TurbineApplication { diff --git a/2-Dalston/turbine/src/main/resources/application.properties b/2-Dalston/turbine/src/main/resources/application.properties index 8367f619..3c6aca32 100644 --- a/2-Dalston/turbine/src/main/resources/application.properties +++ b/2-Dalston/turbine/src/main/resources/application.properties @@ -7,4 +7,14 @@ eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ turbine.app-config=eureka-consumer-ribbon-hystrix turbine.cluster-name-expression="default" -turbine.combine-host-port=true \ No newline at end of file +turbine.combine-host-port=true + +#参数说明 +# +#turbine.app-config 参数指定了需要收集监控信息的服务名; + +#turbine.cluster-name-expression 参数指定了集群名称为default,当我们服务数量非常多的时候,可以启动多个Turbine服务来构建不同的聚合集群, +# 而该参数可以用来区分这些不同的聚合集群,同时该参数值可以在Hystrix仪表盘中用来定位不同的聚合集群,只需要在Hystrix Stream的URL中通过cluster参数来指定; + +#turbine.combine-host-port 参数设置为true,可以让同一主机上的服务通过主机名与端口号的组合来进行区分, +# 默认情况下会以host来区分不同的服务,这会使得在本地调试的时候,本机上的不同服务聚合成一个服务来统计。 \ No newline at end of file diff --git a/2-Dalston/turbine/src/main/resources/spring-cloud-starter-dalston-5-2-2.png b/2-Dalston/turbine/src/main/resources/spring-cloud-starter-dalston-5-2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e5489e4d4ae02dc01c1309e68d8041269d43e8e8 GIT binary patch literal 65847 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 bdC1`gJXKNd`#SLz4c*+t`Z&e-T+F`#Uq}iA literal 0 HcmV?d00001 From a35e6b578f6d0ba9b4e331a6417b64ce084f104f Mon Sep 17 00:00:00 2001 From: Dab Date: Fri, 9 Mar 2018 17:54:57 +0800 Subject: [PATCH 03/12] =?UTF-8?q?commit=20:=20=E6=B6=88=E6=81=AF=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/didispace/AccessFilter.java | 25 +++- .../main/java/com/didispace/Application.java | 7 ++ 2-Dalston/stream-hello/pom.xml | 116 +++++++++--------- .../com/didispace/stream/SinkReceiver.java | 3 +- 4 files changed, 90 insertions(+), 61 deletions(-) diff --git a/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java b/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java index b9a4f478..4527f415 100644 --- a/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java +++ b/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/AccessFilter.java @@ -7,34 +7,53 @@ import javax.servlet.http.HttpServletRequest; -public class AccessFilter extends ZuulFilter { +/*网关服务的加入,外部客户端访问我们的系统已经有了统一入口,既然这些校验与具体业务无关,那何不在请求到达的时候就完成校验和过滤,而不是转发后再过滤而导致更长的请求延迟。 +同时,通过在网关中完成校验和过滤,微服务应用端就可以去除各种复杂的过滤器和拦截器了,这使得微服务应用的接口开发和测试复杂度也得到了相应的降低。 + +为了在API网关中实现对客户端请求的校验,我们将需要使用到Spring Cloud Zuul的另外一个核心功能:过滤器。 +Zuul允许开发者在API网关上通过定义过滤器来实现对请求的拦截与过滤,实现的方法非常简单,我们只需要继承ZuulFilter抽象类并实现它定义的四个抽象函数就可以完成对请求的拦截和过滤了。 + +可以根据自己的需要在服务网关上定义一些与业务无关的通用逻辑实现对请求的过滤和拦截,比如:签名校验、权限校验、请求限流等功能。 +*/ +public class AccessFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(AccessFilter.class); + /*filterType:过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。 + 这里定义为pre,代表会在请求被路由之前执行。*/ @Override public String filterType() { return "pre"; } + /*filterOrder:过滤器的执行顺序。 + 当请求在一个阶段中存在多个过滤器时,需要根据该方法返回的值来依次执行。*/ @Override public int filterOrder() { return 0; } + /*shouldFilter:判断该过滤器是否需要被执行。 + 这里我们直接返回了true,因此该过滤器对所有请求都会生效。 + 实际运用中我们可以利用该函数来指定过滤器的有效范围。*/ @Override public boolean shouldFilter() { return true; } + /*run:过滤器的具体逻辑。 + 这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由, + 然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码,当然我们也可以进一步优化我们的返回, + 比如,通过ctx.setResponseBody(body)对返回body内容进行编辑等。*/ @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); - log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString()); + log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString()); Object accessToken = request.getParameter("accessToken"); - if(accessToken == null) { + if (accessToken == null) { log.warn("access token is empty"); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); diff --git a/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/Application.java b/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/Application.java index 225959c6..a16ff102 100644 --- a/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/Application.java +++ b/2-Dalston/api-gateway-with-eureka/src/main/java/com/didispace/Application.java @@ -3,6 +3,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; +import org.springframework.context.annotation.Bean; @EnableZuulProxy @SpringCloudApplication @@ -12,4 +13,10 @@ public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } + /*创建具体的Bean启动该过滤器*/ + @Bean + public AccessFilter accessFilter() { + return new AccessFilter(); + } + } diff --git a/2-Dalston/stream-hello/pom.xml b/2-Dalston/stream-hello/pom.xml index e89263aa..1ed30bd2 100644 --- a/2-Dalston/stream-hello/pom.xml +++ b/2-Dalston/stream-hello/pom.xml @@ -1,60 +1,62 @@ - 4.0.0 - - com.didispace - stream-hello - 0.0.1-SNAPSHOT - jar - - stream-hello - Demo project for Spring Boot - - - org.springframework.boot - spring-boot-starter-parent - 1.5.9.RELEASE - - - - - UTF-8 - UTF-8 - 1.8 - - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - - - - - - - org.springframework.cloud - spring-cloud-dependencies - Dalston.SR4 - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + com.didispace + stream-hello + 0.0.1-SNAPSHOT + jar + + stream-hello + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Dalston.SR4 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java b/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java index 7f869b61..4f2879ea 100644 --- a/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java +++ b/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java @@ -6,6 +6,7 @@ import org.springframework.cloud.stream.annotation.StreamListener; import org.springframework.cloud.stream.messaging.Sink; +/*创建用于接收来自RabbitMQ消息的消费者SinkReceiver*/ @EnableBinding(Sink.class) public class SinkReceiver { @@ -13,7 +14,7 @@ public class SinkReceiver { @StreamListener(Sink.INPUT) public void receive(Object payload) { - logger.info("Received: " + payload); + logger.info("Received: " + payload.toString()); } } \ No newline at end of file From d67d8f65fa1a778302662a3021d6cc48a3c5a0f1 Mon Sep 17 00:00:00 2001 From: Dab Date: Fri, 9 Mar 2018 17:57:05 +0800 Subject: [PATCH 04/12] Signed-off-by: Dab --- .gitignore | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/.gitignore b/.gitignore index 51ba8fa5..e83dd770 100644 --- a/.gitignore +++ b/.gitignore @@ -147,3 +147,92 @@ hs_err_pid* /2-Dalston/eureka-consumer-ribbon/eureka-consumer-ribbon.iml /2-Dalston/eureka-consumer-ribbon/target/ +1-Brixton/Chapter1-1-1/compute-service/.classpath +1-Brixton/Chapter1-1-1/compute-service/.project +1-Brixton/Chapter1-1-1/eureka-server/.classpath +1-Brixton/Chapter1-1-1/eureka-server/.project +1-Brixton/Chapter1-1-2/eureka-feign/.classpath +1-Brixton/Chapter1-1-2/eureka-feign/.project +1-Brixton/Chapter1-1-2/eureka-ribbon/.classpath +1-Brixton/Chapter1-1-2/eureka-ribbon/.project +1-Brixton/Chapter1-1-4/config-client/.classpath +1-Brixton/Chapter1-1-4/config-client/.project +1-Brixton/Chapter1-1-4/config-server/.classpath +1-Brixton/Chapter1-1-4/config-server/.project +1-Brixton/Chapter1-1-5/api-gateway/.classpath +1-Brixton/Chapter1-1-5/api-gateway/.project +1-Brixton/Chapter1-1-5/service-A/.classpath +1-Brixton/Chapter1-1-5/service-A/.project +1-Brixton/Chapter1-1-5/service-B/.classpath +1-Brixton/Chapter1-1-5/service-B/.project +1-Brixton/Chapter1-1-7/config-client-eureka-kafka/.classpath +1-Brixton/Chapter1-1-7/config-client-eureka-kafka/.project +1-Brixton/Chapter1-1-7/config-client-eureka/.classpath +1-Brixton/Chapter1-1-7/config-client-eureka/.project +1-Brixton/Chapter1-1-7/config-server-eureka-kafka/.classpath +1-Brixton/Chapter1-1-7/config-server-eureka-kafka/.project +1-Brixton/Chapter1-1-7/config-server-eureka/.classpath +1-Brixton/Chapter1-1-7/config-server-eureka/.project +2-Dalston/config-server-git/.classpath +2-Dalston/config-server-git/.project +2-Dalston/consul-consumer/.classpath +2-Dalston/consul-consumer/.project +2-Dalston/eureka-consumer-feign-hystrix/.classpath +2-Dalston/eureka-consumer-feign-hystrix/.project +2-Dalston/eureka-consumer-ribbon/.classpath +2-Dalston/eureka-consumer-ribbon/.project +2-Dalston/eureka-feign-api/.classpath +2-Dalston/eureka-feign-api/.project +2-Dalston/eureka-feign-client/.classpath +2-Dalston/eureka-feign-client/.project +2-Dalston/eureka-feign-consumer/.classpath +2-Dalston/eureka-feign-consumer/.project +2-Dalston/hystrix-collapser-provider/.classpath +2-Dalston/hystrix-collapser-provider/.project +spring_cloud_in_action/.project +spring_cloud_in_action/api-gateway-consul/.classpath +spring_cloud_in_action/api-gateway-consul/.project +spring_cloud_in_action/api-gateway-dynamic-filter/.classpath +spring_cloud_in_action/api-gateway-dynamic-filter/.project +spring_cloud_in_action/api-gateway-dynamic-route/.classpath +spring_cloud_in_action/api-gateway-dynamic-route/.project +spring_cloud_in_action/api-gateway-exception/.classpath +spring_cloud_in_action/api-gateway-exception/.project +spring_cloud_in_action/config-client-eureka-rabbit/.classpath +spring_cloud_in_action/config-client-eureka-rabbit/.project +spring_cloud_in_action/config-server-eureka-rabbit/.classpath +spring_cloud_in_action/config-server-eureka-rabbit/.project +spring_cloud_in_action/consul-client-1/.classpath +spring_cloud_in_action/consul-client-1/.project +spring_cloud_in_action/eureka-server-ha/.classpath +spring_cloud_in_action/eureka-server-ha/.project +spring_cloud_in_action/feign-consumer/.classpath +spring_cloud_in_action/feign-consumer/.project +spring_cloud_in_action/hello-service-api/.classpath +spring_cloud_in_action/hello-service-api/.project +spring_cloud_in_action/hello-service/.classpath +spring_cloud_in_action/hello-service/.project +spring_cloud_in_action/rabbitmq-hello/.classpath +spring_cloud_in_action/rabbitmq-hello/.project +spring_cloud_in_action/ribbon-consumer/.classpath +spring_cloud_in_action/ribbon-consumer/.project +spring_cloud_in_action/spring-boot-hello/.classpath +spring_cloud_in_action/spring-boot-hello/.project +spring_cloud_in_action/stream-consumer/.classpath +spring_cloud_in_action/stream-consumer/.project +spring_cloud_in_action/stream-producer/.classpath +spring_cloud_in_action/stream-producer/.project +spring_cloud_in_action/trace-1/.classpath +spring_cloud_in_action/trace-1/.project +spring_cloud_in_action/trace-2/.classpath +spring_cloud_in_action/trace-2/.project +spring_cloud_in_action/trace-stream-1/.classpath +spring_cloud_in_action/trace-stream-1/.project +spring_cloud_in_action/trace-stream-2/.classpath +spring_cloud_in_action/trace-stream-2/.project +spring_cloud_in_action/zipkin-server-stream-mysql/.classpath +spring_cloud_in_action/zipkin-server-stream-mysql/.project +spring_cloud_in_action/zipkin-server-stream/.classpath +spring_cloud_in_action/zipkin-server-stream/.project +spring_cloud_in_action/zipkin-server/.classpath +spring_cloud_in_action/zipkin-server/.project From 0d86f74018530ee6a2b815c42b2081f1932417b7 Mon Sep 17 00:00:00 2001 From: Dab Date: Mon, 12 Mar 2018 18:02:15 +0800 Subject: [PATCH 05/12] Signed-off-by: Dab --- .../com/didispace/stream/SinkReceiver.java | 32 ++++++++++++++++-- .../src/main/resources/SCSt-with-binder.png | Bin 0 -> 6814 bytes 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 2-Dalston/stream-hello/src/main/resources/SCSt-with-binder.png diff --git a/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java b/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java index 4f2879ea..b1d5518f 100644 --- a/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java +++ b/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java @@ -7,14 +7,40 @@ import org.springframework.cloud.stream.messaging.Sink; /*创建用于接收来自RabbitMQ消息的消费者SinkReceiver*/ +/*@EnableBinding,该注解用来指定一个或多个定义了@Input或@Output注解的接口,以此实现对消息通道(Channel)的绑定。*/ +/*通过@EnableBinding(Sink.class)绑定了Sink接口,该接口是Spring Cloud Stream中默认实现的对输入消息通道绑定的定义*/ @EnableBinding(Sink.class) public class SinkReceiver { - private static Logger logger = LoggerFactory.getLogger(SinkReceiver.class); - + /*@StreamListener:该注解主要定义在方法上,作用是将被修饰的方法注册为消息中间件上数据流的事件监听器,注解中的属性值对应了监听的消息通道名。 + 在例子中,我们通过@StreamListener(Sink.INPUT)注解将receive方法注册为对input消息通道的监听处理器, + 所以当我们在RabbitMQ的控制页面中发布消息的时候,receive方法会做出对应的响应动作。*/ @StreamListener(Sink.INPUT) public void receive(Object payload) { logger.info("Received: " + payload.toString()); } -} \ No newline at end of file +} + +/*Sink 接口:实现绑定 input 通道 ;Source 接口:实现绑定 output 通道 ;Processor接口:结合 Sink 和 Source ;*/ +/*当我们需要为 @EnableBinding 指定多个接口来绑定消息通道的时候,可以这样定义:@EnableBinding(value = {Sink.class, Source.class}) */ + +/* +public interface Sink { + String INPUT = "input"; + + @Input(Sink.INPUT) + SubscribableChannel input(); +} +*/ +/* +public interface Source { + String OUTPUT = "output"; + + @Output(Source.OUTPUT) + MessageChannel output(); +} +*/ +/* + public interface Processor extends Source, Sink {} +*/ diff --git a/2-Dalston/stream-hello/src/main/resources/SCSt-with-binder.png b/2-Dalston/stream-hello/src/main/resources/SCSt-with-binder.png new file mode 100644 index 0000000000000000000000000000000000000000..39ed5d5cedf1eee4d5420d3d3ebe4f1154679b40 GIT binary patch literal 6814 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 Date: Wed, 14 Mar 2018 18:06:00 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E8=B7=9F=E8=B8=AA=EF=BC=88=E6=95=B4=E5=90=88zipkin?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + 2-Dalston/trace-1/pom.xml | 36 ++++++-- .../java/com/didispace/Trace1Application.java | 80 ++++++++++++++++++ .../java/com/didispace/TraceApplication.java | 42 --------- .../src/main/resources/application.properties | 17 +++- 2-Dalston/trace-2/pom.xml | 25 ++++++ .../java/com/didispace/Trace2Application.java | 55 ++++++++++++ .../java/com/didispace/TraceApplication.java | 32 ------- .../src/main/resources/application.properties | 21 ++++- .../src/main/resources/bootstrap.properties | 1 + .../src/main/resources/logback-spring.xml | 35 ++++---- 2-Dalston/zipkin-server-stream/pom.xml | 7 ++ .../java/com/didispace/ZipkinApplication.java | 4 +- .../src/main/resources/application.properties | 3 +- 2-Dalston/zipkin-server/pom.xml | 3 + .../java/com/didispace/ZipkinApplication.java | 22 +++++ .../main/resources/zipkin-architecture.png | Bin 0 -> 28034 bytes 17 files changed, 280 insertions(+), 105 deletions(-) create mode 100644 2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java delete mode 100644 2-Dalston/trace-1/src/main/java/com/didispace/TraceApplication.java create mode 100644 2-Dalston/trace-2/src/main/java/com/didispace/Trace2Application.java delete mode 100644 2-Dalston/trace-2/src/main/java/com/didispace/TraceApplication.java create mode 100644 2-Dalston/trace-2/src/main/resources/bootstrap.properties create mode 100644 2-Dalston/zipkin-server/src/main/resources/zipkin-architecture.png diff --git a/.gitignore b/.gitignore index e83dd770..21bdfd4f 100644 --- a/.gitignore +++ b/.gitignore @@ -236,3 +236,5 @@ spring_cloud_in_action/zipkin-server-stream/.classpath spring_cloud_in_action/zipkin-server-stream/.project spring_cloud_in_action/zipkin-server/.classpath spring_cloud_in_action/zipkin-server/.project +/build/ +build/ diff --git a/2-Dalston/trace-1/pom.xml b/2-Dalston/trace-1/pom.xml index 03963e52..60d2d841 100644 --- a/2-Dalston/trace-1/pom.xml +++ b/2-Dalston/trace-1/pom.xml @@ -35,27 +35,51 @@ spring-cloud-starter-eureka + + org.springframework.cloud spring-cloud-starter-sleuth - org.springframework.cloud spring-cloud-starter-ribbon - - org.springframework.cloud - spring-cloud-sleuth-zipkin - - + net.logstash.logback logstash-logback-encoder 4.6 + + + + + + + org.springframework.cloud + spring-cloud-sleuth-stream + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + + diff --git a/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java b/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java new file mode 100644 index 00000000..bb896feb --- /dev/null +++ b/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java @@ -0,0 +1,80 @@ +package com.didispace; + +import org.apache.log4j.Logger; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@RestController +@EnableDiscoveryClient +@SpringBootApplication +public class Trace1Application { + + private final Logger logger = Logger.getLogger(getClass()); + +// @Bean +// public AlwaysSampler defaultSampler() { +// return new AlwaysSampler(); +// } + + @Bean + @LoadBalanced + RestTemplate restTemplate() { + return new RestTemplate(); + } + + @RequestMapping(value = "/info", method = RequestMethod.GET) + public String info() { + logger.info("======"); + return "trace-1,"+restTemplate().getForEntity("http://trace-2/info", String.class).getBody(); + } + + @RequestMapping(value = "/trace-1", method = RequestMethod.GET) + public String trace() { + logger.info("======"); + return restTemplate().getForEntity("http://trace-2/trace-2", String.class).getBody(); + } + + public static void main(String[] args) { + SpringApplication.run(Trace1Application.class, args); + } + +} +/* +-- 日志 +-- trace-1 +INFO [trace-1,f410ab57afd5c145,a9f2118fa2019684,false] 25028 --- [nio-9101-exec-1] ication$$EnhancerBySpringCGLIB$$d8228493 : ====== + +-- trace-2 +INFO [trace-2,f410ab57afd5c145,e9a377dc2268bc29,false] 23112 --- [nio-9102-exec-1] ication$$EnhancerBySpringCGLIB$$e6cb4078 : ====== +*/ + +/* +从上面的控制台输出内容中,我们可以看到多了一些形如[trace-1,f410ab57afd5c145,a9f2118fa2019684,false]的日志信息,而这些元素正是实现分布式服务跟踪的重要组成部分, + +它们每个值的含义如下: + 第一个值:trace-1,它记录了应用的名称,也就是 application.properties 中 spring.application.name 参数配置的属性。 + 第二个值:f410ab57afd5c145,Spring Cloud Sleuth 生成的一个ID,称为 Trace ID,它用来标识一条请求链路。一条请求链路中包含一个 Trace ID,多个 Span ID。 + 第三个值:a9f2118fa2019684,Spring Cloud Sleuth 生成的另外一个ID,称为 Span ID,它表示一个基本的工作单元,比如:发送一个HTTP请求。 + 第四个值:false,表示是否要将该信息输出到 Zipkin 等服务中来收集和展示。 + +上面四个值中的 Trace ID 和 Span ID 是 Spring Cloud Sleuth 实现分布式服务跟踪的核心。 +在一次服务请求链路的调用过程中,会保持并传递同一个 Trace ID,从而将整个分布于不同微服务进程中的请求跟踪信息串联起来, +以上面输出内容为例,trace-1 和 trace-2 同属于一个前端服务请求来源,所以他们的 Trace ID 是相同的,处于同一条请求链路中。 + +*/ + +/* +在工程中引入spring-cloud-starter-sleuth依赖之后, 它会自动的为当前应用构建起各通信通道的跟踪机制, +比如: + 通过诸如RabbitMQ、Kafka(或者其他任何Spring Cloud Stream绑定器实现的消息中间件)传递的请求; + 通过Zuul代理传递的请求; + 通过RestTemplate发起的请求; +*/ + diff --git a/2-Dalston/trace-1/src/main/java/com/didispace/TraceApplication.java b/2-Dalston/trace-1/src/main/java/com/didispace/TraceApplication.java deleted file mode 100644 index 31be0490..00000000 --- a/2-Dalston/trace-1/src/main/java/com/didispace/TraceApplication.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.didispace; - -import org.apache.log4j.Logger; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; - -@RestController -@EnableDiscoveryClient -@SpringBootApplication -public class TraceApplication { - - private final Logger logger = Logger.getLogger(getClass()); - -// @Bean -// public AlwaysSampler defaultSampler() { -// return new AlwaysSampler(); -// } - - @Bean - @LoadBalanced - RestTemplate restTemplate() { - return new RestTemplate(); - } - - @RequestMapping(value = "/trace-1", method = RequestMethod.GET) - public String trace() { - logger.info("======"); - return restTemplate().getForEntity("http://trace-2/trace-2", String.class).getBody(); - } - - public static void main(String[] args) { - SpringApplication.run(TraceApplication.class, args); - } - -} diff --git a/2-Dalston/trace-1/src/main/resources/application.properties b/2-Dalston/trace-1/src/main/resources/application.properties index 58d4d826..2dadc80a 100644 --- a/2-Dalston/trace-1/src/main/resources/application.properties +++ b/2-Dalston/trace-1/src/main/resources/application.properties @@ -1,11 +1,24 @@ spring.application.name=trace-1 server.port=9101 -eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/ +eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ -#spring.zipkin.base-url=http://localhost:9411 +## spring cloud sleuth 的跟踪信息,收集发送到zipkin,两种方式,选择其中一种时,需要注释不需要的引用,避免冲突。 +# 第一种方式:http方式 ; +# 第二种方式:消息中间件 ; + +## HTTP方式 实现时使用的 spring.zipkin.base-url 参数 +## 如果在zip-server应用中,我们将其端口设置为9411,并且均在本地调试的话,该参数也可以不配置,因为默认值就是http://localhost:9411 +# spring.zipkin.base-url=http://localhost:9411 + +## 去掉HTTP方式实现时使用的spring.zipkin.base-url参数,并根据实际部署情况,增加消息中间件的相关配置,比如下面这些关于RabbitMQ的配置信息 +spring.rabbitmq.host=localhost +spring.rabbitmq.port=5672 +spring.rabbitmq.username=springcloud +spring.rabbitmq.password=123456 #spring.sleuth.sampler.percentage=0.1 # log trace detail + #logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG \ No newline at end of file diff --git a/2-Dalston/trace-2/pom.xml b/2-Dalston/trace-2/pom.xml index b30ba5d0..c1b58d92 100644 --- a/2-Dalston/trace-2/pom.xml +++ b/2-Dalston/trace-2/pom.xml @@ -35,6 +35,8 @@ spring-cloud-starter-eureka + + org.springframework.cloud spring-cloud-starter-ribbon @@ -45,16 +47,39 @@ spring-cloud-starter-sleuth + net.logstash.logback logstash-logback-encoder 4.6 + + + + + + + org.springframework.cloud + spring-cloud-sleuth-stream + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + diff --git a/2-Dalston/trace-2/src/main/java/com/didispace/Trace2Application.java b/2-Dalston/trace-2/src/main/java/com/didispace/Trace2Application.java new file mode 100644 index 00000000..be91a07e --- /dev/null +++ b/2-Dalston/trace-2/src/main/java/com/didispace/Trace2Application.java @@ -0,0 +1,55 @@ +package com.didispace; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +@RestController +@EnableDiscoveryClient +@SpringBootApplication +public class Trace2Application { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @RequestMapping(value = "/info", method = RequestMethod.GET) + public String info() { + logger.info("======"); + return "trace-2"; + } + + @RequestMapping(value = "/trace-2", method = RequestMethod.GET) + public String trace(HttpServletRequest request) { + logger.info("======", request.getHeader("X-B3-TraceId"), request.getHeader("X-B3-SpanId")); + return "Trace"; + } + + public static void main(String[] args) { + SpringApplication.run(Trace2Application.class, args); + } +} + +/* +spring-cloud-starter-sleuth 组件会对该请求进行处理,在发送到trace-2之前sleuth会为在该请求的Header中增加实现跟踪需要的重要信息, +主要有下面这几个(通过查看 org.springframework.cloud.sleuth.Span 的源码获取): + X-B3-TraceId:一条请求链路(Trace)的唯一标识,必须值; + X-B3-SpanId:一个工作单元(Span)的唯一标识,必须值; + X-B3-ParentSpanId:标识当前工作单元所属的上一个工作单元,Root Span(请求链路的第一个工作单元)的该值为空; + X-B3-Sampled:是否被抽样输出的标志,1表示需要被输出,0表示不需要被输出; + X-Span-Name:工作单元的名称; +*/ + +/* +基于日志的分析系统,比如:ELK平台,它可以轻松的帮助我们来收集和存储这些跟踪日志,同时在需要的时候我们也可以根据Trace ID来轻松地搜索出对应请求链路相关的明细日志。 + +ELK平台主要有由 ElasticSearch、Logstash 和 Kiabana 三个开源免费工具组成: + Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 + Logstash 是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用。 + Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。 +*/ \ No newline at end of file diff --git a/2-Dalston/trace-2/src/main/java/com/didispace/TraceApplication.java b/2-Dalston/trace-2/src/main/java/com/didispace/TraceApplication.java deleted file mode 100644 index 559f1895..00000000 --- a/2-Dalston/trace-2/src/main/java/com/didispace/TraceApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.didispace; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; - -@RestController -@EnableDiscoveryClient -@SpringBootApplication -public class TraceApplication { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - @RequestMapping(value = "/trace-2", method = RequestMethod.GET) - public String trace(HttpServletRequest request) { - logger.info("======", - request.getHeader("X-B3-TraceId"), request.getHeader("X-B3-SpanId")); - return "Trace"; - } - - public static void main(String[] args) { - SpringApplication.run(TraceApplication.class, args); - } - -} diff --git a/2-Dalston/trace-2/src/main/resources/application.properties b/2-Dalston/trace-2/src/main/resources/application.properties index 9487296a..4d2e7ef4 100644 --- a/2-Dalston/trace-2/src/main/resources/application.properties +++ b/2-Dalston/trace-2/src/main/resources/application.properties @@ -1,11 +1,24 @@ spring.application.name=trace-2 server.port=9102 -eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/ +eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ + +## spring cloud sleuth 的跟踪信息,收集发送到zipkin,两种方式,选择其中一种时,需要注释不需要的引用,避免冲突。 +# 第一种方式:http方式 ; +# 第二种方式:消息中间件 ; + +## HTTP方式 实现时使用的 spring.zipkin.base-url 参数 +## 如果在zip-server应用中,我们将其端口设置为9411,并且均在本地调试的话,该参数也可以不配置,因为默认值就是http://localhost:9411 +# spring.zipkin.base-url=http://localhost:9411 + +# 消息中间件 的相关配置,比如下面这些关于RabbitMQ的配置信息 +spring.rabbitmq.host=localhost +spring.rabbitmq.port=5672 +spring.rabbitmq.username=springcloud +spring.rabbitmq.password=123456 -#spring.zipkin.base-url=http://localhost:9411 -# #spring.sleuth.sampler.percentage=0.5 -# + ## log trace detail + #logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG \ No newline at end of file diff --git a/2-Dalston/trace-2/src/main/resources/bootstrap.properties b/2-Dalston/trace-2/src/main/resources/bootstrap.properties new file mode 100644 index 00000000..e2be39cc --- /dev/null +++ b/2-Dalston/trace-2/src/main/resources/bootstrap.properties @@ -0,0 +1 @@ +spring.application.name=trace-1 \ No newline at end of file diff --git a/2-Dalston/trace-2/src/main/resources/logback-spring.xml b/2-Dalston/trace-2/src/main/resources/logback-spring.xml index a0551eee..929326c1 100644 --- a/2-Dalston/trace-2/src/main/resources/logback-spring.xml +++ b/2-Dalston/trace-2/src/main/resources/logback-spring.xml @@ -3,13 +3,15 @@ - + + ​ + - + @@ -22,19 +24,21 @@ ​ - - - - - - - - - - - + ​ - + ${LOG_FILE}.json @@ -44,7 +48,7 @@ - UTC + UTC+8 @@ -70,4 +74,5 @@ + \ No newline at end of file diff --git a/2-Dalston/zipkin-server-stream/pom.xml b/2-Dalston/zipkin-server-stream/pom.xml index 532d98a3..06ff5156 100644 --- a/2-Dalston/zipkin-server-stream/pom.xml +++ b/2-Dalston/zipkin-server-stream/pom.xml @@ -24,7 +24,14 @@ 1.8 + + org.springframework.cloud spring-cloud-sleuth-zipkin-stream diff --git a/2-Dalston/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java b/2-Dalston/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java index 14b2f49a..a9188172 100644 --- a/2-Dalston/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java +++ b/2-Dalston/zipkin-server-stream/src/main/java/com/didispace/ZipkinApplication.java @@ -3,10 +3,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.sleuth.zipkin.stream.EnableZipkinStreamServer; -import org.springframework.context.annotation.Bean; -import zipkin.server.EnableZipkinServer; -import zipkin.storage.SpanStore; +/*用消息代理收集,@EnableZipkinStreamServer注解*/ @EnableZipkinStreamServer @SpringBootApplication public class ZipkinApplication { diff --git a/2-Dalston/zipkin-server-stream/src/main/resources/application.properties b/2-Dalston/zipkin-server-stream/src/main/resources/application.properties index 280898fe..1c1e532e 100644 --- a/2-Dalston/zipkin-server-stream/src/main/resources/application.properties +++ b/2-Dalston/zipkin-server-stream/src/main/resources/application.properties @@ -1,11 +1,12 @@ spring.application.name=zipkin-server-stream server.port=9411 +# ϢмãЩRabbitMQϢ spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=springcloud spring.rabbitmq.password=123456 -#eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ +#eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ logging.file=${spring.application.name}.log \ No newline at end of file diff --git a/2-Dalston/zipkin-server/pom.xml b/2-Dalston/zipkin-server/pom.xml index 28c0a609..b445b4f0 100644 --- a/2-Dalston/zipkin-server/pom.xml +++ b/2-Dalston/zipkin-server/pom.xml @@ -24,6 +24,8 @@ 1.8 + + io.zipkin.java @@ -33,6 +35,7 @@ io.zipkin.java zipkin-autoconfigure-ui + diff --git a/2-Dalston/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java b/2-Dalston/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java index 011680d5..205311c8 100644 --- a/2-Dalston/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java +++ b/2-Dalston/zipkin-server/src/main/java/com/didispace/ZipkinApplication.java @@ -4,6 +4,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import zipkin.server.EnableZipkinServer; +/*用http方式收集,使用 @EnableZipkinServer 注解来启动Zipkin Server*/ @EnableZipkinServer @SpringBootApplication public class ZipkinApplication { @@ -13,3 +14,24 @@ public static void main(String[] args) { } } +/* +我们虽然已经能够利用ELK平台提供的收集、存储、搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利。 +但是,在ELK平台中的数据分析维度缺少对请求链路中各阶段时间延迟的关注,很多时候我们追溯请求链路的一个原因是为了找出整个调用链路中出现延迟过高的瓶颈源, +亦或是为了实现对分布式系统做延迟监控等与时间消耗相关的需求,这时候类似ELK这样的日志分析系统就显得有些乏力了。 +对于这样的问题,我们就可以引入 Zipkin 来得以轻松解决。 +*/ + +/* +Zipkin是Twitter的一个开源项目,它基于Google Dapper实现。 +我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。 +除了面向开发的API接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。 +*/ + +/* +Zipkin 的基础架构,它主要有4个核心组件构成: + Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的Span格式,以支持后续的存储、分析、展示等功能。 + Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。 + RESTful API:API组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。 + Web UI:UI组件,基于API组件实现的上层应用。通过UI组件用户可以方便而有直观地查询和分析跟踪信息。 +*/ + diff --git a/2-Dalston/zipkin-server/src/main/resources/zipkin-architecture.png b/2-Dalston/zipkin-server/src/main/resources/zipkin-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..60592238feaa589cdc1e825d05d580e0ef5120e7 GIT binary patch literal 28034 zcmeGEXIN8P7dDKBB8UjskR}~0AYD+ph%{-^q&ESPE+upbsEA4jrAZYCCR9bh&=sUA zC=hztbO=pKXd&>;fV%bB@AsbToZsh%AcgJc=D-(HTRC+(2;^-P<*wxs@SWm;vY|T! za>|47k7(o`t2YGVM5l67PS@LPahURju3p*@{rBJY?YR%ne#9)RH z)e{zk4}(V#67W&SNJ>xm+QU{y_$VeLA}lpX^e9+21d=ZoLH>Z~gyG zOl)#+^;ht~)wuLGp)9`5{ja;1hAaCU#maJu3%tv*OT)%`dV1oo@-G)ZXrv2+yZ63J5IN=FBl&mFJTOU z%yBgwXO_^_yg*`c75pkrA)pNjT5_!+jSYs77-+zwRfr%JP1~oG$^NsS1{(Y{t=u<= z*hJbBt_y>GZhL!?7P33$Pr*e(L{@w*Oq-~V_2*AO6aLViI=9QWjzD17%!ymB2N7Lv zdaVoj5xT}5eVmm3@1Oohkq85XXq%fCHAXPyviMA%gwAzx+d6E-3z!%7GFvBCaCQh; z)IqRcL^@_?$R0KxPTNBKY|f{miKeJL7HMCP-7g+`UPG>-JOTpx`h_N1G*Ul;FzCDl z&vc~guT6i|ai9KzDm3$%qDALw zvJRt+%N&#J9UQu%Vq&6`lNs^Q!d)_Y_Kwf9l*d92R|N^;;pNrw8u7_xl=RF;78F3s z$T(jCYr1|O*wRHeVN-|MZ`&r zN6lsLHAOP}zLE-+N|4HxjQCQyxX@o>-;-~+Bed$jS`|vo+__1z`_IpvOYu0K6J(-bG{U*D{wQ^KV>WrMl?lH5K0p6}s|qPNH?DbAm|Z8ArsxWT>oa%Q;9$+*e) z)e>>|l5RZ;RjIedh^e`cW6L2^l8pWo!e?PV`C zQqPwunqo$kjR82G+mDl9y}~L#@j9jto_OzTvS@p}1HXAq{!-;~jRt!|b*)sC)QtMo z;q2TzpZc&_{<`A~!jlzwnJ-_wcvHKNtJN2=ZTBdHK%Nr;`9F_V8?M-%eg(~l7PN}J zRF}A?SvDuMgtw_k+MTafE7A8NYOMS^6;^~ z>nr<@50Cir7{DQ%`T~`>rAlZ}bcgL+Z&CV)j8$W}MuPPQ8T}X;bH5lA(;az29{Bey z;N*ii*t$^GMhTCfs7;Z@gKdOIx1bxi&a`Y+`(iserRLHv#IaaBUNC+b>6ieU@&o>( zj^?LcJHoFM_XYj3_|BLY#Gh^i1sD95N~*F%?9tOiWM$)rDhY|E1-G-^0>*Ov4%qIX zizolD?&dE~1f0m9!Ri0vZvOfS-1cXP``e%WHNf9Lf!qGSbaev-h*Aa9!Xmv~BriHR zjMg6Ca;mi0Iw85*D=zt+RRLo;^d%#<{}^@)K4m`{Pm4hm@S@!%dvl!kb*tklMt93Xq)Al;yCjH!*&7eLr3Z6fC?ufBPf4$E%z-w0-W>ton1 zDnaXZK6`@`XY6ZTB;ksEZSUmZo_12~AY!qJS!YjKqq$3Ks&1+emX6Thcvy&#>_tEk zGjTIcj&`1rq^=78dT*QEMM;=ZXuQ9YpJj$1 zBrE$yI;MzB4y3Q;CRu6e_y?r3{e#Feu0XMV?Sjp&Znue+j#q&`XZhu;PoBO}jdWOT zFZE@n9zOsgLAOow^Ry^cy_&>6n3yl;9pSF*-mb8pp*_@-?{UzROY0mw$#)2uBlTx7= zc3^6h^E9&2*1IeUy!jh50g;iHyJ0rV=dIX^OYh~F(NOMY{hT!$%)>E@_72XyCR}kF z9p;-^bBVOi>|I@L{_4ZETPM!~9nP3NY4KVCcR|P4_?3j7DWcKE+-YI=LQbQLaY0RC z#TR7a2_P+qLKL;f`}_OWu|HP7Y|uoc?q#F95Ye9F7=@XaS>Fi3-QdNsNy0^+>|yN* zV=;DCDy%*#0u0Z@T|-Ws2Ep1wT*B=7-j?+9I|hp#xO3Eo#p&Im0!j9*?NH>q%yv79 zGsh17R`Blkw-JPkw%`4j)NTnZ6cckE%;1Q-=`Tz!_;`HNq^TX}n%^_y|EU)!3cA4qbWoID0z>G$r1Nt?5#e@#s+gh*a^{ zt%@qFMhic>a{wd7D92d`d@T#}?EUY1EkDqoMHpnWwLgU|vO+FpsTD1c+WQAMNA&Lm z5BTl9Upq<~0kBA<0^<7K>~$r=9{3wxqno!6XZCSvc`wA^qe9GZbyXyF;f5&`M{?rg z|1RF-8l|cygXE8qSWy9Csy67#DlN9@Gb{4y-UlgMa;*uUX{i>UF<#|jsqe5Ya`o0r z_sPW(i7nI$)OS8A)brY=V)So`M>-u!JVZ;&T_IxV-B4ffX8h&Hn}t3xKUUjh>fH)! zqNH-3NNra!N^FGOzC|3@yPAayFDh}bE^6;KfwBZ=5D>9K6y!ADz^GZjiLhbe^b|Me zCAh_Sc_4Ij0#lv^XRKFb$E4;sq;R^Fzjmx$fx>&UnH@gx7}gPd-)kju38VM5)n)18 z(+=wjJhKo^tR_j*6R~4)4nZ*k9+)?47fA`|?JtQjR56%4Uh(Wx*Lw=Ce>K*@K%(^R zrDl+i-6 zD_pl;weKqGy?({&$5G@em7u1hVP>RWniori|Dl`+b^ycW3kV2#c2?%yAfrdrM1}Lt zKHLKj?hb9LbvwM0;E|v+Dm|-5BWuKgL<7EG^{`D-<+oEO#VvlX}^8Bgo{?eh>DS#f`QAcwKtQ z=_H}%<+N&&(g^_)+@Yb^ zd)Eq{yE1quj}j`{ZWc}X%WY+mFc%aLq_5fRY3S+S3)r?U|8!hXTTWn>hNrH1>P1_j z$%BoDCIn3WeT8_nX<3V)wIegT%pVLa7hd2H#Ux(>YMEV*bD-|rCQ`KDym}$EnvL!! z{9aXR5;L+am7P(|;o;#)DRL{>v))MGAHUN_G_4;Hn%9(;=zN?Lr5jB&opqZ0@J7h> z@03|2rU08OMzIu3e|)Nx8;?^@6qFMc6%{xBLO|>H+EeEI6OyDf zM{5G~Y;1B$a#GJVWktyhyfxk6ZQ^Y*y>EGh{(U)CdUGi2>}7*!okT-}cWr&_n>v={ z^awu|M&`bUdu$|Mc4Jcy#R42_2s$`k!^-!fL2Y1lptDP{YklP7r)oz9o1YB!INLDY zySF@Sy%3E&z_Z?eG@jyOdJkN5hyCfQe7STwo+<*>K*}m-%?dg^)q*A zjVx`XMx{UJs8b#u-lwo)YbkqpT(Dztp-RA-U^?yidJ;A-OFWAy%1wcaUhw*2-`lJS zoDz%A%>tv+TiE&DBF;YLW_p0@kw|3csOpb+5PPfY(N@p&qvSHw7^AE{|nLi{F!GWd^iBPwDRCB(3xULCrOJu27>l7vAKy zAqm&5NzkJfu2Yue@FGCZ@9vWJmeF>1Nyw>nFKDEE(`Rsh^qe$I$g1(p>Z%(vS5;R_ zRjNw)&;xck&HySkL&K!BpGZIxR!@2@bTKDVEwFAtOy-qfO3 zv>@P_LvKB#VNB0;LRrw@{e7+647a5raeOr?IfbzEgXoiqO)P%-R?^|oCtvmS+`*R) zjWS2L`Y8Eys$8$w9PvZPa4MznEy`?9o)&fN6Vx*{&a2hD8#LzcQ&6CunWJB1hC%C_ zFM6J=%^wzo0%4yc{vu5ib*GjoZqVi>i781*gs9*)A+vDb{{d+>?W&5=}HE{^cHCxitC#e&6k_ijS6%$t=O-_G4eNN-B*wZ-d~}n}o>5N1CE$ z7mlEQCX4^Zuj!(9nHuU_hmoeb#w*Nz#pL4nr<_}&n+2QbFDOb*UY|e)!xmjteJ9-n z-XaO5ktG^jIitBPoUz>LWyNj%#lyz}1V?lpKoRL=9U|+UB`QKpWUO2X(Ch6E#7Yge zT><&UUdd09Gkup2QNaLv4WXD$?3_V#0cTq;JpN!F`N z$^HjMmN264=7X8i>&+~`!Rjy3(O)PuyW;sp1pN)Vj0_zOH2i8%YZ7JAryS|m)2O!t zZJrmZZdZejV{$f9*=-4-&7&%4cg61vA#iSr(-$~7+1pd6H}7xdF6RY@O=H^ke|%o+ zuHu{TUKJ?MquE$$Mns;IeiQkUdDYYn))lz>;@r%u^aA~;+N+wZwN;T#vR?y_^}jHk z*Jf|-**eSmztOYppL||`TE2Ke7uoh^M0N)GT0;AJ@LZUSxUXhEuCS_)X{CFhdtw;H)IZ)rwaC7UlBRyWh@Rv>c_ zxK|q!<&)m5rYoV{E48-%rb(D*e7xP?Ti1R+3BUw^GG!w8zS`fS?rMIRU)1WEx4Ifo zqq^iWplN^wxdpV69rk@ew)RjxL0eR7EM;8qhVoWdY{8_9@CdY`z_rQYBbyk`be;$_G;2agmK(U_1e=;{;d2FZ)aIC9U?qSLS7xQeYu>bTumTp zgf^tLdo4Ng!XRU+eW*aq_CP=HL&ZOGvHPm{@;6+GG+`!NpW~I`(R{;|!`@Q;Jpd^o za{%TP`FZsL=8VgNBecHmtm;_h%DiH{wofZ+g?B4`&~zTV)c*B|fKOV2n14okuZL8B zx2m7acYRy=vH!@R{$xYWOLD&CJeEM*)HeqUjE{QLM0wiq+dFz<-Qs+~H~s^*$1den zWq^d&X<-tF$YeS@FKBs;Ap{w`T!Va4Xl^aVA}bn*vxjD{R&^0y{I5VhOs;9BX+SaR zsrYR42d6yU{+E>Pyh@q>;%?a_Yl^)UUb;2LXKynnu`1qnRNJpfK8J&X>qTFWj4Y6U z4?fd+_3fIAUrRC_JR&6OR}B7@V=^!s_Q~Md)EiG&IJBS}4T@PoPvbDH9vbB= zf20~>Y?<2h$(JRug*$%qQh!dPBh_?0e-_Vnbn6jB@5h|jEP|1M>NXop+IM|+c1ZjC ziz@Pv#%*EW)v-wPG+C$PWMwb>KgqCaGw>Z~J17+*Oe;MNjq5{cdTlDc#>Z|#K2HE; z-I>TtMO^=}2PI;U6m{zo#%_FM#+dNQ=DLCcI;74`*w+=eSS~qAv~f+xT~B>rB}V8< zL(X~sy_g!VD+lnRJyo7MxH}$%_oRpb+ zPwJr!md{-pe@FnSiyt5tHM-#H^VevaduJJE+O}}3LzhJDni#PS@wAP%wPs^y0`B2L zF<~wm5=xJ+aU7;fw}-0e*en$2||s z%0yX#cAU(zDezy5@xs~XxMI&7qz%_0752MVhd zB1@+G8?sANEXp>`>VsgMIE;7b;Iw>|yv>5{DSHQ(cCv_I7r@ z&b3IBfVTF#se?=_S==3tEGqIUV>@;*tWuEN+nx0;P4p8grj+H~{&zNEgiZtKXSkP{ zEH^wmjmb$c(~gLUka!=?B5kxkPbJtC#j4*SgS%{bp7>|vxE{0;x@O~%9VftEhc~Py zWGO$!>Y=xPAoKEc)@C~N39XNs^j%)dEEK9ArDQ97OZaZX(S!Dl>OGKG=|xGcHbXlW zxySCc#Bw96s!|}QpT|EWUz*0^gfAMjox^st$+o8JVY`>}idv%^0oMsghpE zu3XJL29bNSx2I%6!m z0^~_|&uO`~;L|`81>4G7G#i3@L{8H)rljad%_@_h>t0~+cD&+biX+LF9qc^1Ge=bq z!8AY!UFX67?`iteUQx~G^ETLVAEe10xC)A4Q)BX zw(!yTmMiaY%eCgqnu<59yKmlzyj1t0W6%^uqoE8%Wv+&FL?@Fv_oi;AE0^@QG**gzgka~IRy{0RX zbdt9Q&;UjHu^HRcE(*D|^Vs2q7wNU;c&6DBX3}OsgfDnYP(% zO?Fj%kVFByfRkwK%#?fx+cFiF7&m=1UO?!frl!fWT$neoe%~lSVc?eEA-$Qh=fhst z0G0xQw4Jm#;RQM}(ZxSX((!5n$q5hG;o-P~9Xpia`>=+@DMiodhs zXp*pLJtIB9*&!eFjPwKDYx0vLy5~f-h3uV0{>ABGCL#ilK|JlQCda3zo z$M)I`*0l=1F}U-P2oBNF(#kxqnUU`>02Pg>bUqVNcID;UZ!=4+& z0JNSn5($95_#6@0b)lbyG6-?F>@RcIiOhmJ9C|6VSi0CdRAc9t>+{N!;-r{VtH?S4<*UAh; z&HD$<$t?0=aU)}r^s7? z;tpCL9$)al&R~3^xq9_0Imo3vL!_t6*dtY6^kV933{A~zM$Nzsqxp78rH~I`jt4@> z?-|H8LbhU$KE0%SQ}5J0MvcpwAxIsBm7^#1S%48#*0z|+NwwYYNMjb>`o)dll_n-i z`1+$*-Av$3Goa<~%~n@;$0_0^GSe{=IV|~=p5v|-F0D7~MnQyLyB4QCY2p=lq%Xfh zkemVNJOn`|fQf8H^9G5g4kPV17>VUg=If55{l~((-}Z_Z5o@v6WeY*O-7gUz|8%42 zNL`_6rAMY;ioir>>Bf7c@PK<}yr%3^JMsM+B{}XDM za9-g$&5q8lmiM2x7`(W3fz9YW?8p5sLWTPBI8BtvdDPNB=d6@uTlBnsl0FoV$T1Ub?1yV;2I+X zR=TYT#-ibnapK>H78gIQ-TL-xxg}3)>jsSU>gTAQPzSi)>Do^1ytwG}==#au^0$2U zdV=<|`#9s_L=I}spX>|vjL=K3?k#+wvqCSzv`R&FB?=y~{c)G&N!Usz{*lrvLMOrY zBy6mCCZn6#_iJB_z%)`IK*#(Ru}H0Vxss&J^w+>=<0lKLWtevF$9?yL0Bo6m!RIeFcK~Pq-py0J674r4{A{z zIk&539YNYn*dmZJJAc({(p#*VYizG9=kb!syC*BFIE?%D01H|?`GqwkPx8E`BlYyX zWF7nqMv#(%Ia9@SB1EgRVEn#7W>%FgnCP&04!8Ba#Z1^CYWy=zt{icy|L{*7Bk>S+I| z;x7AUI->It9zPzvK~bi;1Ch44KVf1`cWMdTjh+yemPxoF^*_5WYvA-1i>#T1TGLTiB_C1tA2CU)aAtn~RMGFefPgdwiZGHc+LOeN?!?upmu%; z1)!w?*s>Kyb2uB2dWUU2>f+I75%Ks|nO8{sWt@BYjj5#U9o&Yq7H)I<4L%*w**T19 zjuD_V3#D1sBBx%s-KNhk!s1s3igTs#Pj(8E&p}qi|2$IvOvf{aL(g$gm?P=zK{9Gy z7V&I9c=CwugG&OV2{w!Rw6vk6boetsT3`#no?SgCc<D0{{^RE--ry#b6-u^8ubY@7`%k@62ZHybYOV z;a&J<1QkY~+^qE;Ehr=ozm&37P^@T~t=5#L8iW{>R45fSb2U0ms5mw=9y&_OJaz7; zLw?KEh)8`D_0dx@zMD%0fOwSU;`ONcQwSw?(HV4w<_78bjIvq0{~>~|&uUc%0Jah) z)obMYST+)Q%Ox&=hR`4xEZ2m=2*B2#P~j)Qe;M3@2tGhnbu+>JWz#7Oi%xIf)VEfk ziFeYXW^X4?_ruW(4T+J`2@p=Shi6zG=L?E#-@h3?lBaUIwq zS>jY%!u)de(4h61&#IrE>g#`$uUYQOjat4Q+W@KO*kgN-93T;iNL^JU^iiQZ9tfca zq^5AI4$-=9)|7(YQ|wm>xXThhw)uQq+?8sP6%5pU#=`noQaYg(dHTHCZGqa|RcPkt zwlh+lxrHt6FJ8Pbp}RlnGbJV-$wih}oOYpQ08=AGsEKD1e`$#$4-e*?6=wD;1X@_I zGT;O02f;OIeMy!~drg*Q2E_9ceQIGDnZa267JHM8uRni?cXZ@4-Nac^fAYgvXR{EFL)-xUBEhrkuOg+>Azl7cPrH!KXMsPOa2YzK{M8Wqrle^}<%FQL%-|~1 z#b4g^6UMPF{9tsRRNGBdwzYKI$4BJQ#FNfJD}})^qL&K_df~|?Ro+_auf)`cK|SAo zb+UzdtPwyAcF`9wi-Up565}pV!VGP?-p-u1NN!(zU_{&h-vAzhhM%$+QrLZWq820y z_Me~A_8y_{I`hthK-jZtiqty|D6Jo!C$ZIKL}Q}(1w9+_y6m94lc{70R97>|PO7xW zPR}~*-(auGAEwRAvx+-oA;I*^x`I|TC?q{*qifE*+vTmG6g=ft#VK?H{z7`SnUfiJ zdK=_HQE`(HorSQiHR;W;9pKm7Kcw?`1jQiVTpW5Bc(4Y>$m*H*Jns~ORID&>X0%D^ zA9E+j?z+K}yaZBTn(SrJzAMqv*Uz2qNFQAhrvusTl7d%Qys7g{N9qKB>UA$ykJvNs z@L_rePRT45TrZkEgbcg1O-+YaL{b77Z2I{{9eOSY%vtw)j(s|U#pD$s0T~Z5Fkn&^wX{Vl36kEcV_mF7#VuI2BjM3yEVo@W-`PC16^>;w%d5As_Q zng>a_t@axTCv%m!`}DO@g`(Sw=3hS9cdbJ>ts~kp6V+`L$T>L6p~C= zopm>dz0xaI8kx|9^!U7ba&~U4&o-6d4Vh3y#UN`K$ci<0kE-#{v~k5iCh#b?`Y+_H z{uv|%tWffM^pX>SJmC;dy*FC)2ZG1YG|ntPclsCGTyx*|9)3_ymAaRxG8~9otl-o! zGQteue3t?qak+2V@Yj-ttbae7BsNiaa#kagIDCOqgHt@@{{CHnQ-EECGFeOxxk&7{ zDO|cR%4}dzr)>XRmNy zxVZF|?b-nsrLZUac2WM-!q30Uj_aA%7L`6@nOsWs+HsMcYgJ8|LEvm z+8i1+O^n$`=&VgyyW0*ag)mqgbN%T@>^C$#N5uay_g)@T_+rw3{_J=z2jF$#O&(aK ze5ELsostX37%aF*n;C-&^UZ7bDxxR&Z^oaD0gICo3*frx94Eg2PPTs;kRMWwCDwqK z?fN$5YIe%snpEXsEbtC9Y)!gHe=1O$6Rh?>V(r>6LFT#FzDQx6avPPXTM+UB=9fsM z$TNGO#IzRLPS1vZW;YfoCMwYWWR6Ho}h9!`NlnoO;uFp z=blT}&PPxgqaF*}>g=yDe|fBiBpi9`dT1W#C^vo^pBlNU?8ab#I+w3Tp_=YI#Xo*E zqOQ4DxLOYGZo?QH6LXqD&b39xW^|R@sF1i6I)7&-zP*YFo_CU-!eZ6uoSVWW;_v{F z<$T{8YkvQ{FDLLg7H#l|b zCjAUaID?x_NksfM90O2B{k2keHe8HICY}g@2|3=^L1~X}txQ0DWPQw=JF;<%*^?Z! zVRQmZAJT`?0=K8Hz0JhO)p;;X<)-=aSlwTV<+V+c08Z!m0W1*A5pq9kVVwZ| zncY%Z(P$_yy1=kRk^BTZv-I2#{O*iwFD_o|VtI+zLZ46oRJgy!YuPN|@?e?M{D-?q z3#t+jXWJNv6)V$#t_;)M+a{K-^p{-bek~nUyHc$RoRc$}fg0S!ZOcJ^l0;85#}gnE zPtI{WVAn@AO<4lyd({Ks_ zEe-^a^qi+oxl~}b!-Xg5z$sBFjk^9D@{#(1gz|;_G(F2J`9Ja$<))iFYM)0ao-zWs z^`RV*Ul7|N7^@|X8c(epX+`S=x%LK}v=~rutx-$fsdr%@#D-SL=?0sZ>V#!o+OIp@ zqv<8~eLj%ARhI)qBfZ`|`gcCG^4!l>U=G0k&(-QSxB5P~POM*1+5AL15~krz@?6dJ zMX8CKp6s@N*81SY({ww(E9Z>w5>O1tHG&^WhG%llw$8k3<<9YoH~<|IB`rUP-5}rN ziDnev4g}(?gl#$fCC*=osaeXPF8{fe-L;N+QDgq3ThrCZG}1GhqRK5sg#guKnkvdq zTby{@D3VTyeaJk>8tw>XL~z!Lmu(LN8Bj^s#=%Cbjtg~H%!hs=5KcL^r^!;bAHZU% z($_Wr8ubK?*5z9{B_|0b1y^SsRBNi=$D=MSpE)OA)7>C`Uis9#@cfk7`X_}TJAD9n z9({Aez9DD~NL#$51#d(oZM{yG!9lT~cwNrCH%nQACvRg|{S$^@>kSMT)+N}G_rf-5 zV$Z;CFBdH@$c0eFdq4bsR!ImeRWzGi6CY9yQ#A!g7|c~}Dc-#a54sU#M>n(Cf7a?ckR8B$NoVtvG1UOAsBPwq7x)ERGxhNGF7pY1@R0!Iiyk z>-6Vs;b#OC=+!E6hG^Od&1(EBl`8$))HGh@0 zEM^8x3+8WWk%_%0{Vc%Dxtu=S0p0&k10xFp_r36(V(_f>`sfcaWv{M^Q0M|EJuN z3%y+^yQ*Y0Q&kD%CMC5=D|&ZL*fh$;*BlGmo|<1;+a4dYUtVoOul9y|Ir`1#Y&c13 zm!k%s$jYb%pcY)QpF78p9re8|weBjo0P|ZROkRVYw&{asO$Xt5%Yvd7BSRWZ>;Hs_ zNQ^ciK$cqn%m$&j;Gao#z<2vUB+ZYycE5W5oX>INeKRG4XvPZX73ijTE!Ix2dd9HS zVY@HV$zg9R8@V@b2(`qCFb_6HFe3_=(y|K|lHahL^XBU_8IqBc4g8q$oq4ckJ3keY+zn&X4fo@x$s(26Ky6lr3-s)>xaIUzM8==JFnKTBmG@LdFf4^)lw>^Id# zJik>UfwlgKP?ZP?v1G0F8V(o=IA04kp=hp@m6u&Qw>QXgag^9+dQm zw5h|!m-!`kyC$ycDCxYyh_Za+YZ@+bgF{Xe>5Mr_Hib)pccib)8U-PSu=zF1lI}$j z|CsDn1*Fqy?^g_Zw48Z&b;d&ijzDeax1C%hC*H(irq2bC$ zp5~(0XA0FRak-(Pc~l6ClHE;BMCDTL#+JVMxh&TGA1*~9$=|b-Fiu%%^!;zuF_ADv zq;suTwC|58I;;>jRl*QED_z_bFw}a!uA4bI&i;xFj{7Jmb%I(nqjEvtUMz4wU-!LJ zR#y7s7n*3q`MW0EFEx<-PvwTB2UJ)zs$3TGUlClJEKJ$}9|iMP#;@zsV8H2;F8n7R z3c=bftQ7{f?h!RN#vgU*6@-)X&gBsrvR}FC_ToR9zMHHO|DWq-PFOnKVNm{~_VX?9 zYdUA)SdbPFI(Nwl-s@|+=x26N=b+mDHxvEz>3<4)pYHG6dxh#syTk3!h#0|tv8-!k z+?o}HuIj*u;M<)kCRucxnKcDqS9W#(mpPET>c|@WdYgg*mQrys;wi%kI znyx8WbH}ChPP&H?h1?&d`v0uLUaHg#v>hB58dO`RB2;A!fGAeuKogzc{b%gYuNuOd!y=%FuG1H4%6*bI-O&+RaOsKP{pW8(QXeqGi^Qd zGJ{gr{>g`IzYEp>m8wG?P7zH2C-UZMdYfoR^uU7_J6do);8*`ZS@^IVcA)l}@zbsK z$ex*;m!}QM@4bn~bp2i41~v180C$ibW!vd|9d*=!`sF4`Zc*@WtEEg+nq$PS1IEj* z_JZaA7OI~P4Cr=k4z^{?QJwr;UQTrE$?pk)h6Z!d#kAACzsu-rGNJhe z3ZiKvZ|uV?xZuwFYZAqm&;xq|TDSj@oug&Qb(C%l0@Ob~Z!^8D{L2ZUT^%p@hBBs2hZ?BLAbI3K!iSvgVm+L!~ z3(C<~ts}?Yiof{Rejg1I9n}GKMG1*>x>vZDi5}K>c&yVlc6gkbQT6EQ(amDiEYt?F zrk4+?Hy#6)wMpfepTJ!_o zYGjFpQBwY>om7bmVw!Pg_9XXj6NIdQ8dmHJK(*ObYwHbiGGgM-8>p|nN)~!eH=v&b z-J`pBj&D2&G*4$wSVVIX_%&Ne@kK<&r6$sF#x~j8P@MS{vS)&MOLb~!5Bmsv#P)!= zL<7ZPAHD=IHe$U6uGd|82hQofmp67V09Go8UVPWcVZD%A_FHxuf(590{Qkg1Gmu*QKD0nl@x5oMST(N1z3=hQ^`BW<7jg-*WMl}+ z28V(!N|4fX1#e=k=Jd3*#)c>%u|E%*^t(&?1bqc(0Wx5b)$`^P)wmJ)rl3GiQyTk1!fo>D-iRJJgHgUbP}+7d z?spQ$DGk>7!bC+fHh@_TquciZj{@ELk~fua(V9zM0)Oh52_W<=ug^6nAzemm2qzsH z2P=4d!o6AU}{`F6`t42qEoW zsV!@5Q&()b?t=m_25>am`4%}9-G<~r$7D7pz;x6hi9lE#)TP*FZ@UMPKb2jH*l*aLc!4FTauE;6MT3cIv%aCJ+aj9{03W7vj zhf^{9HXXmowJka01Wo!=8QfR*$ zQF!=*^a8~tVPdYXHWS!ZJ*zI^Fv>q4A7Ncvbwwz|otxcSbWsXnXXj3kaXrIT9^pD7 z+ja45r+#c;98UIL&L}sYF>W1KA?DbZfxEWuvY-&u5_}o%m1~N!eifeYZCc@>62Ty% zNOkU7@kD~s9u_cUnp;acWc-GohA(vZg$SZ5`m$BxJlIq&gl*e&&urH2SDS@#?t8UV zGbWv@C)8PUYkbnP;BduJ{=qVr(L(2%?R)s9WxCp}5bCQ}hdp$fdQW`{;>s)u%^tI5 zR5>3&JIAY%uCl}Ld@*KG*e^RT@cCwqS?ASQN|u&xpFYrNCrJt{we4V;sq{Q0R;5#A z&2_V8e=<%}0>9c^iz1~5;`pRvX13&rQvB2gnnV33uUj881UVWSbgMGc+f36r^)=&W z5}-n$hCQEnx6E_VsG4qkqUd55^xnTLTXaR8cT;M4UN8M4w zqIZFKUvLTo2D(|MW;KR^C%cp$TR-npVhzYHa~?*f1@72Mi)uWKe-Vvu3#h97@l(hk}ih*$(D4&Rx6?@myV5)q+tHIg~9v25$$#k7W9+z%nAfh$-Ledl}G zo7loOLTOkFVRJUp;c7y0RESbX;Y;M;#C&b33A2h4Xe}^ z?M7LkzQsPKXUAvJnR&~Z+lk>}s~jUo1!bBqKFMc@p{~J=MFVe*nUUQ`?LA_5P$8V6 z!c)dS+dbu@WKm_!pG$gnoBQRAg!hjOYU&Ylo~z-_uW@|FWwV(&6!c3uuck`wP9|Dw zydh;z09A(dKnC>~2p6mOrNPOS)wV_E%$N+W{R&1$ihMm*tw7)&B9{eHoo#%kRm00 z9@l6IWhT@}W}XbIZ+7UJTD zewuyF;lJJ7fa(Z%PYB?aK@>vUSqQ$5%aos}5np$USZx(hp3X3rm&~+>=8l^Sdoh~= z$|J%$rus3}rtOes3*N@E#-ERsn>~HFx7=lPerbl!Cp zw97Yo?{oga0ps>_^H~MNXs!4&vJ*+)6@mF2zHy|*-+Vd6oXu|5@+XarAPly-Ee3GOYN#ji!D~-| z#FZr^QV9e7d~pTjsi?#Z_zrmvP#ENdgGakaRs`hC>4Qp34#(WVc)!L69C3bSiNHp1 z$!=z9(66^O#71h^-g_VOo4j^63!LoBiks^Js4RmwpmK#8R`WZ;O)~tBE{;cl-0bDIO-#R|v1rknM6dSc$JxUwY&)v>~_o zi#a!hgTOICn`+1^e>*FLT5|25cuDyKiGnI7lA*t*)bpkTJagcPYA^Y z_q}0iep+=}-{BCP6y)~tpDLnO#can@!ILeR#!2z(r4)dPnDj&BRDmEkJ=FIHC6eQ` zgwyw9S$Ll);64vteFHfa*$$40--nG@9gM?v`>NwbeOPsk2|gk5<+(1HseYlo@jwbE zAB%@`7Of&~jfI4us&#Iz#xHgR;#u`ZVf#;a%)Z=;oNH=}e8Wh5{Ki?rRk(VNz(XG7 z!=(=?Z|t;T*zc~`-uc$b{Qa^Tli}SJ6|`eB@xBzT1(%@z)qC7c>skE7Um}=V(Xf|V zjP(xC`J$e4`sl9(?VJlYX22oe_p-}xf3q{?1a3(i4QJPEj#y&rrfcq5VUGHcRASyL@|O+v-j^=sudsmGwC^phOn8#B^m1jB?#u-7GqK^~ce z5T12l1jQ!b!nC7$t{|3c^ao_1x8QmVx8TP3LDD0MFhp)NvuMqo@|w!*7m!COe@(yw zl_AN0!TuE*W)Pr;pMg$cWDBG%FQXP4u@_F2kWF7;YOM^Y*4|%{H*A36t(>m^M-E^Y z?5%=SB!2I!~{}diRqS(RqIv1S*3r=aj`4kN_7R7y!(mfrjupsOuMesnmGt{AJO0 z2^zJCz{Fw*r-Macbj4R3W7qtkY9z>n;|NcpKj0D1PHJ1_C42vPoovtvRp+VBPSbp8 zr&1X~bkBay2A`}}RGLL?s;yo?N^dRjTZw|E#>+0E8zFHXzeMw|!HoB~x{|1Q*&L&H zp2J=1LRC}^>%egzUIv;IAAfz~z_{ckiGFUA0>U|HySuQT3QI8d?s*lRlXt@Q z9`A4R+IR2o$R!CiG>4FgrR0I5K221z55_8R&71hzEk#rHMb(XMI&cJS+;2Hx2-o78 zf^^UrF4vCKynWtoa$c!MYGz0tL9WBz;#XE z--=4mmfuW|x?HDx->}#sxB{fn9P<`W&?srZPXGrcUJwqTdsKrA6j@f*gDUj~mS9=k z1UW%|;Jr*5Mo(I3kM4iQ2s884q$2mH@L8A}R$(=xuu%^l+KZ8%kEtm*>NisL-7Ag4aF-xgUkj?3(%LH@-1{pd>HKDt|#1?JrQk|obaxK#(;eiOqr=j5O1NZF(~Kjc5~4ccx)H%SmbA&o~} zD4fNqT-*M>y77P$o4QGzmxWfxIAXSItKZxtPx7iM)E+hUUC|hG+LJP_eBD*o(N(@DoNg-M+;YHca7=GVJ zdVAkvpKYtplIUld}3R~;3}uj)CIM-uvM zJx+u&4^OA+s6DgynmUr;kufXgq{9#p;5S*`TQXLk6H_-`#G$eHy58Q0btBJdLa-oz z?`baCk?x!!Rio}qUK4yD`Gl_o;?0`W!Kj&ohiZOiG)r-YB+|+J$|oU#DBn~-9O-aX z)l<&celmM?7fABc@9j*ogIQpRem~1D(fjeU`Icvw#~JjwT!0o5A81A^TIUlo3~_uY zcZk~AncLW?gF=+NM<16F`Eb=n8+Z?B@hf^Y_?n6bOWNmm`z$Rk`01qlsksB&-M??R zy`z8V>{wUHNVC#J2b~YN{3-Idbd?llm*`Y6g!{wd?Kp0rv#q2OOvzrMAZKCOO#xi3a4~U2D@O9 z)SPc`!K1f-^yB2xJLpNCdB%NnH(9t9vk5?9nWf{*`Asg=+#Y3)QsxR9S)W35^fIrt|z#l+4ohgrP= zlKoCu0Am6e>JbXp1R9Q-tXyeZ;reo4|2HDtr(rROPMXzky*(}`_ml&Ko`#aroe zv&-3Pkv6P{&*0baJD@U#z03)(O-jtzBlY|Y zcZ%z9G$v(^wA+c&vg?PhjP62>ig7q4z?sBsCa4;&iGO9%(A9yPOSg!gP%YrFab8xP z4BAa53QVxEEp*u?E&q{xp6Wlu-l04fTfUHfIya4Z4#Iecj}17Z->!{4Oes z*}J%Otf9EGo0BiOHb}%KdD+4ax;=o zeq_^^C^s~yei^%CR|qS+{6(!`ck(6I_eJUx7SEz1LOuj7GiWMB0`Ki<(}EK!fYtH; zWKQ#BeU0C7EP8cUX8{ZkvtAr38Q{NiOv6*M@l>K)fM1OPqZY&2ivY!NX(yN0i|!nU13CRMOMbQExar-| zeaO_8jti7&KXOT7$NUM4Z0X;p>2ZDC(d)fcq;FC_2Sb??YL&lPt~Bd5kBt&P&C za3YGyvJd!veW@4EQDJ!W=rxcwbg7@hR4{-~H2y9$qPAgObi{OdzsmS^Hg=K5xgBZW z?T{Zk?DYMPLDSH2C)Z+HW%qgGhodRpx3v;$*j|#@lOrxJCVG!u;Ol4EwY=9`_5Ez( zo~G%z0^7t~Km~LSkbV_mHZ!hmrmJ z3#G*;?6)rH*3O?4&(xwcL_}0B)+`cxTUu0<9?$vP25Y8nqO5 zDsN+nh)8H)UdmWr9HQ-O%b&bFr{eJmsW_F~vrELDJk_j}HoMb8AvQOy!eXa&@tF-+ zX~cmCY{Oyiy`THqcQ`D42(4FQj##9R)rC?kZk!8;OKxEbcz<>MNL9ybUvz_IBd7RwT! z5{)DlD|PT^o$06J+jUhu&(vr6c?)wvM*$Pj?8-%JbPA&VQNn0EAj5OrH(>d?!A`C8 z(eOq#@6I7E+I=RYwMmbl2Y!%eIS-^)za!*4PlBveZw$}RUiC>q+1#mBRz)2 zhISXo4TfNFlyhM{yOv9%6P_9_=#Vq4Jp{xS1oh^g49^iZVau{`J{g*`hQZo$7)cyt zMC;=YEYvn0w6Q8b(bdOR&HW>5QRiwz1Qg!2V;$18{}CjD<2-rVMT_N$Xl( z>@#Dex~Z&vS&B@xBsSKqsSF}bDoB?kMD@P8618<~BLY+!khJqNB4z;MEBBiBoc5xJ zfJs9P@Ef3LYOszjt37}5l2bp^&aZ<`nBQnEBckNHNWyPX3|g* z>FXdQ#uzpjwrwd=)xEy2T_lM#GiDlma>II$BXkyYQ6P#6mYsP^bJY5dpc9^I413#- zWm2gPqikk?sIZf1u)w4stEzKP8Kb^L)D*9qJGHLr?_&+`zHiFMqSpqhD?m;8$D?J| zTU@#FS7+hbh@(N;Qz*zsZ(I%CKvQn@!XMMOZVP$|D*E!{0W>`c>$BhN0DrmutI=L= zuc5Cl_;A0=Lp-wI!f_qAOBu2WJ#q)kv@0Se9sQfV>3-g0in+YjW9wB{R0-8ZrFGDEaVtgbsH|F-_gvxH+S8FYoMmsJnd}p76V4kiU{Y`suWv>5<85e|?{vLei za0D4cT$jJwq)+$58NWN$K`|?#_tn*&d#MHQ<7Q&3xX)k`Jb^m#E8pCnSyMb;IR4GY zOf?3HWf#}RNCzdbJF04Z7{o^o&y0yc@P6YzjP#uM16r?tsJGU_N#YkbqJWf?Ns!nD zhxOrIuIr_j#b>Mn;}qT6q1XPoye0 zUN+Ak`BxtyZK#JjF|FFCtVwRgS^dhO@Qreqj8|Fm zc`IaluQ4E3pI@B+PJ|%t{nb++*?{tomR9d5we*^!>b7!l`zVgQ4Ai%sIwyRc-pjmD z#0bFLMr=I5Imsw`xp<-X!IbZ|fIa;W2P)g&JS)i;~_!kjxN2L$zq$DvV}8KZ5e-rj%)L~Z&z1hBEg%$6J=kuBMHSh zo+{0wrNG?BCT1~@BxHd_{LAbCXkYMAb zxOvM@yO1(1D{bqp>3}B0k&j?l*XjE(WkcDtAe@i_T2xjg=i@zfJDFbcKS8Ow#}A=9 zoQv&?41>~{udPQ7xxkaCGWGSX@NAl4I>VsN&;rYP{c>y6l5JkEM`TtLPqiL-8%u^Q+l#2ZiiTB=~36`5*s61mDh+2N49wXz&s2 zEc(fzf=CpXb?Z4ut@6R4MR=DrG1ri50h9`(W&$dvHKg~Ws2;2Oa<0cSx)QkOP)pWJ zQz?C-|E}~kL#3U;+Wl^qUbkDtz*c;|a4j+mHF%6*&~07N#+&F`U_5A+E4_IT7hCXQ z@)TcpNWjF|)V;l;)ho^+@**W?KRdD;9nPVbwI-6QI+xtpe%a`Acx&yNg=0BcRh7h%JD2(_W7tARL2)NkAvI{PkN2nbA$A zu0et!Bu7r^XGiUWzM*dma>^Bu40-}Ah!^@VH56@O%c+xz!aM*j-f85R5m00j$*W+T z=+m8f^LHiXK}MFY((KT<0CHOoT_HzI?P~ILK)?K+n%a#J4%|A-gPyzCdck_3dRC-x zW%%1L7#ZHl#p&Ufhc}1DIMOf9oX6)O2pttJ@Kp$0Ea#9giYV;2_ITy-=h@~v?sgjx z!Etn&?r2>k3|nS9I5<)+5IR|rFsOVXf_r9WX8b;p#8`#zIr;G*f;H%+dBO_SmW zK+3GZj^w4;w*_&@Ctx)m1yzqq&eXDOJXo+5*#x9QP`(Cjo0(DjWvfUY<*sdPF2v2z zs`>We^h&t*Ccw7B6}$A3-iW=>qCBd5zERnU`Y3|60H`*@j)pVc#G7O%*juFxA01{b1UPtikpN=PuH=c|W z?u;oEY7yh+zwLN1V7}1PG>sA#ULB?VyXd8A@LZ7>;3RPVMfRqS5Zqfj=pYW#0wOfvHlb+oPlO8;euK1!;Bj5aW zHDrX78oc(BuVlY*5gQBv?Jat~)D^+2Hob{hI!pPa1Cv%jxk$x1p2H zis^d)xNNPFOqwpUX6b-!6{jg|1*=OkNpVpdp!GkyZW5~M{Eud$kAJNjJ^rOkE*RnG zaCmzgZsk1BcnY089Dr^tmixTtW6fcCg{|xpd$Ku#+JFa*qTFC1)pdL_wEF)q<@&!h zy)$jElACkaATQ7p5N@vwUe@Eqx*;kv^7#h3gc@TVUv5)kXcKpm>1n^r&S|ItMFf7v zfLw+cdU(d)8UU7zs@m(F=;!oC&~d15Fvelmr-4NBV%D$L>dX;d-?DlH9qC~a+m~^H zQ+!~%TB17HkTB5|GdfW{WuPhACowz^6$kvt6HNhGwvh6-U!I5Nf~9&VR<5;S$Dwz= zB|ptU>B;A8;O0yiqy^#_v`(`5M&;?-cI$EM97gdGPqi9i-UvO=%yyjUBa;Ba5TgPt8?XDxJ3Bm0haAwicbRZZi#2pBFHHWYAWF_+B zb?H}ET$B;Qw&&~pQENyEi?o*E(pL-Zi=kIV$KQ483i46E$b?j(7Ve6I&-fjyC#SBb z9B_^)AS6H1iE;%%;d%P(STlhIaamE0j>r=sv?h1j2ie+__TD;<#UAB+gu#53*AOwFgFFjI^zr!km(Hmc4LMZ4?fc(3U>RD&w=~--5>6HTz z6mytcbAa`9berd$xQEjA%ShlZHj|W6A&rktDI8*A3grR|5U?#60Y>jbTAftjJ&@`e zKlItJXc>jOba@`Yam~s~z_|3a!Q)Au zO|qPJJqUJg4A3MrieX^P6WZ)p?%Z!kA!@{rZ-VS)D^@ZiXsKey21}A(Nu}3tOy$K- zSK$zq$pf34P6cgmCjq^8YGO%KA!IohCBgs_f} z7Ld(Byey1^uk6F6RP@vkDk@sd#-+WY%8-cGaGK@oOmj! z%Ji}cIM5pQPJIsz(%Sl1RuHntIvZ{6o2V`sFp2f*d6Uo*3>3+7;XE4U5f9q5vl-+y zvklUSnx}-5;^O0TMAI*;eQ>Ym_oF5Iu)qJ{)Ax93d}1m8i$6w9rtQlH>7x8WK+&4$ z>+93}k;5po2U%0>SkEB~Y)NI?SGvsg;Gj`KE3D(bdiZoHC~gr0!PDp}J{!G5op3SM znN>rr1u8uEc=`CK041CbJZ3Ss7I_DV4rJY(h|FvJPc~uCOp1S{R zR1K?Vb}P4-%33z$Pfc_c7+kGGb+~rFdcILLkGnq_pq2b80Vmc*gXF;|=n}jgSfWo% zY)dAzCMDYWX$K*w3qpmWWfcJR0KS!fCLwC`HbiR|YQ-*c9!9mzG&P*uNu%LXHOEna z_yKkytaQtvsR+9OsSIxHr!xbM@u;A&Vu04S;qx0J0<;D}fjLdt8$9!1rxn*)_nD>- pq;Z2k|Bt-p$p88|U}`zb0^G9#dvu6z#ldVL+Uf?!^3@!!{tG{;n(P1o literal 0 HcmV?d00001 From 274c03e044eed30e15e9cb8f2803ad38132b1929 Mon Sep 17 00:00:00 2001 From: Dab Date: Thu, 15 Mar 2018 15:08:35 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E8=B7=9F=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/didispace/UserService.java | 1 - 2-Dalston/pom.xml | 5 ++ 2-Dalston/trace-1/pom.xml | 49 ++++++++----------- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java b/2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java index 7feaba69..9a23ec02 100644 --- a/2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java +++ b/2-Dalston/hystrix-collapser-consumer/src/main/java/com/didispace/UserService.java @@ -9,7 +9,6 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; diff --git a/2-Dalston/pom.xml b/2-Dalston/pom.xml index f08ddfa8..6172c2e6 100644 --- a/2-Dalston/pom.xml +++ b/2-Dalston/pom.xml @@ -41,6 +41,11 @@ api-gateway-with-eureka stream-hello + + trace-1 + trace-2 + zipkin-server + zipkin-server-stream diff --git a/2-Dalston/trace-1/pom.xml b/2-Dalston/trace-1/pom.xml index 60d2d841..664bdd41 100644 --- a/2-Dalston/trace-1/pom.xml +++ b/2-Dalston/trace-1/pom.xml @@ -15,7 +15,7 @@ org.springframework.boot spring-boot-starter-parent 1.5.10.RELEASE - + @@ -35,8 +35,8 @@ spring-cloud-starter-eureka - - + + org.springframework.cloud spring-cloud-starter-sleuth @@ -46,39 +46,30 @@ spring-cloud-starter-ribbon - + net.logstash.logback logstash-logback-encoder 4.6 - - - + + + - - - org.springframework.cloud - spring-cloud-sleuth-stream - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - + + + org.springframework.cloud + spring-cloud-sleuth-stream + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + From 816c7c22012215b728cc4fecfeaa0fc664ba0761 Mon Sep 17 00:00:00 2001 From: Dab Date: Thu, 15 Mar 2018 16:37:09 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E8=B7=9F=E8=B8=AA=EF=BC=88=E6=8A=BD=E6=A0=B7=E6=94=B6?= =?UTF-8?q?=E9=9B=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/didispace/Trace1Application.java | 59 ++++++++++++++++--- .../src/main/resources/application.properties | 1 + .../src/main/resources/application.properties | 1 + 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java b/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java index bb896feb..3f9df7c9 100644 --- a/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java +++ b/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java @@ -18,10 +18,18 @@ public class Trace1Application { private final Logger logger = Logger.getLogger(getClass()); -// @Bean -// public AlwaysSampler defaultSampler() { -// return new AlwaysSampler(); -// } + /* + 在开发调试期间,通常会收集全部跟踪信息输出到远程仓库, + 将其值设置为1, + 或者 + 通过创建 AlwaysSampler 的 Bean(它实现的 isSampled 方法始终返回true)来覆盖默认的 PercentageBasedSampler 策略,比如: + */ + /* + @Bean + public AlwaysSampler defaultSampler() { + return new AlwaysSampler(); + } + */ @Bean @LoadBalanced @@ -68,13 +76,48 @@ public static void main(String[] args) { 在一次服务请求链路的调用过程中,会保持并传递同一个 Trace ID,从而将整个分布于不同微服务进程中的请求跟踪信息串联起来, 以上面输出内容为例,trace-1 和 trace-2 同属于一个前端服务请求来源,所以他们的 Trace ID 是相同的,处于同一条请求链路中。 +在Sleuth中采用了抽象收集的方式来为跟踪信息打上收集标记,第四个boolean类型的值,它代表了该信息是否要被后续的跟踪信息收集器获取和存储。 */ /* -在工程中引入spring-cloud-starter-sleuth依赖之后, 它会自动的为当前应用构建起各通信通道的跟踪机制, +在工程中引入 spring-cloud-starter-sleuth 依赖之后, 它会自动的为当前应用构建起各通信通道的跟踪机制, 比如: - 通过诸如RabbitMQ、Kafka(或者其他任何Spring Cloud Stream绑定器实现的消息中间件)传递的请求; - 通过Zuul代理传递的请求; - 通过RestTemplate发起的请求; + 通过诸如 RabbitMQ、Kafka(或者其他任何 Spring Cloud Stream 绑定器实现的消息中间件)传递的请求; + 通过 Zuul 代理传递的请求; + 通过 RestTemplate 发起的请求; */ +/* +在Sleuth中的抽样收集策略是通过Sampler接口实现的,它的定义如下: +public interface Sampler { + boolean isSampled(Span span); +} + +通过实现 isSampled 方法,Spring Cloud Sleuth 会在产生跟踪信息的时候调用它来为跟踪信息生成是否要被收集的标志。 +需要注意的是,即使isSampled返回了false,它仅代表该跟踪信息不被输出到后续对接的远程分析系统(比如:Zipkin),对于请求的跟踪活动依然会进行,所以我们在日志中还是能看到收集标识为false的记录。 + +默认情况下,Sleuth 会使用 PercentageBasedSampler 实现的抽样策略,以请求百分比的方式配置和收集跟踪信息, +在 application.properties 中配置下面的参数对其百分比值进行设置,它(跟踪信息取样比例)的默认值为 0.1 ,代表收集 10% 的请求跟踪信息。 + +spring.sleuth.sampler.percentage=0.1 + +在开发调试期间,通常会收集全部跟踪信息输出到远程仓库,我们可以将其值设置为1, +或者也可以通过创建 AlwaysSampler的Bean(它实现的 isSampled 方法始终返回true)来覆盖默认的 PercentageBasedSampler 策略,比如: +@Bean +public AlwaysSampler defaultSampler() { + return new AlwaysSampler(); +} + +在实际使用时,通过与Span对象中存储信息的配合,我们可以根据实际情况做出更贴近需求的抽样策略,比如实现一个仅对包含指定Tag的抽样策略: +public class TagSampler implements Sampler { + private String tag; + public TagSampler(String tag) { + this.tag = tag; + } + @Override + public boolean isSampled(Span span) { + return span.tags().get(tag) != null; + } +} + +*/ \ No newline at end of file diff --git a/2-Dalston/trace-1/src/main/resources/application.properties b/2-Dalston/trace-1/src/main/resources/application.properties index 2dadc80a..a6fe707d 100644 --- a/2-Dalston/trace-1/src/main/resources/application.properties +++ b/2-Dalston/trace-1/src/main/resources/application.properties @@ -17,6 +17,7 @@ spring.rabbitmq.port=5672 spring.rabbitmq.username=springcloud spring.rabbitmq.password=123456 +## 默认情况下,Sleuth 会使用 PercentageBasedSampler 实现的抽样策略,以请求百分比的方式配置和收集跟踪信息,它的默认值为0.1,代表收集10%的请求跟踪信息。 #spring.sleuth.sampler.percentage=0.1 # log trace detail diff --git a/2-Dalston/trace-2/src/main/resources/application.properties b/2-Dalston/trace-2/src/main/resources/application.properties index 4d2e7ef4..4cb5126f 100644 --- a/2-Dalston/trace-2/src/main/resources/application.properties +++ b/2-Dalston/trace-2/src/main/resources/application.properties @@ -17,6 +17,7 @@ spring.rabbitmq.port=5672 spring.rabbitmq.username=springcloud spring.rabbitmq.password=123456 +## 默认情况下,Sleuth 会使用 PercentageBasedSampler 实现的抽样策略,以请求百分比的方式配置和收集跟踪信息,它的默认值为0.1,代表收集10%的请求跟踪信息。 #spring.sleuth.sampler.percentage=0.5 ## log trace detail From 32d6fbadba357c2309f0425a7effd31c31052fd6 Mon Sep 17 00:00:00 2001 From: Dab Date: Fri, 16 Mar 2018 18:23:33 +0800 Subject: [PATCH 09/12] COMMIT --- .gitignore | 2 +- 2-Dalston/consul-client/pom.xml | 13 ++ ...tion.java => ConsulClientApplication.java} | 4 +- ...ler.java => ConsulClientDcController.java} | 4 +- .../src/main/resources/application.properties | 4 +- 2-Dalston/consul-consumer/pom.xml | 13 ++ ...on.java => ConsulConsumerApplication.java} | 4 +- ...r.java => ConsulConsumerDcController.java} | 10 +- .../src/main/resources/application.properties | 2 +- ...tion.java => EurekaClientApplication.java} | 4 +- ...ler.java => EurekaClientDcController.java} | 9 +- .../src/main/resources/eureka-code-1.png | Bin 0 -> 11759 bytes .../main/java/com/didispace/DcController.java | 24 --- ...a => EurekaConsumerRibbonApplication.java} | 4 +- .../EurekaConsumerRibbonDcController.java | 29 ++++ .../src/main/resources/application.properties | 4 +- ...on.java => EurekaConsumerApplication.java} | 4 +- ...r.java => EurekaConsumerDcController.java} | 12 +- ...tion.java => EurekaServerApplication.java} | 4 +- 2-Dalston/trace-1/pom.xml | 22 ++- 2-Dalston/trace-2/pom.xml | 148 +++++++++--------- 21 files changed, 182 insertions(+), 138 deletions(-) rename 2-Dalston/consul-client/src/main/java/com/didispace/{Application.java => ConsulClientApplication.java} (78%) rename 2-Dalston/consul-client/src/main/java/com/didispace/{DcController.java => ConsulClientDcController.java} (93%) rename 2-Dalston/consul-consumer/src/main/java/com/didispace/{Application.java => ConsulConsumerApplication.java} (83%) rename 2-Dalston/consul-consumer/src/main/java/com/didispace/{DcController.java => ConsulConsumerDcController.java} (81%) rename 2-Dalston/eureka-client/src/main/java/com/didispace/{Application.java => EurekaClientApplication.java} (78%) rename 2-Dalston/eureka-client/src/main/java/com/didispace/{DcController.java => EurekaClientDcController.java} (83%) create mode 100644 2-Dalston/eureka-client/src/main/resources/eureka-code-1.png delete mode 100644 2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java rename 2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/{Application.java => EurekaConsumerRibbonApplication.java} (93%) create mode 100644 2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonDcController.java rename 2-Dalston/eureka-consumer/src/main/java/com/didispace/{Application.java => EurekaConsumerApplication.java} (85%) rename 2-Dalston/eureka-consumer/src/main/java/com/didispace/{DcController.java => EurekaConsumerDcController.java} (77%) rename 2-Dalston/eureka-server/src/main/java/com/didispace/{Application.java => EurekaServerApplication.java} (72%) diff --git a/.gitignore b/.gitignore index 21bdfd4f..8c371b54 100644 --- a/.gitignore +++ b/.gitignore @@ -237,4 +237,4 @@ spring_cloud_in_action/zipkin-server-stream/.project spring_cloud_in_action/zipkin-server/.classpath spring_cloud_in_action/zipkin-server/.project /build/ -build/ +build/ \ No newline at end of file diff --git a/2-Dalston/consul-client/pom.xml b/2-Dalston/consul-client/pom.xml index dbefbaba..6c8e8352 100644 --- a/2-Dalston/consul-client/pom.xml +++ b/2-Dalston/consul-client/pom.xml @@ -25,6 +25,19 @@ + org.springframework.cloud spring-cloud-starter-consul-discovery diff --git a/2-Dalston/consul-client/src/main/java/com/didispace/Application.java b/2-Dalston/consul-client/src/main/java/com/didispace/ConsulClientApplication.java similarity index 78% rename from 2-Dalston/consul-client/src/main/java/com/didispace/Application.java rename to 2-Dalston/consul-client/src/main/java/com/didispace/ConsulClientApplication.java index a50e3531..971dc490 100644 --- a/2-Dalston/consul-client/src/main/java/com/didispace/Application.java +++ b/2-Dalston/consul-client/src/main/java/com/didispace/ConsulClientApplication.java @@ -6,10 +6,10 @@ @EnableDiscoveryClient // Discovery Client 标识,并会自动化读取相关配置,向服务注册中心发现服务并进行调用。 @SpringBootApplication -public class Application { +public class ConsulClientApplication { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(ConsulClientApplication.class).web(true).run(args); } } diff --git a/2-Dalston/consul-client/src/main/java/com/didispace/DcController.java b/2-Dalston/consul-client/src/main/java/com/didispace/ConsulClientDcController.java similarity index 93% rename from 2-Dalston/consul-client/src/main/java/com/didispace/DcController.java rename to 2-Dalston/consul-client/src/main/java/com/didispace/ConsulClientDcController.java index c82dab0c..ec29f968 100644 --- a/2-Dalston/consul-client/src/main/java/com/didispace/DcController.java +++ b/2-Dalston/consul-client/src/main/java/com/didispace/ConsulClientDcController.java @@ -12,7 +12,7 @@ * @blog http://blog.didispace.com */ @RestController -public class DcController { +public class ConsulClientDcController { @Autowired DiscoveryClient discoveryClient; @@ -22,7 +22,7 @@ public class DcController { // - List getInstances(String serviceId); 通过服务 ID,获取当前服务的服务实例 // - List getServices(); 获取所有服务 ID 列表 - @GetMapping("/dc") + @GetMapping("/consul/client/dc") public String dc() { String services = "Services: " + discoveryClient.getServices(); System.out.println(services); diff --git a/2-Dalston/consul-client/src/main/resources/application.properties b/2-Dalston/consul-client/src/main/resources/application.properties index 058a4670..7ea5597c 100644 --- a/2-Dalston/consul-client/src/main/resources/application.properties +++ b/2-Dalston/consul-client/src/main/resources/application.properties @@ -1,5 +1,5 @@ spring.application.name=consul-client -server.port=2001 +server.port=2002 #基于consul服务治理的服务提供者 spring.cloud.consul.host=localhost @@ -17,4 +17,4 @@ management.health.defaults.enabled = false # Key/Value存储 # 多数据中心 -#由于Spring Cloud Consul项目的实现,我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上,并通过此实现微服务架构中的服务治理。 \ No newline at end of file +# 由于 Spring Cloud Consul 项目的实现,我们可以轻松的将基于 Spring Boot 的微服务应用注册到 Consul 上,并通过此实现微服务架构中的服务治理。 diff --git a/2-Dalston/consul-consumer/pom.xml b/2-Dalston/consul-consumer/pom.xml index d6b6fd1f..4ce895f8 100644 --- a/2-Dalston/consul-consumer/pom.xml +++ b/2-Dalston/consul-consumer/pom.xml @@ -25,6 +25,19 @@ + org.springframework.cloud spring-cloud-starter-consul-discovery diff --git a/2-Dalston/consul-consumer/src/main/java/com/didispace/Application.java b/2-Dalston/consul-consumer/src/main/java/com/didispace/ConsulConsumerApplication.java similarity index 83% rename from 2-Dalston/consul-consumer/src/main/java/com/didispace/Application.java rename to 2-Dalston/consul-consumer/src/main/java/com/didispace/ConsulConsumerApplication.java index 8f62ad6d..684b61ce 100644 --- a/2-Dalston/consul-consumer/src/main/java/com/didispace/Application.java +++ b/2-Dalston/consul-consumer/src/main/java/com/didispace/ConsulConsumerApplication.java @@ -8,7 +8,7 @@ @EnableDiscoveryClient // Consul Discovery Client 标识,并会自动化读取 Consul 相关配置,向服务注册中心发现服务并进行调用。 @SpringBootApplication -public class Application { +public class ConsulConsumerApplication { @Bean public RestTemplate restTemplate() { @@ -16,7 +16,7 @@ public RestTemplate restTemplate() { } public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(ConsulConsumerApplication.class).web(true).run(args); } } diff --git a/2-Dalston/consul-consumer/src/main/java/com/didispace/DcController.java b/2-Dalston/consul-consumer/src/main/java/com/didispace/ConsulConsumerDcController.java similarity index 81% rename from 2-Dalston/consul-consumer/src/main/java/com/didispace/DcController.java rename to 2-Dalston/consul-consumer/src/main/java/com/didispace/ConsulConsumerDcController.java index b63780c6..ec224f76 100644 --- a/2-Dalston/consul-consumer/src/main/java/com/didispace/DcController.java +++ b/2-Dalston/consul-consumer/src/main/java/com/didispace/ConsulConsumerDcController.java @@ -15,9 +15,9 @@ * @blog http://blog.didispace.com */ @RestController -public class DcController { +public class ConsulConsumerDcController { - private static final Logger LOGGER = LoggerFactory.getLogger(DcController.class); + private static final Logger log = LoggerFactory.getLogger(ConsulConsumerDcController.class); // LoadBalanced 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。 // 即可以在获取的服务提供者实例列表中,通过 Ribbon 进行选择某实例,然后调用该服务实例。 @@ -28,11 +28,11 @@ public class DcController { @Autowired RestTemplate restTemplate; - @GetMapping("/consumer") + @GetMapping("/consul/consumer/consumer") public String dc() { ServiceInstance serviceInstance = loadBalancerClient.choose("consul-client"); - String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/dc"; - LOGGER.info("URL : "+url); + String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/consul/client/dc"; + log.info("URL : "+url); return restTemplate.getForObject(url, String.class); } diff --git a/2-Dalston/consul-consumer/src/main/resources/application.properties b/2-Dalston/consul-consumer/src/main/resources/application.properties index 822da5a1..06d106ff 100644 --- a/2-Dalston/consul-consumer/src/main/resources/application.properties +++ b/2-Dalston/consul-consumer/src/main/resources/application.properties @@ -1,5 +1,5 @@ spring.application.name=consul-consumer -server.port=2101 +server.port=2102 logging.file=${spring.application.name}.log diff --git a/2-Dalston/eureka-client/src/main/java/com/didispace/Application.java b/2-Dalston/eureka-client/src/main/java/com/didispace/EurekaClientApplication.java similarity index 78% rename from 2-Dalston/eureka-client/src/main/java/com/didispace/Application.java rename to 2-Dalston/eureka-client/src/main/java/com/didispace/EurekaClientApplication.java index 12318ec6..89eb39e5 100644 --- a/2-Dalston/eureka-client/src/main/java/com/didispace/Application.java +++ b/2-Dalston/eureka-client/src/main/java/com/didispace/EurekaClientApplication.java @@ -6,10 +6,10 @@ @EnableDiscoveryClient // Eureka Discovery Client 标识,并会自动化读取 Eureka 相关配置。还有向服务注册中心发现服务并进行调用。 @SpringBootApplication -public class Application { +public class EurekaClientApplication { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(EurekaClientApplication.class).web(true).run(args); } } diff --git a/2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java b/2-Dalston/eureka-client/src/main/java/com/didispace/EurekaClientDcController.java similarity index 83% rename from 2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java rename to 2-Dalston/eureka-client/src/main/java/com/didispace/EurekaClientDcController.java index 6353357a..ce4390b5 100644 --- a/2-Dalston/eureka-client/src/main/java/com/didispace/DcController.java +++ b/2-Dalston/eureka-client/src/main/java/com/didispace/EurekaClientDcController.java @@ -1,5 +1,7 @@ package com.didispace; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.GetMapping; @@ -11,7 +13,8 @@ * @blog http://blog.didispace.com */ @RestController -public class DcController { +public class EurekaClientDcController { + private static final Logger logger = LoggerFactory.getLogger(EurekaClientDcController.class); @Autowired DiscoveryClient discoveryClient; @@ -31,10 +34,10 @@ public String dc() throws InterruptedException{ return services; }*/ - @GetMapping("/dc") + @GetMapping("/eureka/client/dc") public String dc() { String services = "Services: " + discoveryClient.getServices(); - System.out.println(services); + logger.info(services); return services; } diff --git a/2-Dalston/eureka-client/src/main/resources/eureka-code-1.png b/2-Dalston/eureka-client/src/main/resources/eureka-code-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9010fad8eb14746db26a032b4e236933613557fe GIT binary patch literal 11759 zcmeHtXIN9))@~35QGu;sqpBdNh)C~cQ$;$8NJkKn-V7xWA|kNqO?n4up@iN^M4AYp zhF&5d0YZti1PFm|;oj%mcAn?n|M&Zqthr_xbIdWvc*i?dsIIme{RNf_AP|UN{fV+Z z2z16C1fmi-PXn~1BROqApj#kyJZDcsbf^2AkyM4n%uWuUei347U8)(v`Jdj9PD38IqB~g9)M-0WY9|l z10q>wTtQI-zY6Z$fSjPjJ9@xV1#>712=qSx2?l6-sFDlFZh8NTDDa>WTSNr{y$n;P z2Z6rm|M!sp2aP2hu!BH9hXbf-YoKILRJ#IIiiBHkIqDb!{Es~^5sdv4q)^@vIu*-B zE9x+o?;rBvj4MtPRp&fg%r5QuwlnOie@NgRg=m)dcYb6>6A#$WUN{3~{U!h$h)OP& z0Mh;A2`0t@IE%3N(+zP&R5zf&xiQlLuk#o~fk9tn?Qh(tLQyNk-qxemerS6rT6Amt>@M*c4=XbF4{T_sd%V8mW$w!;pI303?Tc-B>_DL zU-CI8|K+P0@^)1`DL>b#m*SUr{A>^VR~ory?Wf5t*R)bfriw4RGd%+RrA)7&_wAUY zR+!S-B)*#^HRJV^Gu6M0CrL{m#gz3k;q23QuebFmq+{n+$WQv&%SRDi39b_79&fL- zpVK{?njh_8fouoFTQ%)=4F-47|_ zv51^jxgrIMDt7VPv~L;GBB#ZVMn;YPZ{c4L{XkLTqNEG2mL@wfL{SNMY0YW2n?5+# z^~pPsT)&wAj`AkzeTrA25iX+Mv8hT4ZSnlpFQwXL{+!-T+31PEW2K#AISGlM{BBeE zo8>Yn!&}iSCA7L{tH?raI4|?j8M|?B7)j+(LgJ?c_!>5I+~H&oPJ$455o0X^bJ@u1 z`Bmqt7d|}(Q!QT2a>8K$M7N)7X@Ljo4;9h%@T#o`wUUS;p2N8**k?R$7XLOmWwCZZ zSE<`m)Eg%K9U6UI*8cAUzeAC=H<_C)?uq9qZh80N&}viN1L7;Xm}h852uCy{M6Blx z@Uqi--JTU)SYV<1WiQXjU8`bpSnTO=H^IJ8Z@Ky;jj7VZ02C9h*qOcI zwd5};H|SnkNNGv6uTGbf4EJU-xU(G5dQd_=a+2e};ul)U)5Xs5l^{6UB-9xP$^O?7 zes+0}m4=#HpRrLwO8mjz;yc=RqOT<&+{+;aeu$Pz-*u}wc^UBCR|K)4BH6DopHrx3 zRy&^Z(SG39^3F%5cHJE(xKk{?Pl%m9sk?O<|e z=edJj#(~aE!*c>boqsK~tJPdf$i`5fIsR7AxZyM<@|O&IJ)TwL!MA!Q{OjJ;He0g+i zYw3xiNW-IA8QF^R)LMa}ZdQ_0{4MANx8nfMr)D*D38!f2f;{~84gM1$(HgNL_)c*$ z_roe=E$2`$>dZhkhK^Q!N9t3c_RoWZ!ncC9to-B8uB`e##aT$06&`ArVBK0cYF2&_^Vwm`McV9A z#Umj)DX3_l#RZ&TZ@NgYe~}d=72Ke|SCk(vSV!WUK3Iqk?FXA&d9<3prl;{jwE#@d zAnG8k^_A#i56A0UFP(($HU*8=f|Knsl!Dtbkw4ciK05damx2|DZszw6UWgh*Sxe2j#MLIlw2SlV#R$WzByC8$iHT>= zeUAm4Tau*bdeJpA87{QcaL45q)15vGvssr*DcA6GHpjmCxU(UG7Vn@tFN*S(rOo4> z8DTFApNOD~-BF;Jm)cels>{wBnlBB>hbJ*`x$?Vh&k5irmKU=!FJGiKR8Oh4$z$MB z#Wv6oMb^w0wzFZ$y@_6Hg)k0AAcGR!A{tw!9wB&BzkHQ9;vl`XJ@qR zQ1K_ScKJDHk)g-Ey6#P|D8hfHujVmyCI_asr=YnSKbe}JCAuY-eRZwrPLk-eyWYk1 zdi#J4yncEw;OK`W5Cj!G2bjo|;_BLsL4S4`Pu=U9rMmk*wo!+NhanF)l?z(E)?;{R zzCV|CdU0*dTd_8PcR_8GqTD}~#_YJyD(NwHPq+CAKQ+@bym(8r+w?)BF@M8`pHIs}`M2Usl0HmbJ%*lfT2pyERnCZ-+snnGw zXN+;TV9!);Lt#5`(Yd?H!FE`M8QCVKgi1HV#>$zPirFh;oCejp;5X#j70=o+Zr^LO zKit*pW9u`>AvZOIxb43o-Y-h*E}psfl9qvOFqX^Z?O18M5gOKn(2=L7L`UtBR);SN z=-Fk9;8-(WZ6Yo=$l8$^kH<8IktU4_iy9gpmyw96HThRp>g7f0`uH#4Hg30iN_!NT zn$#!0?T%tMuCxlm&S#$o?tb?9*CZzWa<_acs7pV+Ji_^`+bqt1)x^C=&6&4-K*CihnEcB?gu&rL%T({QU741h_ghl-~B$2aA}2ouA$gh*$SVM$m~>M zbin8jo?D&Q9dLaqkRJiGM-1oAy*}FC@(+1`r_BX=2J~(Pb6d7zkBWjwJ5Ivpfd0~3 z@B%>c31!z%e$*_Duzf`gM7*U({r=7}kFC7#vF#je_9Oj!Szzt#Z;d@hHN5<(6;u_} z0NQ4*eCuMo?f@AD`2yZo;d1zfR(P%@n40JX95Qvj4w8|6fOMhoX-ds1!cDx87$z3!GK(gB|JjR?HWIYFw~#03Z)Y6LU)a z(3XvT6>;J8wh=d`DGb!tlK&0aK{SJTIBIddG$EU~2M>7m*)LqcP{pqXYV`b8{*4+$cFDt(iTtSSo_DHv#MLATULfgWT z!+ueG_S_daZlICzJjI_j;Dbt_hjUSUXC#E098+`+R4-o^cOV z-k8zlrJ4v*MvFTKexW@6cJ)fs{33_w*&_zfjSoO8VC6|GdeY*Uo(0uhn$u};GfcJo z1n2QyS}%O-NO#LP5Z;RpuJ@1ShU20v{cg-Y!30N3(fOCso~{y^H!oJ;?Pl8B+(duZzQLn3UW|C%^Kq>V#Lm<2qYf-|^?HA?&$w;YFsAtcsljUDn-qV< zP)|#gV=(bB`^+ebPvnEmwXZP^X6uvMriX0EAp>5II{9&zz5z&)xWbDk7{7S4yuo9l zhSX;Iiwdi{gNie6BBphdZ8Y+~BwulHJ@IV8P_ED)H3ueItagTRxbIm zpB_4=BXH>v*z10Y_eGb9qQj3)&#@fMP^yiBAWz^`TELldXB z`GBWc*=a`_0pE`M#ppm%IhM2;t^*IO4K=~GX-F=SH`6!aEk7SP9dDG}{4NehA~=?> zO7;_f4er>Lm9+58mqLPBr21;2rkVSMHWhCuqAkSeHCr*)s-b-q?SfeM_G1 ztjLm(A4qU zQ*b|syztEGKiTPp=LXW)TBiv5HhFmknPv9piQQUoBXYJqv-G1^tT^S}cC@E#zGOsx zjL}P805-_zIAg|H4Kd@a^$#gs4B{ zsOru6TDX)aMDeE5c#@T$l_XuS^0JG|G5*Ug?3=DDL zbyJk#iy0{{vO^r@IfnHX@2O!m>Uk4(-6H8e(Ko6~N_mqylTY$f&EF)-zQeyv1xwst zJpbt6GrR@>$rIEL@8>~PE^)BP*e%{*K%uI$Wf0l`<%{CeIwkJJlanHn5WxkbM8~yD2 z+=!hiykv)C)Dy-fqtjh>s9IHp_BH0b-z-$4z9yCL|0X@B~lant!ymFrp z7h6SO@92+N+nrLp z1E;9%Y;+ga%etUm%&erpYwXueH?*N9SB2J^*d?OeM=_avZK%11!y)b1vvFdype-S( zIH&ecgAAQc?pNglB~BY^G~)@M9c$&C`djjBnwQK##N4)EaOi4MQ!{i{7x^I#n@mR$bq|6ncCvP+yuutZSnpm znx`q(j4zw9=MKJGbMl0vF@y*5rJsmQ>~Ol_lVK1MOJh5CiAfFChw1Q5$en&Lo&44{ zcpy$Ht#s2(=TMq5`uB=bakSw6D92uDY~7z zB5QxKNb%Rq+kx#9acASv(q{DR8SW6IL%%ERP5-fcuEJh>tj3k%-oBdtj%w_WI34dL zgquK0a9wgBNrvAPB*CN2ENm9TJY=B#!m$%G!U|Reed^>*RjAR>wVqBBtZ1o#Tj-wUV*!Q*wm?l$u+3 z`cRg2B_NXZg--pC%#9`Z|DL(&cW$MRi8R?_EM7zovoQz4iWrt9Jt~lsY@=Ls2EW`r zD#Un~X74kM*%gE|d8M3~OD40WZX1pQY=iXIQ0v*SHjUdUWAUr9G$l2q4`zzIZ49BN z8Z>dkX*HPA`s%GL>qj}SP5k@TUUepG&Gg_jL}LJ#j|LC37uabhObUdo>xA}l-?x?^ zFSK06uN-LabC)8mU5&}AwaNOa5Tv-P>G|==l_nqP(u;vcd8Pq_gr1az23@<`6x#rgbpU|hQpIuAD=BwvRpKHuos6F!KmIMVK ztL&i>yq|={-Ce$G0WNx+trW$4qNV%Hc^`~lP2iC%buhUZ&(>t|V865n!!Z~Jels=9 zYCV>c%f@5^rg-!$MzI!@yc)F~ZQQ(WyqMUEzvwpL3IvjhR5*vB(+?9mMv%W5dUWr8 zCT+q#L_+Y**5tjku5g-VN@az1*LtM?Jf3cYmHsvJ*|Ht`Eu~sD zU`i#Bl#Dq|E=5LKg)(n$uiqVg_&g)?@y=}dSn57mbH*L=F64oAZ*h~EEW0>&2gmFf z9jU0nX8btCXsl&9wPSSzGgzsok*al&5RSQVeYus+jVDolU&=n=2}kwgF4xS`ga-HtE&bxpj_rxPHY z5#NzW<+{M)Wp<}#v>XY@YiABvMn`IVU46Was&!tBb!`@6SS>%FW9y#BNDnCH#1v>s z7KDW<{pZYc+WOVz0H(oq<23Vh_~Y-)(`UsF;*wH*G>wrUIFFp4Tk(3#g&)khP@T1h z?+9fwZt2GT96}=twV4Bynn}#fd zB-~6kvEIv}*M(%i(BU3=|7KpC!hSZv46-U;ve>Qjc3x$~KzQRRLHxX=bl)vZF*swq zsCW-@b*}Dz!P-4YJ=aEYCjU2hO_vEj%PfDWD~cgY60aoDr*bC0--y$7^X%;o=B}5{g z8UV)MpdHjW`{cqYu7=3G;=Ce?y@UYLQ{IURRc)nRgB;>J<^|vH0PHOiuV4&Kb$QDi zqp^9MfR3NI91Se8fAo7y41neT2Imlr<>@4^No=A&W*W%X2dX*b@UPt#cR~Q#->-dA z+C3CN(s|k+{>dCvsesJk?_6Sl^Ay(ijFq+GP6W23FEN*zCnQDhN&ls{gcjFH36L^c z|K3Z90{x|yiwm@TTm&T(?H0QtPYV*_9ym>Z#RnI!TliJhmvMOipaSxmb6wG#1h4a7 zK>lk?d0#WqHZd9Dgk9-Nw|Hl;uggkGo_Tmw7igv|cu630%c-~ajc=6JZ|y}kIqaCt z!2%R_!!3>!DHIB1B`4&Fq0P zxO@=O#Bd3q2}&Am$A+rcCQt#2gX80cWCF?pwyOsF*?Nou|0!#Bv8j0FY-D4(` z2;(?(8n~Cgz9SNKfJ@u^&WCtAUT!9*^1H9-Y2VSCr+v?E<|#P0?!8Fhm1!ucsd;We zo*Hk_$lc5zvQjXk)#uU+Oc>74@+gQL+MKk_8ci0ouCZ+U@Oeajzl{+e##cTl06XZF z`C9~8VA}g5DI&I0H_%ZWviQA%{CGP^PIfu}eBy?M28|DS*{NTx}F;n>>|EPzfqu!m>g%g~)Y z^A!AT$s`LDm!n4i+fa6;&w_ja{Vc>5y?Wl@Agsef8%70Y2Mq6DrN(be&U7@7P5diWdl?ob44`bf{Y2> zJ%&>$03PR46q{u3WVJ1sod(3r59~mF1B!KYytFcuXWZ<$@g-kp9D72+t_|iW$*GErc<@@~nqZX7=i`DI3fdT8+Al(L_O88swK`d7O&JL(p7ciB7<~^A) z7a}E{A9gFWaO=G46Lvo6R1W~(6jQ4M#XoD>Y+8%cPLqcrpg$!7M2p{Zoqx!gm#c$0@dcSJtCWSW3!UL= zHI8^rcm5=@z`8=Tv7W2P7QoSf9ww}L7y#{|$V5f8+!xFn*glGQrm79)r&49p5F7odf%z@7G9B-1ve&nf;E=UgFD2cmpA$(+@9fX7fNH+ zjNoFH=LOI=HCZm}o|Sgeld(lhsN>3$suL@bTY7vKCPkSC)^8Rvn(58+&x@TkSGs&} zD5{WSBzV+oC04#!>tt(r4`MxypebmcvB~s-ng(x2!U-kaJ}ObwP|KGl@n(($*dW+jx~6HLtJG3tH$DHnp=`v5(QyaxZ7jIt6zE>qEySO_5+H{^4RnD_YhP+YC{yY zr`R#TVYzroR?N_2Yvo)v@PDRpILQj{mivCQIGr|j6zdau>yw}*z(y~m4D6dvm=yFZ zvh5K`X{ujht^0r0pI~95$vZr2hf7{7agv-W}RLY zfJbkB-*l^=#;ZLa-L)S1W-~Pq=SPz==Pv?sAo!AcdD;*H04th`&Q&9$1;5=I$2*|=$YFNk6bj6JwZ9enkG znzUM1?QaG}7CzOm^sJlHbX(oPuCPg|XJO8YrBWI*S|g`V)G(f6e^$=w`}JMn=uj~6 zxNS9o^wxYjJaEL9Wz@hoL-IXg3s-D(Nc*N)rkFk_xj~W9zLv~k$j><^_H+V?ee$Bt zM`w-8#xPjS&a6xFf(L&M^gRhD@e7}$>B?uNL5zKt{00^)7IJNs ztbj=fl}4qjOWjY@ikRK=sV$>C>1&Y1MeOT&=#smWg%^4;gHze?{z5B;!Pu%P!;&hu zG|51JkD~D;?j*I(3(nx#;6jz}ROo@`s(@oywBU zWt=73h%Qh+Zwucr8XcFD;(p-;aTuw^J37+4pi&XZ9qwskPTo+<%)#J7j9uO6aO%8s z-p7r!zX_rJe-lFXKZQi!{hx#o$KZ2vd~2w&Ii8b@n1Bhg#1>r*T7h0I4hh?Subr_$ zLLL$rTA|QX_q{!c*LcYsJ$h)XIC!MMrZ_oUWbLuwbEu(gKP*jk$uM>vrnY(V*Bojj zt3nen7W?4xunb;z)fs)?K=q?*mlzVzI0b^3oM5l#Y$1NCTeE$OQ1B{6j=PI^n7oAc z+nPqJU$J=S+C3mlOXhZ?J*AEAZ28!ZwJKR5Od!_V?n($1mL5B$f^*A#LMLF~KWD~A zYF|&vfXkshOMKlPCDNz1JO??Ye*p3-?+Q~Qva+iOPD3voqe)dV^&9| zh+1}9Gp|y~rL{txm*Lp+$KVxNWj5K3mEd0OLL;^3O~PL_d%5|zO3TaIx&2Rz=)wno zW}H$m)!P6CBVJs$9Ntu&As-_1Got48w1z;L={l}}+wPWz|v9W#$N6k!7z zIV+Zy5Uw?ydadAk^al;O`2rdt>E0#zfE-|T1@;7FwXbLyWW+%oo}78%Vba>16~HzPC8LcxyYbH22*+ zOrlNH;#lT{xBK*SzZXvvXR(VB>dbrtkwEg%vKl@+hD&*gfC%o#9d;l09$%b3HQhe?AZfq#Fr`B@ zvYnc7YL|n`k|n&v`Pkav#Io$#>?Ax$zC~wQtJU4IN!sNt;T6;oH-BkK+HN7aTyj&d z+-BrQTNTBb5PZ_tGyFH*^A@0coN5M9MNP+zA8lr-@j~&XP!j`wzNgzTS8us0G7hRbGFpMJ#+#BZmbvws?*%p3s*RRHUuqddmx%o;`$$`aEXUyw znFn&7`pNbU2reQMwDM8_4GaSs;3HZ@0H1}O#?wZDMN7nvH?mS}(7xsB>2g~1?5wq)CqG#< zK8bX5n@jt{7C#_-N*b}#&(2k5jYb+f$e|QA+|Ow~Hqc^JK}se)g{9hYwT%HvV(mJ< z*bLA4X6M`}gxY>Gwxiu9)y&ShYSKi>On$g7<`_z%v`;s<;wWGL?i zbMTyQ*7t^C|Jj33S%_n|%G7R?$ZE^h194w_d7$stU;QfqMV9R>lJrA{ zK@+U=RV4t^6GFKj^d3O4gSw#N#yzeWw{nu9+#X|N+#2P&KY-pZh%hVI1F03T+V3>t z+oq(pf}8uA+M_Ir7DegN667QZ3(S7Tc2~iECNFp>!uLPs8(+rCHgyI~7rbt~&xaV8 z%Zb_MKRbyrX`F@4%U`KIbNv!cEl}cinrRp!=z>bn>5?8Dun!@JA$~ob#}}o40qHsL pG3!FfoztKH{tEbi{|I{TgsRw)i3FJ(B>)NnsjFx!mn&L+_%B||2L=ED literal 0 HcmV?d00001 diff --git a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java deleted file mode 100644 index 297fe844..00000000 --- a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/DcController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.didispace; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; - -/** - * @author 翟永超 - * @create 2017/4/15. - * @blog http://blog.didispace.com - */ -@RestController -public class DcController { - - @Autowired - RestTemplate restTemplate; - - @GetMapping("/consumer") - public String dc() { - return restTemplate.getForObject("http://eureka-client/dc", String.class); - } - -} diff --git a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonApplication.java similarity index 93% rename from 2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java rename to 2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonApplication.java index b51fb0f0..99b82f05 100644 --- a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/Application.java +++ b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonApplication.java @@ -9,7 +9,7 @@ @EnableDiscoveryClient @SpringBootApplication -public class Application { +public class EurekaConsumerRibbonApplication { // HTTP 访问操作类,初始化RestTemplate,用来真正发起REST请求。 // @LoadBalanced 标志着 RestTemplate 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。 @@ -21,7 +21,7 @@ public RestTemplate restTemplate() { } public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(EurekaConsumerRibbonApplication.class).web(true).run(args); } } diff --git a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonDcController.java b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonDcController.java new file mode 100644 index 00000000..1ebee1d8 --- /dev/null +++ b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonDcController.java @@ -0,0 +1,29 @@ +package com.didispace; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +/** + * @author 翟永超 + * @create 2017/4/15. + * @blog http://blog.didispace.com + */ +@RestController +public class EurekaConsumerRibbonDcController { + + @Autowired + RestTemplate restTemplate; + + /* + 对于RestTemplate的使用,我们的第一个url参数有一些特别。这里请求的host位置并没有使用一个具体的IP地址和端口的形式,而是采用了服务名的方式组成。 + 那么这样的请求为什么可以调用成功呢? + 因为Spring Cloud Ribbon有一个拦截器,它能够在这里进行实际调用的时候,自动的去选取服务实例,并将实际要请求的IP地址和端口替换这里的服务名,从而完成服务接口的调用。 + */ + @GetMapping("/eureka/consumer/ribbon/consumer") + public String dc() { + return restTemplate.getForObject("http://eureka-client/eureka/client/dc", String.class); + } + +} diff --git a/2-Dalston/eureka-consumer-ribbon/src/main/resources/application.properties b/2-Dalston/eureka-consumer-ribbon/src/main/resources/application.properties index 7ccc1a89..49134ffc 100644 --- a/2-Dalston/eureka-consumer-ribbon/src/main/resources/application.properties +++ b/2-Dalston/eureka-consumer-ribbon/src/main/resources/application.properties @@ -1,5 +1,5 @@ -spring.application.name=eureka-consumer -server.port=2101 +spring.application.name=eureka-consumer-ribbon +server.port=2103 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ diff --git a/2-Dalston/eureka-consumer/src/main/java/com/didispace/Application.java b/2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerApplication.java similarity index 85% rename from 2-Dalston/eureka-consumer/src/main/java/com/didispace/Application.java rename to 2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerApplication.java index 6c7e7144..a59fa7db 100644 --- a/2-Dalston/eureka-consumer/src/main/java/com/didispace/Application.java +++ b/2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerApplication.java @@ -8,7 +8,7 @@ @EnableDiscoveryClient // Eureka Discovery Client 标识,并会自动化读取 Eureka 相关配置。还有向服务注册中心发现服务并进行调用。 @SpringBootApplication -public class Application { +public class EurekaConsumerApplication { // HTTP 访问操作类,初始化RestTemplate,用来真正发起REST请求。 @Bean @@ -17,7 +17,7 @@ public RestTemplate restTemplate() { } public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(EurekaConsumerApplication.class).web(true).run(args); } } diff --git a/2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java b/2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerDcController.java similarity index 77% rename from 2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java rename to 2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerDcController.java index de5c8d25..092ac1bc 100644 --- a/2-Dalston/eureka-consumer/src/main/java/com/didispace/DcController.java +++ b/2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerDcController.java @@ -1,5 +1,7 @@ package com.didispace; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; @@ -13,8 +15,8 @@ * @blog http://blog.didispace.com */ @RestController -public class DcController { - +public class EurekaConsumerDcController { + private static final Logger logger = LoggerFactory.getLogger(EurekaConsumerDcController.class); // LoadBalanced 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。 // 即可以在获取的服务提供者实例列表中,通过 Ribbon 进行选择某实例,然后调用该服务实例。 @Autowired @@ -22,11 +24,11 @@ public class DcController { @Autowired RestTemplate restTemplate; // HTTP 访问操作类 - @GetMapping("/consumer") + @GetMapping("/eureka/consumer/dc") public String dc() { ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-client"); - String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/dc"; - System.out.println(url); + String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/eureka/client/dc"; + logger.info("url:"+url); return restTemplate.getForObject(url, String.class); } } diff --git a/2-Dalston/eureka-server/src/main/java/com/didispace/Application.java b/2-Dalston/eureka-server/src/main/java/com/didispace/EurekaServerApplication.java similarity index 72% rename from 2-Dalston/eureka-server/src/main/java/com/didispace/Application.java rename to 2-Dalston/eureka-server/src/main/java/com/didispace/EurekaServerApplication.java index 414607dd..300c2cac 100644 --- a/2-Dalston/eureka-server/src/main/java/com/didispace/Application.java +++ b/2-Dalston/eureka-server/src/main/java/com/didispace/EurekaServerApplication.java @@ -6,10 +6,10 @@ @EnableEurekaServer @SpringBootApplication -public class Application { +public class EurekaServerApplication { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args); } } diff --git a/2-Dalston/trace-1/pom.xml b/2-Dalston/trace-1/pom.xml index 664bdd41..1949eaab 100644 --- a/2-Dalston/trace-1/pom.xml +++ b/2-Dalston/trace-1/pom.xml @@ -47,19 +47,27 @@ + 由于Spring Boot应用默认使用了logback来记录日志,而Logstash自身也有对logback日志工具的支持工具, + 所以我们可以直接通过在logback的配置中增加对logstash的appender,就能非常方便的将日志转换成以json的格式存储和输出了。 + --> net.logstash.logback logstash-logback-encoder 4.6 - - - + + + diff --git a/2-Dalston/trace-2/pom.xml b/2-Dalston/trace-2/pom.xml index c1b58d92..20109446 100644 --- a/2-Dalston/trace-2/pom.xml +++ b/2-Dalston/trace-2/pom.xml @@ -1,75 +1,75 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - com.didispace - trace-2 - 0.0.1-SNAPSHOT - jar + com.didispace + trace-2 + 0.0.1-SNAPSHOT + jar - trace-2 - Demo project for Spring Boot + trace-2 + Demo project for Spring Boot - - org.springframework.boot - spring-boot-starter-parent - 1.5.10.RELEASE - - + + org.springframework.boot + spring-boot-starter-parent + 1.5.10.RELEASE + + - - UTF-8 - UTF-8 - 1.8 - + + UTF-8 + UTF-8 + 1.8 + - - - org.springframework.boot - spring-boot-starter-web - + + + org.springframework.boot + spring-boot-starter-web + - - org.springframework.cloud - spring-cloud-starter-eureka - + + org.springframework.cloud + spring-cloud-starter-eureka + - - org.springframework.cloud - spring-cloud-starter-ribbon - + + org.springframework.cloud + spring-cloud-starter-ribbon + - - org.springframework.cloud - spring-cloud-starter-sleuth - + + org.springframework.cloud + spring-cloud-starter-sleuth + - - - net.logstash.logback - logstash-logback-encoder - 4.6 - + --> + + net.logstash.logback + logstash-logback-encoder + 4.6 + - + - + @@ -81,27 +81,27 @@ spring-cloud-starter-stream-rabbit - + - - - - org.springframework.cloud - spring-cloud-dependencies - Dalston.SR5 - pom - import - - - + + + + org.springframework.cloud + spring-cloud-dependencies + Dalston.SR5 + pom + import + + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + From 27810b0bcd9a100027f484e112fb5343638ed849 Mon Sep 17 00:00:00 2001 From: DabPang <894626164@qq.com> Date: Sat, 17 Mar 2018 11:11:33 +0800 Subject: [PATCH 10/12] rename --- ...tion.java => ConfigClientApplication.java} | 5 ++--- .../src/main/resources/bootstrap.yml | 9 +++++++-- ...tion.java => ConfigServerApplication.java} | 6 +++--- .../src/main/resources/application.yml | 19 +++++++++++++++++- .../EurekaConsumerRibbonApplication.java | 4 ++-- .../EurekaConsumerRibbonDcController.java | 5 ----- .../didispace/EurekaConsumerDcController.java | 14 ++++++------- 2-Dalston/pom.xml | 3 ++- .../pom.xml | 4 ++-- .../com/didispace/stream/SinkApplication.java | 0 .../com/didispace/stream/SinkReceiver.java | 0 .../src/main/resources/SCSt-with-binder.png | Bin .../src/main/resources/application.properties | 0 .../com/didispace/SinkApplicationTests.java | 0 .../com/didispace/TurbineApplication.java | 3 ++- 15 files changed, 45 insertions(+), 27 deletions(-) rename 2-Dalston/config-client/src/main/java/com/didispace/{Application.java => ConfigClientApplication.java} (65%) rename 2-Dalston/config-server-git/src/main/java/com/didispace/{Application.java => ConfigServerApplication.java} (88%) rename 2-Dalston/{stream-hello => stream-hello-rabbit}/pom.xml (96%) rename 2-Dalston/{stream-hello => stream-hello-rabbit}/src/main/java/com/didispace/stream/SinkApplication.java (100%) rename 2-Dalston/{stream-hello => stream-hello-rabbit}/src/main/java/com/didispace/stream/SinkReceiver.java (100%) rename 2-Dalston/{stream-hello => stream-hello-rabbit}/src/main/resources/SCSt-with-binder.png (100%) rename 2-Dalston/{stream-hello => stream-hello-rabbit}/src/main/resources/application.properties (100%) rename 2-Dalston/{stream-hello => stream-hello-rabbit}/src/test/java/com/didispace/SinkApplicationTests.java (100%) diff --git a/2-Dalston/config-client/src/main/java/com/didispace/Application.java b/2-Dalston/config-client/src/main/java/com/didispace/ConfigClientApplication.java similarity index 65% rename from 2-Dalston/config-client/src/main/java/com/didispace/Application.java rename to 2-Dalston/config-client/src/main/java/com/didispace/ConfigClientApplication.java index 1aeb7b24..89baa654 100644 --- a/2-Dalston/config-client/src/main/java/com/didispace/Application.java +++ b/2-Dalston/config-client/src/main/java/com/didispace/ConfigClientApplication.java @@ -3,12 +3,11 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; -//@EnableDiscoveryClient @SpringBootApplication -public class Application { +public class ConfigClientApplication { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(ConfigClientApplication.class).web(true).run(args); } } diff --git a/2-Dalston/config-client/src/main/resources/bootstrap.yml b/2-Dalston/config-client/src/main/resources/bootstrap.yml index 730830c9..89e549b5 100644 --- a/2-Dalston/config-client/src/main/resources/bootstrap.yml +++ b/2-Dalston/config-client/src/main/resources/bootstrap.yml @@ -4,9 +4,14 @@ spring: cloud: config: uri: http://localhost:1201/ - profile: dev + profile: default label: master server: - port: 2001 + port: 2002 + +# spring.application.name:对应配置文件规则中的{application}部分 +# spring.cloud.config.profile:对应配置文件规则中的{profile}部分 +# spring.cloud.config.label:对应配置文件规则中的{label}部分 +# spring.cloud.config.uri:配置中心config-server的地址 diff --git a/2-Dalston/config-server-git/src/main/java/com/didispace/Application.java b/2-Dalston/config-server-git/src/main/java/com/didispace/ConfigServerApplication.java similarity index 88% rename from 2-Dalston/config-server-git/src/main/java/com/didispace/Application.java rename to 2-Dalston/config-server-git/src/main/java/com/didispace/ConfigServerApplication.java index 9e78c356..a637be4d 100644 --- a/2-Dalston/config-server-git/src/main/java/com/didispace/Application.java +++ b/2-Dalston/config-server-git/src/main/java/com/didispace/ConfigServerApplication.java @@ -4,13 +4,13 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.config.server.EnableConfigServer; -//添加@EnableConfigServer注解,开启Spring Cloud Config的服务端功能。 +/*添加@EnableConfigServer注解,开启Spring Cloud Config的服务端功能。*/ @EnableConfigServer @SpringBootApplication -public class Application { +public class ConfigServerApplication { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(ConfigServerApplication.class).web(true).run(args); } } diff --git a/2-Dalston/config-server-git/src/main/resources/application.yml b/2-Dalston/config-server-git/src/main/resources/application.yml index bd25b8f4..78358599 100644 --- a/2-Dalston/config-server-git/src/main/resources/application.yml +++ b/2-Dalston/config-server-git/src/main/resources/application.yml @@ -11,4 +11,21 @@ spring: password: ZXCVbnm.123 server: - port: 1201 + port: 1202 + +# 如果我们的Git仓库需要权限访问,那么可以通过配置下面的两个属性来实现; +# spring.cloud.config.server.git.username:访问Git仓库的用户名 +# spring.cloud.config.server.git.password:访问Git仓库的用户密码 + +# 访问配置信息的URL与配置文件的映射关系如下: +# +# /{application}/{profile}[/{label}] +# /{application}-{profile}.yml +# /{label}/{application}-{profile}.yml +# /{application}-{profile}.properties +# /{label}/{application}-{profile}.properties +# +# 上面的 url会映射 {application}-{profile}.properties 对应的配置文件, +# {label}:Git分支,默认为master。{profile}:环境名。 + + diff --git a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonApplication.java b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonApplication.java index 99b82f05..876ce458 100644 --- a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonApplication.java +++ b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonApplication.java @@ -27,7 +27,7 @@ public static void main(String[] args) { } /* -Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 +Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。 它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。 当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务实例列表。 @@ -36,7 +36,7 @@ public static void main(String[] args) { 而当Ribbon与Consul联合使用时,ribbonServerList会被ConsulServerList来扩展成从Consul获取服务实例列表。 同时由ConsulPing来作为IPing接口的实现。 -我们在使用Spring Cloud Ribbon的时候,不论是与Eureka还是Consul结合,都会在引入Spring Cloud Eureka或Spring Cloud Consul依赖的时候通过自动化配置来加载上述所说的配置内容, +我们在使用 Spring Cloud Ribbon 的时候,不论是与 Eureka 还是 Consul 结合,都会在引入 Spring Cloud Eureka 或 Spring Cloud Consul 依赖的时候通过自动化配置来加载上述所说的配置内容, 所以我们可以快速在Spring Cloud中实现服务间调用的负载均衡。 */ diff --git a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonDcController.java b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonDcController.java index 1ebee1d8..b88d797d 100644 --- a/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonDcController.java +++ b/2-Dalston/eureka-consumer-ribbon/src/main/java/com/didispace/EurekaConsumerRibbonDcController.java @@ -5,11 +5,6 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; -/** - * @author 翟永超 - * @create 2017/4/15. - * @blog http://blog.didispace.com - */ @RestController public class EurekaConsumerRibbonDcController { diff --git a/2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerDcController.java b/2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerDcController.java index 092ac1bc..600c1150 100644 --- a/2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerDcController.java +++ b/2-Dalston/eureka-consumer/src/main/java/com/didispace/EurekaConsumerDcController.java @@ -9,18 +9,18 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; -/** - * @author 翟永超 - * @create 2017/4/15. - * @blog http://blog.didispace.com - */ @RestController public class EurekaConsumerDcController { + private static final Logger logger = LoggerFactory.getLogger(EurekaConsumerDcController.class); - // LoadBalanced 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。 - // 即可以在获取的服务提供者实例列表中,通过 Ribbon 进行选择某实例,然后调用该服务实例。 + + /* + LoadBalanced 是通过 Ribbon 客户端负载均衡去调用服务提供者集群的。 + 即可以在获取的服务提供者实例列表中,通过 Ribbon 进行选择某实例,然后调用该服务实例。 + */ @Autowired LoadBalancerClient loadBalancerClient; + @Autowired RestTemplate restTemplate; // HTTP 访问操作类 diff --git a/2-Dalston/pom.xml b/2-Dalston/pom.xml index 6172c2e6..c65d760b 100644 --- a/2-Dalston/pom.xml +++ b/2-Dalston/pom.xml @@ -40,10 +40,11 @@ api-gateway api-gateway-with-eureka - stream-hello + stream-hello-rabbit trace-1 trace-2 + zipkin-server zipkin-server-stream diff --git a/2-Dalston/stream-hello/pom.xml b/2-Dalston/stream-hello-rabbit/pom.xml similarity index 96% rename from 2-Dalston/stream-hello/pom.xml rename to 2-Dalston/stream-hello-rabbit/pom.xml index 1ed30bd2..9f00442b 100644 --- a/2-Dalston/stream-hello/pom.xml +++ b/2-Dalston/stream-hello-rabbit/pom.xml @@ -4,11 +4,11 @@ 4.0.0 com.didispace - stream-hello + stream-hello-rabbit 0.0.1-SNAPSHOT jar - stream-hello + stream-hello-rabbit Demo project for Spring Boot diff --git a/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkApplication.java b/2-Dalston/stream-hello-rabbit/src/main/java/com/didispace/stream/SinkApplication.java similarity index 100% rename from 2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkApplication.java rename to 2-Dalston/stream-hello-rabbit/src/main/java/com/didispace/stream/SinkApplication.java diff --git a/2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java b/2-Dalston/stream-hello-rabbit/src/main/java/com/didispace/stream/SinkReceiver.java similarity index 100% rename from 2-Dalston/stream-hello/src/main/java/com/didispace/stream/SinkReceiver.java rename to 2-Dalston/stream-hello-rabbit/src/main/java/com/didispace/stream/SinkReceiver.java diff --git a/2-Dalston/stream-hello/src/main/resources/SCSt-with-binder.png b/2-Dalston/stream-hello-rabbit/src/main/resources/SCSt-with-binder.png similarity index 100% rename from 2-Dalston/stream-hello/src/main/resources/SCSt-with-binder.png rename to 2-Dalston/stream-hello-rabbit/src/main/resources/SCSt-with-binder.png diff --git a/2-Dalston/stream-hello/src/main/resources/application.properties b/2-Dalston/stream-hello-rabbit/src/main/resources/application.properties similarity index 100% rename from 2-Dalston/stream-hello/src/main/resources/application.properties rename to 2-Dalston/stream-hello-rabbit/src/main/resources/application.properties diff --git a/2-Dalston/stream-hello/src/test/java/com/didispace/SinkApplicationTests.java b/2-Dalston/stream-hello-rabbit/src/test/java/com/didispace/SinkApplicationTests.java similarity index 100% rename from 2-Dalston/stream-hello/src/test/java/com/didispace/SinkApplicationTests.java rename to 2-Dalston/stream-hello-rabbit/src/test/java/com/didispace/SinkApplicationTests.java diff --git a/2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java b/2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java index 18edc539..faf3dfae 100644 --- a/2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java +++ b/2-Dalston/turbine-amqp/src/main/java/com/didispace/TurbineApplication.java @@ -8,7 +8,6 @@ @Configuration @EnableAutoConfiguration -/*在应用主类中使用@EnableTurbineStream注解来启用Turbine Stream的配置。*/ @EnableTurbineStream @EnableDiscoveryClient public class TurbineApplication { @@ -18,3 +17,5 @@ public static void main(String[] args) { } } + +/* 在应用主类中使用 @EnableTurbineStream 注解来启用 Turbine Stream 的配置。*/ \ No newline at end of file From 56651fd182b0f4ced2f2911b462b2b9f71eba889 Mon Sep 17 00:00:00 2001 From: Dab Date: Thu, 22 Mar 2018 17:07:34 +0800 Subject: [PATCH 11/12] commmit --- Chapter1-1-1/compute-service/pom.xml | 4 +- .../java/com/didispace/ApplicationTests.java | 40 ------------------- Chapter1-1-1/eureka-server/pom.xml | 10 ++--- ...tion.java => EurekaServerApplication.java} | 4 +- .../src/main/resources/application.properties | 12 ++++-- Chapter1-1-4/config-server/pom.xml | 4 +- .../src/main/resources/application.properties | 8 ++-- .../config-client-eureka-kafka/pom.xml | 4 +- ...> ConfigClientEurekaKafkaApplication.java} | 4 +- .../config-server-eureka-kafka/pom.xml | 4 +- ...> ConfigServerEurekaKafkaApplication.java} | 4 +- .../src/main/resources/application.properties | 15 ++++--- 12 files changed, 42 insertions(+), 71 deletions(-) delete mode 100644 Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java rename Chapter1-1-1/eureka-server/src/main/java/com/didispace/{Application.java => EurekaServerApplication.java} (72%) rename Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/{Application.java => ConfigClientEurekaKafkaApplication.java} (69%) rename Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/{Application.java => ConfigServerEurekaKafkaApplication.java} (74%) diff --git a/Chapter1-1-1/compute-service/pom.xml b/Chapter1-1-1/compute-service/pom.xml index 04ef83d0..1334ec99 100644 --- a/Chapter1-1-1/compute-service/pom.xml +++ b/Chapter1-1-1/compute-service/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.3.5.RELEASE + 1.5.4.RELEASE @@ -42,7 +42,7 @@ org.springframework.cloud spring-cloud-dependencies - Brixton.RELEASE + Dalston.SR1 pom import diff --git a/Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java b/Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java deleted file mode 100644 index a2f42803..00000000 --- a/Chapter1-1-1/compute-service/src/test/java/com/didispace/ApplicationTests.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.didispace; - -import com.didispace.web.ComputeController; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockServletContext; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import static org.hamcrest.Matchers.equalTo; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = MockServletContext.class) -@WebAppConfiguration -public class ApplicationTests { - - private MockMvc mvc; - - @Before - public void setUp() throws Exception { - mvc = MockMvcBuilders.standaloneSetup(new ComputeController()).build(); - } - - @Test - public void getHello() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string(equalTo("Hello World"))); - } - -} diff --git a/Chapter1-1-1/eureka-server/pom.xml b/Chapter1-1-1/eureka-server/pom.xml index 3f01c311..31e3a6ee 100644 --- a/Chapter1-1-1/eureka-server/pom.xml +++ b/Chapter1-1-1/eureka-server/pom.xml @@ -12,10 +12,10 @@ Spring Cloud project - org.springframework.boot - spring-boot-starter-parent - 1.3.5.RELEASE - + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + @@ -43,7 +43,7 @@ org.springframework.cloud spring-cloud-dependencies - Brixton.RELEASE + Dalston.SR1 pom import diff --git a/Chapter1-1-1/eureka-server/src/main/java/com/didispace/Application.java b/Chapter1-1-1/eureka-server/src/main/java/com/didispace/EurekaServerApplication.java similarity index 72% rename from Chapter1-1-1/eureka-server/src/main/java/com/didispace/Application.java rename to Chapter1-1-1/eureka-server/src/main/java/com/didispace/EurekaServerApplication.java index 414607dd..300c2cac 100644 --- a/Chapter1-1-1/eureka-server/src/main/java/com/didispace/Application.java +++ b/Chapter1-1-1/eureka-server/src/main/java/com/didispace/EurekaServerApplication.java @@ -6,10 +6,10 @@ @EnableEurekaServer @SpringBootApplication -public class Application { +public class EurekaServerApplication { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args); } } diff --git a/Chapter1-1-1/eureka-server/src/main/resources/application.properties b/Chapter1-1-1/eureka-server/src/main/resources/application.properties index 8dad7230..3546d063 100644 --- a/Chapter1-1-1/eureka-server/src/main/resources/application.properties +++ b/Chapter1-1-1/eureka-server/src/main/resources/application.properties @@ -1,6 +1,12 @@ -server.port=1111 +#server.port=1111 #eureka.instance.hostname=localhost +# +#eureka.client.register-with-eureka=false +#eureka.client.fetch-registry=false +#eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/ +spring.application.name=eureka-server +server.port=1111 +eureka.instance.hostname=localhost eureka.client.register-with-eureka=false -eureka.client.fetch-registry=false -eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/ \ No newline at end of file +eureka.client.fetch-registry=false \ No newline at end of file diff --git a/Chapter1-1-4/config-server/pom.xml b/Chapter1-1-4/config-server/pom.xml index 379aa99d..5307a3a4 100644 --- a/Chapter1-1-4/config-server/pom.xml +++ b/Chapter1-1-4/config-server/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.3.5.RELEASE + 1.5.4.RELEASE @@ -43,7 +43,7 @@ org.springframework.cloud spring-cloud-dependencies - Brixton.RELEASE + Dalston.SR1 pom import diff --git a/Chapter1-1-4/config-server/src/main/resources/application.properties b/Chapter1-1-4/config-server/src/main/resources/application.properties index 4157fdd4..0621f240 100644 --- a/Chapter1-1-4/config-server/src/main/resources/application.properties +++ b/Chapter1-1-4/config-server/src/main/resources/application.properties @@ -2,10 +2,10 @@ spring.application.name=config-server server.port=7001 # git -spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/SpringBoot-Learning/ -spring.cloud.config.server.git.searchPaths=Chapter9-1-4/config-repo -spring.cloud.config.server.git.username=username -spring.cloud.config.server.git.password=password +spring.cloud.config.server.git.uri=https://gitee.com/pdb2010/config-server +#spring.cloud.config.server.git.searchPaths=Chapter9-1-4/config-repo +spring.cloud.config.server.git.username=pangdabo2010@hotmail.com +spring.cloud.config.server.git.password=ZXCVbnm.123 # spring.profiles.active=native diff --git a/Chapter1-1-7/config-client-eureka-kafka/pom.xml b/Chapter1-1-7/config-client-eureka-kafka/pom.xml index 16e6424d..26418a7a 100644 --- a/Chapter1-1-7/config-client-eureka-kafka/pom.xml +++ b/Chapter1-1-7/config-client-eureka-kafka/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.3.7.RELEASE + 1.5.4.RELEASE @@ -59,7 +59,7 @@ org.springframework.cloud spring-cloud-dependencies - Brixton.SR5 + Dalston.SR1 pom import diff --git a/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/Application.java b/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/ConfigClientEurekaKafkaApplication.java similarity index 69% rename from Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/Application.java rename to Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/ConfigClientEurekaKafkaApplication.java index 13dba6a3..03241f41 100644 --- a/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/Application.java +++ b/Chapter1-1-7/config-client-eureka-kafka/src/main/java/com/didispace/ConfigClientEurekaKafkaApplication.java @@ -6,10 +6,10 @@ @EnableDiscoveryClient @SpringBootApplication -public class Application { +public class ConfigClientEurekaKafkaApplication { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(ConfigClientEurekaKafkaApplication.class).web(true).run(args); } } diff --git a/Chapter1-1-7/config-server-eureka-kafka/pom.xml b/Chapter1-1-7/config-server-eureka-kafka/pom.xml index 9bcdcb68..0cda969b 100644 --- a/Chapter1-1-7/config-server-eureka-kafka/pom.xml +++ b/Chapter1-1-7/config-server-eureka-kafka/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.3.7.RELEASE + 1.5.4.RELEASE @@ -43,7 +43,7 @@ org.springframework.cloud spring-cloud-dependencies - Brixton.SR5 + Dalston.SR1 pom import diff --git a/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/Application.java b/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/ConfigServerEurekaKafkaApplication.java similarity index 74% rename from Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/Application.java rename to Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/ConfigServerEurekaKafkaApplication.java index d728543c..414a6fce 100644 --- a/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/Application.java +++ b/Chapter1-1-7/config-server-eureka-kafka/src/main/java/com/didispace/ConfigServerEurekaKafkaApplication.java @@ -8,10 +8,10 @@ @EnableDiscoveryClient @EnableConfigServer @SpringBootApplication -public class Application { +public class ConfigServerEurekaKafkaApplication { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + new SpringApplicationBuilder(ConfigServerEurekaKafkaApplication.class).web(true).run(args); } } diff --git a/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties b/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties index 6caa7ecd..1032fef0 100644 --- a/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties +++ b/Chapter1-1-7/config-server-eureka-kafka/src/main/resources/application.properties @@ -4,11 +4,16 @@ server.port=7001 eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ # git -spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/SpringCloud-Learning/ -spring.cloud.config.server.git.searchPaths=Chapter1-1-7/config-repo -spring.cloud.config.server.git.username=username -spring.cloud.config.server.git.password=password +spring.cloud.config.server.git.uri=https://gitee.com/pdb2010/config-server +#spring.cloud.config.server.git.searchPaths=Chapter1-1-7/config-repo +spring.cloud.config.server.git.username=pangdabo2010@hotmail.com +spring.cloud.config.server.git.password=ZXCVbnm.123 #kafka spring.cloud.stream.kafka.binder.zk-nodes=localhost:2181 -spring.cloud.stream.kafka.binder.brokers=localhost:9092 \ No newline at end of file +spring.cloud.stream.kafka.binder.brokers=localhost:9092 + +#spring.cloud.stream.kafka.binder.brokers Kafkaķб localhost +#spring.cloud.stream.kafka.binder.defaultBrokerPort Kafka˵Ĭ϶˿ڣbrokersûö˿ϢʱͻʹĬ϶˿ 9092 +#spring.cloud.stream.kafka.binder.zkNodes KafkaӵZooKeeperڵб localhost +#spring.cloud.stream.kafka.binder.defaultZkPort ZooKeeperڵĬ϶˿ڣzkNodesûö˿ϢʱͻʹĬ϶˿ 2181 \ No newline at end of file From d9f3f537b2f93648b6b654eedc0c993b7cd629ec Mon Sep 17 00:00:00 2001 From: Dab Date: Thu, 22 Mar 2018 18:29:32 +0800 Subject: [PATCH 12/12] commit --- 2-Dalston/trace-1/pom.xml | 6 ++---- .../main/java/com/didispace/Trace1Application.java | 2 ++ .../src/main/resources/application.properties | 10 +++++----- 2-Dalston/trace-2/pom.xml | 3 +-- .../src/main/resources/application.properties | 14 +++++++------- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/2-Dalston/trace-1/pom.xml b/2-Dalston/trace-1/pom.xml index 1949eaab..03d6b5af 100644 --- a/2-Dalston/trace-1/pom.xml +++ b/2-Dalston/trace-1/pom.xml @@ -62,22 +62,20 @@ 第二种方式:消息中间件, 使用 @EnableZipkinStreamServer 注解; --> - - + diff --git a/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java b/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java index 3f9df7c9..1cd7846c 100644 --- a/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java +++ b/2-Dalston/trace-1/src/main/java/com/didispace/Trace1Application.java @@ -6,6 +6,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @@ -38,6 +39,7 @@ RestTemplate restTemplate() { } @RequestMapping(value = "/info", method = RequestMethod.GET) + @GetMapping("/info") public String info() { logger.info("======"); return "trace-1,"+restTemplate().getForEntity("http://trace-2/info", String.class).getBody(); diff --git a/2-Dalston/trace-1/src/main/resources/application.properties b/2-Dalston/trace-1/src/main/resources/application.properties index a6fe707d..b1bd68f7 100644 --- a/2-Dalston/trace-1/src/main/resources/application.properties +++ b/2-Dalston/trace-1/src/main/resources/application.properties @@ -9,13 +9,13 @@ eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ ## HTTP方式 实现时使用的 spring.zipkin.base-url 参数 ## 如果在zip-server应用中,我们将其端口设置为9411,并且均在本地调试的话,该参数也可以不配置,因为默认值就是http://localhost:9411 -# spring.zipkin.base-url=http://localhost:9411 + spring.zipkin.base-url=http://localhost:9411 ## 去掉HTTP方式实现时使用的spring.zipkin.base-url参数,并根据实际部署情况,增加消息中间件的相关配置,比如下面这些关于RabbitMQ的配置信息 -spring.rabbitmq.host=localhost -spring.rabbitmq.port=5672 -spring.rabbitmq.username=springcloud -spring.rabbitmq.password=123456 +#spring.rabbitmq.host=localhost +#spring.rabbitmq.port=5672 +#spring.rabbitmq.username=springcloud +#spring.rabbitmq.password=123456 ## 默认情况下,Sleuth 会使用 PercentageBasedSampler 实现的抽样策略,以请求百分比的方式配置和收集跟踪信息,它的默认值为0.1,代表收集10%的请求跟踪信息。 #spring.sleuth.sampler.percentage=0.1 diff --git a/2-Dalston/trace-2/pom.xml b/2-Dalston/trace-2/pom.xml index 20109446..f5dcc6b6 100644 --- a/2-Dalston/trace-2/pom.xml +++ b/2-Dalston/trace-2/pom.xml @@ -64,12 +64,10 @@ 第二种方式:消息中间件, 使用 @EnableZipkinStreamServer 注解; --> - @@ -79,6 +77,7 @@ org.springframework.cloud spring-cloud-starter-stream-rabbit + diff --git a/2-Dalston/trace-2/src/main/resources/application.properties b/2-Dalston/trace-2/src/main/resources/application.properties index 4cb5126f..94f8fc73 100644 --- a/2-Dalston/trace-2/src/main/resources/application.properties +++ b/2-Dalston/trace-2/src/main/resources/application.properties @@ -7,15 +7,15 @@ eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ # 第一种方式:http方式 ; # 第二种方式:消息中间件 ; -## HTTP方式 实现时使用的 spring.zipkin.base-url 参数 +## 第一种方式:HTTP方式 实现时使用的 spring.zipkin.base-url 参数 ## 如果在zip-server应用中,我们将其端口设置为9411,并且均在本地调试的话,该参数也可以不配置,因为默认值就是http://localhost:9411 -# spring.zipkin.base-url=http://localhost:9411 + spring.zipkin.base-url=http://localhost:9411 -# 消息中间件 的相关配置,比如下面这些关于RabbitMQ的配置信息 -spring.rabbitmq.host=localhost -spring.rabbitmq.port=5672 -spring.rabbitmq.username=springcloud -spring.rabbitmq.password=123456 +# 第二种方式:消息中间件 的相关配置,比如下面这些关于RabbitMQ的配置信息 +#spring.rabbitmq.host=localhost +#spring.rabbitmq.port=5672 +#spring.rabbitmq.username=springcloud +#spring.rabbitmq.password=123456 ## 默认情况下,Sleuth 会使用 PercentageBasedSampler 实现的抽样策略,以请求百分比的方式配置和收集跟踪信息,它的默认值为0.1,代表收集10%的请求跟踪信息。 #spring.sleuth.sampler.percentage=0.5