From c19c349fd548e6a8851ae8c36a34045215467fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Wed, 16 Jan 2019 14:24:37 +0800 Subject: [PATCH] git add . --- .../consumer/feign/CProductFeign.java | 3 +- .../feign/impl/CProductFeignImpl.java | 31 +++++++++++++++++++ .../src/main/resources/application.yml | 4 +++ .../src/main/resources/templates/products.ftl | 14 ++++++--- .../producer/service/impl/ProductService.java | 16 ++++++---- .../src/main/resources/application.yml | 1 + spring-cloud/spring-cloud-hystrix/README.md | 3 ++ .../consumer/ConsumerApplication.java | 18 +++++++---- .../consumer/controller/CustomController.java | 17 ++++++++++ .../src/main/resources/application.yml | 8 ++++- .../spring-cloud-hystrix/producer/pom.xml | 20 ++++++++++++ .../producer/ProducerApplication.java | 13 ++++++++ .../producer/controller/CustomController.java | 24 ++++++++++++++ .../controller/ProducerController.java | 3 ++ .../producer/service/CustomService.java | 28 +++++++++++++++++ .../producer/service/api/ICustomService.java | 11 +++++++ .../src/main/resources/application.yml | 6 ++++ .../turbine/TurbineApplication.java | 14 --------- .../src/main/resources/application.yml | 10 +++--- 19 files changed, 206 insertions(+), 38 deletions(-) create mode 100644 spring-cloud/spring-cloud-feign/consumer/src/main/java/com/heibaiying/consumer/feign/impl/CProductFeignImpl.java create mode 100644 spring-cloud/spring-cloud-hystrix/README.md create mode 100644 spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/controller/CustomController.java create mode 100644 spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/CustomController.java create mode 100644 spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/CustomService.java create mode 100644 spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/api/ICustomService.java diff --git a/spring-cloud/spring-cloud-feign/consumer/src/main/java/com/heibaiying/consumer/feign/CProductFeign.java b/spring-cloud/spring-cloud-feign/consumer/src/main/java/com/heibaiying/consumer/feign/CProductFeign.java index 99a72bc..9dcbff5 100644 --- a/spring-cloud/spring-cloud-feign/consumer/src/main/java/com/heibaiying/consumer/feign/CProductFeign.java +++ b/spring-cloud/spring-cloud-feign/consumer/src/main/java/com/heibaiying/consumer/feign/CProductFeign.java @@ -2,13 +2,14 @@ package com.heibaiying.consumer.feign; import com.heibaiying.common.feign.ProductFeign; import com.heibaiying.consumer.config.FeignConfig; +import com.heibaiying.consumer.feign.impl.CProductFeignImpl; import org.springframework.cloud.openfeign.FeignClient; /** * @author : heibaiying * @description : 声明式接口调用 */ -@FeignClient(value = "producer",configuration = FeignConfig.class) +@FeignClient(value = "producer",configuration = FeignConfig.class,fallback = CProductFeignImpl.class) public interface CProductFeign extends ProductFeign { } diff --git a/spring-cloud/spring-cloud-feign/consumer/src/main/java/com/heibaiying/consumer/feign/impl/CProductFeignImpl.java b/spring-cloud/spring-cloud-feign/consumer/src/main/java/com/heibaiying/consumer/feign/impl/CProductFeignImpl.java new file mode 100644 index 0000000..8196a8e --- /dev/null +++ b/spring-cloud/spring-cloud-feign/consumer/src/main/java/com/heibaiying/consumer/feign/impl/CProductFeignImpl.java @@ -0,0 +1,31 @@ +package com.heibaiying.consumer.feign.impl; + +import com.heibaiying.common.bean.Product; +import com.heibaiying.consumer.feign.CProductFeign; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author : heibaiying + * @description : 定义发生错误时候的熔断处理。除了继承自CProductFeign,还需要用@Component声明为spring的组件 + */ +@Component +public class CProductFeignImpl implements CProductFeign { + + @Override + public List productList() { + return new ArrayList<>(); + } + + @Override + public Product productDetail(int id) { + return null; + } + + @Override + public void save(Product product) { + + } +} diff --git a/spring-cloud/spring-cloud-feign/consumer/src/main/resources/application.yml b/spring-cloud/spring-cloud-feign/consumer/src/main/resources/application.yml index 80bc166..784d0d6 100644 --- a/spring-cloud/spring-cloud-feign/consumer/src/main/resources/application.yml +++ b/spring-cloud/spring-cloud-feign/consumer/src/main/resources/application.yml @@ -9,3 +9,7 @@ eureka: client: serviceUrl: defaultZone: http://localhost:8010/eureka/ +feign: + hystrix: + # 如果为true,则OpenFign客户端将使用Hystrix断路器进行封装 默认为false + enabled: true diff --git a/spring-cloud/spring-cloud-feign/consumer/src/main/resources/templates/products.ftl b/spring-cloud/spring-cloud-feign/consumer/src/main/resources/templates/products.ftl index 14eff50..c464f40 100644 --- a/spring-cloud/spring-cloud-feign/consumer/src/main/resources/templates/products.ftl +++ b/spring-cloud/spring-cloud-feign/consumer/src/main/resources/templates/products.ftl @@ -10,11 +10,15 @@ diff --git a/spring-cloud/spring-cloud-feign/producer/src/main/java/com/heibaiying/producer/service/impl/ProductService.java b/spring-cloud/spring-cloud-feign/producer/src/main/java/com/heibaiying/producer/service/impl/ProductService.java index 351e71e..1cb959b 100644 --- a/spring-cloud/spring-cloud-feign/producer/src/main/java/com/heibaiying/producer/service/impl/ProductService.java +++ b/spring-cloud/spring-cloud-feign/producer/src/main/java/com/heibaiying/producer/service/impl/ProductService.java @@ -9,6 +9,8 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; /** * @author : heibaiying @@ -20,16 +22,18 @@ public class ProductService implements IProductService, ApplicationListener productList = new ArrayList<>(); public Product queryProductById(int id) { - for (Product product : productList) { - if (product.getId() == id) { - return product; - } - } - return null; + return productList.stream().filter(p->p.getId()==id).collect(Collectors.toList()).get(0); } public List queryAllProducts() { + // 用于测试 hystrix 超时熔断 + try { + int i = new Random().nextInt(2500); + Thread.sleep(i); + } catch (InterruptedException e) { + e.printStackTrace(); + } return productList; } diff --git a/spring-cloud/spring-cloud-feign/producer/src/main/resources/application.yml b/spring-cloud/spring-cloud-feign/producer/src/main/resources/application.yml index 86c3b51..5ca7302 100644 --- a/spring-cloud/spring-cloud-feign/producer/src/main/resources/application.yml +++ b/spring-cloud/spring-cloud-feign/producer/src/main/resources/application.yml @@ -9,3 +9,4 @@ eureka: client: serviceUrl: defaultZone: http://localhost:8010/eureka/ + diff --git a/spring-cloud/spring-cloud-hystrix/README.md b/spring-cloud/spring-cloud-hystrix/README.md new file mode 100644 index 0000000..342e81d --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/README.md @@ -0,0 +1,3 @@ +http://localhost:8040/turbine.stream + +http://localhost:8020/actuator/hystrix.stream \ No newline at end of file diff --git a/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/ConsumerApplication.java b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/ConsumerApplication.java index f57d318..78ac787 100644 --- a/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/ConsumerApplication.java +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/ConsumerApplication.java @@ -15,7 +15,17 @@ import org.springframework.context.annotation.Bean; @EnableHystrixDashboard public class ConsumerApplication { - @Bean + public static void main(String[] args) { + SpringApplication.run(ConsumerApplication.class, args); + } + + + /* + * 这种方式对servlet进行注册和在配置文件中开启端点是等效的 + * 可以在启动的监控日志中看到端点的注册信息: + * o.s.b.a.e.web.ServletEndpointRegistrar : Registered '/actuator/hystrix.stream' to hystrix.stream-actuator-endpoint + + @Bean public ServletRegistrationBean getServlet() { HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); @@ -23,11 +33,7 @@ public class ConsumerApplication { registrationBean.addUrlMappings("/actuator/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; - } - - public static void main(String[] args) { - SpringApplication.run(ConsumerApplication.class, args); - } + }*/ } diff --git a/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/controller/CustomController.java b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/controller/CustomController.java new file mode 100644 index 0000000..dc7444c --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/controller/CustomController.java @@ -0,0 +1,17 @@ +package com.heibaiying.consumer.controller; + + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author : heibaiying + */ +@RestController +public class CustomController { + + @GetMapping("consumers") + public String queryCustoms() { + return "用户产品偏好列表生成中,请月底再获取"; + } +} diff --git a/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/application.yml b/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/application.yml index 76a91fa..87261f0 100644 --- a/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/application.yml +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 8080 + port: 8030 # 指定服务命名 spring: application: @@ -9,4 +9,10 @@ eureka: client: serviceUrl: defaultZone: http://localhost:8010/eureka/ +management: + endpoints: + web: + exposure: + # 需要开启hystrix.stream端点的暴露 这样才能获取到监控信息 * 代表开启可监控端点 + include: "*" diff --git a/spring-cloud/spring-cloud-hystrix/producer/pom.xml b/spring-cloud/spring-cloud-hystrix/producer/pom.xml index a02e3d3..263bcb5 100644 --- a/spring-cloud/spring-cloud-hystrix/producer/pom.xml +++ b/spring-cloud/spring-cloud-hystrix/producer/pom.xml @@ -27,6 +27,26 @@ 0.0.1-SNAPSHOT compile + + + org.springframework.cloud + spring-cloud-starter-netflix-ribbon + + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix-dashboard + + + + org.springframework.boot + spring-boot-starter-actuator + diff --git a/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/ProducerApplication.java b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/ProducerApplication.java index cb8e8fc..93bd8ed 100644 --- a/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/ProducerApplication.java +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/ProducerApplication.java @@ -3,11 +3,24 @@ package com.heibaiying.producer; 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.cloud.netflix.hystrix.EnableHystrix; +import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient +@EnableHystrix +@EnableHystrixDashboard public class ProducerApplication { + @LoadBalanced // 配置客户端负载均衡 + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + public static void main(String[] args) { SpringApplication.run(ProducerApplication.class, args); } diff --git a/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/CustomController.java b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/CustomController.java new file mode 100644 index 0000000..4fcd57d --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/CustomController.java @@ -0,0 +1,24 @@ +package com.heibaiying.producer.controller; + +import com.heibaiying.producer.service.api.ICustomService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author : heibaiying + * @description : 用来测试turbine聚合监控功能的接口 调用了custom的服务 + */ +@RestController +public class CustomController { + + @Autowired + private ICustomService customService; + + @GetMapping("consumers") + public String queryCustoms() { + return customService.queryCustoms(); + } +} diff --git a/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/ProducerController.java b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/ProducerController.java index c625b5c..9fa2efb 100644 --- a/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/ProducerController.java +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/ProducerController.java @@ -3,6 +3,7 @@ package com.heibaiying.producer.controller; import com.heibaiying.common.api.IProductService; import com.heibaiying.common.bean.Product; +import com.heibaiying.producer.service.api.ICustomService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -17,6 +18,7 @@ public class ProducerController { @Autowired private IProductService productService; + @GetMapping("products") public List productList() { return productService.queryAllProducts(); @@ -31,4 +33,5 @@ public class ProducerController { public void save(@RequestBody Product product) { productService.saveProduct(product); } + } diff --git a/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/CustomService.java b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/CustomService.java new file mode 100644 index 0000000..98f616b --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/CustomService.java @@ -0,0 +1,28 @@ +package com.heibaiying.producer.service; + +import com.heibaiying.producer.service.api.ICustomService; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +/** + * @author : heibaiying + */ +@Service +public class CustomService implements ICustomService { + + @Autowired + RestTemplate restTemplate; + + @Override + @HystrixCommand(fallbackMethod = "queryCustomsFail") + public String queryCustoms() { + return restTemplate.getForObject("http://consumer/consumers", String.class); + } + + public String queryCustomsFail() { + return "获取用户列表失败"; + } + +} diff --git a/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/api/ICustomService.java b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/api/ICustomService.java new file mode 100644 index 0000000..bee26a5 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/api/ICustomService.java @@ -0,0 +1,11 @@ +package com.heibaiying.producer.service.api; + +/** + * @author : heibaiying + * @description : 用户接口 + */ +public interface ICustomService { + + String queryCustoms(); + +} diff --git a/spring-cloud/spring-cloud-hystrix/producer/src/main/resources/application.yml b/spring-cloud/spring-cloud-hystrix/producer/src/main/resources/application.yml index 86c3b51..3f7685e 100644 --- a/spring-cloud/spring-cloud-hystrix/producer/src/main/resources/application.yml +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/resources/application.yml @@ -9,3 +9,9 @@ eureka: client: serviceUrl: defaultZone: http://localhost:8010/eureka/ +management: + endpoints: + web: + exposure: + # 需要开启hystrix.stream端点的暴露 这样才能获取到监控信息 * 代表开启可监控端点 + include: "*" diff --git a/spring-cloud/spring-cloud-hystrix/turbine/src/main/java/com/heibaiying/turbine/TurbineApplication.java b/spring-cloud/spring-cloud-hystrix/turbine/src/main/java/com/heibaiying/turbine/TurbineApplication.java index 2b9a607..76aaa27 100644 --- a/spring-cloud/spring-cloud-hystrix/turbine/src/main/java/com/heibaiying/turbine/TurbineApplication.java +++ b/spring-cloud/spring-cloud-hystrix/turbine/src/main/java/com/heibaiying/turbine/TurbineApplication.java @@ -1,14 +1,11 @@ package com.heibaiying.turbine; -import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; import org.springframework.cloud.netflix.turbine.EnableTurbine; -import org.springframework.context.annotation.Bean; @SpringBootApplication @EnableDiscoveryClient @@ -17,17 +14,6 @@ import org.springframework.context.annotation.Bean; @EnableTurbine public class TurbineApplication { - - @Bean - public ServletRegistrationBean getServlet() { - HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); - ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); - registrationBean.setLoadOnStartup(1); - registrationBean.addUrlMappings("/hystrix.stream"); - registrationBean.setName("HystrixMetricsStreamServlet"); - return registrationBean; - } - public static void main(String[] args) { SpringApplication.run(TurbineApplication.class, args); } diff --git a/spring-cloud/spring-cloud-hystrix/turbine/src/main/resources/application.yml b/spring-cloud/spring-cloud-hystrix/turbine/src/main/resources/application.yml index c6bb80d..9659570 100644 --- a/spring-cloud/spring-cloud-hystrix/turbine/src/main/resources/application.yml +++ b/spring-cloud/spring-cloud-hystrix/turbine/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 8090 + port: 8040 # 指定服务命名 spring: application: @@ -13,9 +13,9 @@ eureka: turbine: aggregator: cluster-config: default - app-config: consumer - clusterNameExpression: new String("default") - instanceUrlSuffix: - default: actuator/hystrix.stream + combine-host-port: true + app-config: consumer,producer + clusterNameExpression: "'default'" +