diff --git a/spring-cloud/spring-cloud-hystrix/common/pom.xml b/spring-cloud/spring-cloud-hystrix/common/pom.xml new file mode 100644 index 0000000..0e0aa7f --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/common/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + + com.heibaiying.hystrix + spring-cloud-hystrx + 0.0.1-SNAPSHOT + + + common + + diff --git a/spring-cloud/spring-cloud-hystrix/common/src/main/java/com/heibaiying/common/CommonApplication.java b/spring-cloud/spring-cloud-hystrix/common/src/main/java/com/heibaiying/common/CommonApplication.java new file mode 100644 index 0000000..3675fb8 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/common/src/main/java/com/heibaiying/common/CommonApplication.java @@ -0,0 +1,14 @@ +package com.heibaiying.common; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CommonApplication { + + public static void main(String[] args) { + SpringApplication.run(CommonApplication.class, args); + } + +} + diff --git a/spring-cloud/spring-cloud-hystrix/common/src/main/java/com/heibaiying/common/api/IProductService.java b/spring-cloud/spring-cloud-hystrix/common/src/main/java/com/heibaiying/common/api/IProductService.java new file mode 100644 index 0000000..7296ffd --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/common/src/main/java/com/heibaiying/common/api/IProductService.java @@ -0,0 +1,18 @@ +package com.heibaiying.common.api; + +import com.heibaiying.common.bean.Product; + +import java.util.List; + +/** + * @author : heibaiying + * @description : 产品服务接口类 + */ +public interface IProductService { + + Product queryProductById(int id); + + List queryAllProducts(); + + void saveProduct(Product product); +} diff --git a/spring-cloud/spring-cloud-hystrix/common/src/main/java/com/heibaiying/common/bean/Product.java b/spring-cloud/spring-cloud-hystrix/common/src/main/java/com/heibaiying/common/bean/Product.java new file mode 100644 index 0000000..75c3f5b --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/common/src/main/java/com/heibaiying/common/bean/Product.java @@ -0,0 +1,33 @@ +package com.heibaiying.common.bean; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author : heibaiying + * @description : 产品实体类 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Product implements Serializable { + + // 产品序列号 + private long id; + + // 产品名称 + private String name; + + // 是否贵重品 + private Boolean isPrecious; + + //生产日期 + private Date dateInProduced; + + //产品价格 + private float price; +} diff --git a/spring-cloud/spring-cloud-hystrix/common/src/test/java/com/heibaiying/common/CommonApplicationTests.java b/spring-cloud/spring-cloud-hystrix/common/src/test/java/com/heibaiying/common/CommonApplicationTests.java new file mode 100644 index 0000000..b02d448 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/common/src/test/java/com/heibaiying/common/CommonApplicationTests.java @@ -0,0 +1,17 @@ +package com.heibaiying.common; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class CommonApplicationTests { + + @Test + public void contextLoads() { + } + +} + diff --git a/spring-cloud/spring-cloud-hystrix/consumer/pom.xml b/spring-cloud/spring-cloud-hystrix/consumer/pom.xml new file mode 100644 index 0000000..85c007f --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + + com.heibaiying.hystrix + spring-cloud-hystrx + 0.0.1-SNAPSHOT + + + consumer + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.boot + spring-boot-starter-freemarker + + + + 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 + + + + com.heibaiying.hystrix + common + 0.0.1-SNAPSHOT + compile + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + 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 new file mode 100644 index 0000000..f57d318 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/ConsumerApplication.java @@ -0,0 +1,33 @@ +package com.heibaiying.consumer; + +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.context.annotation.Bean; + +@SpringBootApplication +@EnableDiscoveryClient +@EnableHystrix +@EnableHystrixDashboard +public class ConsumerApplication { + + @Bean + public ServletRegistrationBean getServlet() { + HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); + ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); + registrationBean.setLoadOnStartup(1); + 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/config/RibbonConfig.java b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/config/RibbonConfig.java new file mode 100644 index 0000000..95f4ead --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/config/RibbonConfig.java @@ -0,0 +1,21 @@ +package com.heibaiying.consumer.config; + +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +/** + * @author : heibaiying + */ +@Configuration +public class RibbonConfig { + + @LoadBalanced // 配置客户端负载均衡 + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} + + diff --git a/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/controller/SellController.java b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/controller/SellController.java new file mode 100644 index 0000000..2b5d6f7 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/controller/SellController.java @@ -0,0 +1,45 @@ +package com.heibaiying.consumer.controller; + + +import com.heibaiying.common.api.IProductService; +import com.heibaiying.common.bean.Product; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; + +/** + * @author : heibaiying + */ +@Controller +@RequestMapping("sell") +public class SellController { + + @Autowired + private IProductService productService; + + @GetMapping("products") + public String productList(Model model) { + List products = productService.queryAllProducts(); + model.addAttribute("products", products); + return "products"; + } + + @GetMapping("product/{id}") + public String productDetail(@PathVariable int id, Model model) { + Product product = productService.queryProductById(id); + model.addAttribute("product", product); + return "product"; + } + + @PostMapping("product") + public String save(@RequestParam String productName) { + long id = Math.round(Math.random() * 100); + Product product = new Product(id, productName, false, new Date(), 88); + productService.saveProduct(product); + return "redirect:products"; + } +} diff --git a/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/service/ProductService.java b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/service/ProductService.java new file mode 100644 index 0000000..d77f94d --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/java/com/heibaiying/consumer/service/ProductService.java @@ -0,0 +1,46 @@ +package com.heibaiying.consumer.service; + +import com.heibaiying.common.api.IProductService; +import com.heibaiying.common.bean.Product; +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.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author : heibaiying + * @description : 产品提供接口实现类 + */ +@Service +public class ProductService implements IProductService { + + @Autowired + private RestTemplate restTemplate; + + + @HystrixCommand(fallbackMethod = "queryProductsFail") + public List queryAllProducts() { + ResponseEntity responseEntity = restTemplate.getForEntity("http://producer/products", List.class); + List productList = responseEntity.getBody(); + return productList; + } + + public Product queryProductById(int id) { + ResponseEntity responseEntity = restTemplate.getForEntity("http://producer/product/{1}", Product.class, id); + return responseEntity.getBody(); + } + + + public void saveProduct(Product product) { + restTemplate.postForObject("http://producer/product", product, Void.class); + } + + public List queryProductsFail() { + return new ArrayList<>(); + } +} 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 new file mode 100644 index 0000000..76a91fa --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/application.yml @@ -0,0 +1,12 @@ +server: + port: 8080 +# 指定服务命名 +spring: + application: + name: consumer +# 指定注册中心地址 +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8010/eureka/ + diff --git a/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/templates/product.ftl b/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/templates/product.ftl new file mode 100644 index 0000000..729f516 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/templates/product.ftl @@ -0,0 +1,15 @@ + + + + 产品详情 + + +
    +
  • 产品名称:${product.name}
  • +
  • 产品序列号:${product.id}
  • +
  • 是否贵重品:${product.isPrecious?string('是','否')}
  • +
  • 生产日期: ${product.dateInProduced?string("yyyy-MM-dd HH:mm:ss")}
  • +
  • 产品价格:${product.price}
  • +
+ + diff --git a/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/templates/products.ftl b/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/templates/products.ftl new file mode 100644 index 0000000..c464f40 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/main/resources/templates/products.ftl @@ -0,0 +1,24 @@ + + + + 产品列表 + + +

产品列表:点击查看详情

+
+ + +
+
    + <#if (products?size>0) > + <#list products as product> +
  • + ${product.name} +
  • + + <#else> +

    当前排队人数过多,请之后再购买!

    + +
+ + diff --git a/spring-cloud/spring-cloud-hystrix/consumer/src/test/java/com/heibaiying/consumer/ConsumerApplicationTests.java b/spring-cloud/spring-cloud-hystrix/consumer/src/test/java/com/heibaiying/consumer/ConsumerApplicationTests.java new file mode 100644 index 0000000..82f5399 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/consumer/src/test/java/com/heibaiying/consumer/ConsumerApplicationTests.java @@ -0,0 +1,17 @@ +package com.heibaiying.consumer; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ConsumerApplicationTests { + + @Test + public void contextLoads() { + } + +} + diff --git a/spring-cloud/spring-cloud-hystrix/eureka/pom.xml b/spring-cloud/spring-cloud-hystrix/eureka/pom.xml new file mode 100644 index 0000000..fc53853 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/eureka/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + + com.heibaiying.hystrix + spring-cloud-hystrx + 0.0.1-SNAPSHOT + + + eureka + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-server + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud/spring-cloud-hystrix/eureka/src/main/java/com/heibaiying/eureka/EurekaApplication.java b/spring-cloud/spring-cloud-hystrix/eureka/src/main/java/com/heibaiying/eureka/EurekaApplication.java new file mode 100644 index 0000000..bd54938 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/eureka/src/main/java/com/heibaiying/eureka/EurekaApplication.java @@ -0,0 +1,16 @@ +package com.heibaiying.eureka; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; + +@SpringBootApplication +@EnableEurekaServer +public class EurekaApplication { + + public static void main(String[] args) { + SpringApplication.run(EurekaApplication.class, args); + } + +} + diff --git a/spring-cloud/spring-cloud-hystrix/eureka/src/main/resources/application.yml b/spring-cloud/spring-cloud-hystrix/eureka/src/main/resources/application.yml new file mode 100644 index 0000000..817356d --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/eureka/src/main/resources/application.yml @@ -0,0 +1,12 @@ +server: + port: 8010 +eureka: + instance: + hostname: localhost + client: + # 设置为false,代表不向注册中心注册自己 + register-with-eureka: false + # 注册中心主要用于维护服务,并不需要检索服务,所以设置为false + fetch-registry: false + serviceUrl: + defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ \ No newline at end of file diff --git a/spring-cloud/spring-cloud-hystrix/eureka/src/test/java/com/heibaiying/eureka/EurekaApplicationTests.java b/spring-cloud/spring-cloud-hystrix/eureka/src/test/java/com/heibaiying/eureka/EurekaApplicationTests.java new file mode 100644 index 0000000..b3e2d73 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/eureka/src/test/java/com/heibaiying/eureka/EurekaApplicationTests.java @@ -0,0 +1,17 @@ +package com.heibaiying.eureka; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class EurekaApplicationTests { + + @Test + public void contextLoads() { + } + +} + diff --git a/spring-cloud/spring-cloud-hystrix/pom.xml b/spring-cloud/spring-cloud-hystrix/pom.xml new file mode 100644 index 0000000..6889905 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + pom + + + org.springframework.boot + spring-boot-starter-parent + 2.1.2.RELEASE + + + + com.heibaiying.hystrix + spring-cloud-hystrx + 0.0.1-SNAPSHOT + spring-cloud-hystrix + feign project for Spring Boot + + + eureka + common + consumer + producer + turbine + + + + 1.8 + Finchley.SR2 + + + + + org.springframework.boot + spring-boot-starter + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + diff --git a/spring-cloud/spring-cloud-hystrix/producer/pom.xml b/spring-cloud/spring-cloud-hystrix/producer/pom.xml new file mode 100644 index 0000000..a02e3d3 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/producer/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + + com.heibaiying.hystrix + spring-cloud-hystrx + 0.0.1-SNAPSHOT + + + producer + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + + com.heibaiying.hystrix + common + 0.0.1-SNAPSHOT + compile + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + 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 new file mode 100644 index 0000000..cb8e8fc --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/ProducerApplication.java @@ -0,0 +1,16 @@ +package com.heibaiying.producer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +@SpringBootApplication +@EnableDiscoveryClient +public class ProducerApplication { + + 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/ProducerController.java b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/ProducerController.java new file mode 100644 index 0000000..c625b5c --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/controller/ProducerController.java @@ -0,0 +1,34 @@ +package com.heibaiying.producer.controller; + + +import com.heibaiying.common.api.IProductService; +import com.heibaiying.common.bean.Product; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author : heibaiying + */ +@RestController +public class ProducerController { + + @Autowired + private IProductService productService; + + @GetMapping("products") + public List productList() { + return productService.queryAllProducts(); + } + + @GetMapping("product/{id}") + public Product productDetail(@PathVariable int id) { + return productService.queryProductById(id); + } + + @PostMapping("product") + 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/ProductService.java b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/ProductService.java new file mode 100644 index 0000000..f55bfc9 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/java/com/heibaiying/producer/service/ProductService.java @@ -0,0 +1,56 @@ +package com.heibaiying.producer.service; + +import com.heibaiying.common.api.IProductService; +import com.heibaiying.common.bean.Product; +import org.springframework.boot.web.context.WebServerInitializedEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Random; + +/** + * @author : heibaiying + * @description : 产品提供接口实现类 + */ +@Service +public class ProductService implements IProductService, ApplicationListener { + + private static List productList = new ArrayList<>(); + + public Product queryProductById(int id) { + for (Product product : productList) { + if (product.getId() == id) { + return product; + } + } + return null; + } + + + public List queryAllProducts() { + // hystrix 默认超时是2秒 + int i = new Random().nextInt(2500); + try { + Thread.sleep(i); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return productList; + } + + @Override + public void saveProduct(Product product) { + productList.add(product); + } + + @Override + public void onApplicationEvent(WebServerInitializedEvent event) { + int port = event.getWebServer().getPort(); + for (long i = 0; i < 20; i++) { + productList.add(new Product(i, port + "产品" + i, i / 2 == 0, new Date(), 66.66f * i)); + } + } +} 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 new file mode 100644 index 0000000..86c3b51 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/producer/src/main/resources/application.yml @@ -0,0 +1,11 @@ +server: + port: 8020 +# 指定服务命名 +spring: + application: + name: producer +# 指定注册中心地址 +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8010/eureka/ diff --git a/spring-cloud/spring-cloud-hystrix/producer/src/test/java/com/heibaiying/producer/ProducerApplicationTests.java b/spring-cloud/spring-cloud-hystrix/producer/src/test/java/com/heibaiying/producer/ProducerApplicationTests.java new file mode 100644 index 0000000..54cac2d --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/producer/src/test/java/com/heibaiying/producer/ProducerApplicationTests.java @@ -0,0 +1,17 @@ +package com.heibaiying.producer; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ProducerApplicationTests { + + @Test + public void contextLoads() { + } + +} + diff --git a/spring-cloud/spring-cloud-hystrix/turbine/pom.xml b/spring-cloud/spring-cloud-hystrix/turbine/pom.xml new file mode 100644 index 0000000..52dd7cb --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/turbine/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + + com.heibaiying.hystrix + spring-cloud-hystrx + 0.0.1-SNAPSHOT + + + turbine + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix-dashboard + + + org.springframework.cloud + spring-cloud-starter-netflix-turbine + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + 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 new file mode 100644 index 0000000..2b9a607 --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/turbine/src/main/java/com/heibaiying/turbine/TurbineApplication.java @@ -0,0 +1,36 @@ +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 +@EnableHystrix +@EnableHystrixDashboard +@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 new file mode 100644 index 0000000..c6bb80d --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/turbine/src/main/resources/application.yml @@ -0,0 +1,21 @@ +server: + port: 8090 +# 指定服务命名 +spring: + application: + name: turbine +# 指定注册中心地址 +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8010/eureka/ +# 指定聚合的项目 +turbine: + aggregator: + cluster-config: default + app-config: consumer + clusterNameExpression: new String("default") + instanceUrlSuffix: + default: actuator/hystrix.stream + + diff --git a/spring-cloud/spring-cloud-hystrix/turbine/src/test/java/com/heibaiying/turbine/TurbineApplicationTests.java b/spring-cloud/spring-cloud-hystrix/turbine/src/test/java/com/heibaiying/turbine/TurbineApplicationTests.java new file mode 100644 index 0000000..618d99a --- /dev/null +++ b/spring-cloud/spring-cloud-hystrix/turbine/src/test/java/com/heibaiying/turbine/TurbineApplicationTests.java @@ -0,0 +1,17 @@ +package com.heibaiying.turbine; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class TurbineApplicationTests { + + @Test + public void contextLoads() { + } + +} +