diff --git a/pictures/zuul-broker.png b/pictures/zuul-broker.png new file mode 100644 index 0000000..d75a91f Binary files /dev/null and b/pictures/zuul-broker.png differ diff --git a/pictures/zuul-consumer-8030.png b/pictures/zuul-consumer-8030.png new file mode 100644 index 0000000..d28a325 Binary files /dev/null and b/pictures/zuul-consumer-8030.png differ diff --git a/pictures/zuul-consumer-8040.png b/pictures/zuul-consumer-8040.png new file mode 100644 index 0000000..ffbb443 Binary files /dev/null and b/pictures/zuul-consumer-8040.png differ diff --git a/pictures/zuul-consumer.png b/pictures/zuul-consumer.png new file mode 100644 index 0000000..444c761 Binary files /dev/null and b/pictures/zuul-consumer.png differ diff --git a/pictures/zuul-producer.png b/pictures/zuul-producer.png new file mode 100644 index 0000000..eb9c18b Binary files /dev/null and b/pictures/zuul-producer.png differ diff --git a/spring-cloud/spring-cloud-feign/eureka/pom.xml b/spring-cloud/spring-cloud-feign/eureka/pom.xml index 05f297d..1023ab4 100644 --- a/spring-cloud/spring-cloud-feign/eureka/pom.xml +++ b/spring-cloud/spring-cloud-feign/eureka/pom.xml @@ -4,8 +4,8 @@ 4.0.0 - com.heibaiying - spring-cloud-ribbon + com.heibaiying.feign + spring-cloud-feign 0.0.1-SNAPSHOT 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 1cb959b..35ff1cf 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 @@ -27,13 +27,13 @@ public class ProductService implements IProductService, ApplicationListener queryAllProducts() { - // 用于测试 hystrix 超时熔断 + /*用于测试 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-zuul/README.md b/spring-cloud/spring-cloud-zuul/README.md new file mode 100644 index 0000000..ae21953 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/README.md @@ -0,0 +1,11 @@ +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +The bean 'counterFactory', defined in class path resource [org/springframework/cloud/netflix/zuul/ZuulServerAutoConfiguration$ZuulCounterFactoryConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [org/springframework/cloud/netflix/zuul/ZuulServerAutoConfiguration$ZuulMetricsConfiguration.class] and overriding is disabled. + +Action: + +Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul/common/pom.xml b/spring-cloud/spring-cloud-zuul/common/pom.xml new file mode 100644 index 0000000..c990214 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/common/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + + com.heibaiying.zuul + spring-cloud-zuul + 0.0.1-SNAPSHOT + + + common + + + + org.springframework.boot + spring-boot-starter-web + + + + + diff --git a/spring-cloud/spring-cloud-zuul/common/src/main/java/com/heibaiying/common/CommonApplication.java b/spring-cloud/spring-cloud-zuul/common/src/main/java/com/heibaiying/common/CommonApplication.java new file mode 100644 index 0000000..3675fb8 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/common/src/main/java/com/heibaiying/common/bean/Product.java b/spring-cloud/spring-cloud-zuul/common/src/main/java/com/heibaiying/common/bean/Product.java new file mode 100644 index 0000000..75c3f5b --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/common/src/main/java/com/heibaiying/common/feign/ProductFeign.java b/spring-cloud/spring-cloud-zuul/common/src/main/java/com/heibaiying/common/feign/ProductFeign.java new file mode 100644 index 0000000..ddcb2e3 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/common/src/main/java/com/heibaiying/common/feign/ProductFeign.java @@ -0,0 +1,27 @@ +package com.heibaiying.common.feign; + +import com.heibaiying.common.bean.Product; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author : heibaiying + * @description : 声明式接口调用 + */ +public interface ProductFeign { + + @GetMapping("products") + List productList(); + + /** + * 这是需要强调的是使用feign时候@PathVariable一定要用value指明参数, + * 不然会抛出.IllegalStateException: PathVariable annotation was empty on param 异常 + */ + @GetMapping("product/{id}") + Product productDetail(@PathVariable(value = "id") int id); + + + @PostMapping("product") + void save(@RequestBody Product product); +} diff --git a/spring-cloud/spring-cloud-zuul/common/src/test/java/com/heibaiying/common/CommonApplicationTests.java b/spring-cloud/spring-cloud-zuul/common/src/test/java/com/heibaiying/common/CommonApplicationTests.java new file mode 100644 index 0000000..b02d448 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/consumer/pom.xml b/spring-cloud/spring-cloud-zuul/consumer/pom.xml new file mode 100644 index 0000000..e5cc1aa --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/consumer/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + com.heibaiying.zuul + spring-cloud-zuul + 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-openfeign + + + + com.heibaiying.zuul + common + 0.0.1-SNAPSHOT + compile + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/ConsumerApplication.java b/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/ConsumerApplication.java new file mode 100644 index 0000000..8116bec --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/ConsumerApplication.java @@ -0,0 +1,18 @@ +package com.heibaiying.consumer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@SpringBootApplication +@EnableDiscoveryClient +@EnableFeignClients +public class ConsumerApplication { + + public static void main(String[] args) { + SpringApplication.run(ConsumerApplication.class, args); + } + +} + diff --git a/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/config/FeignConfig.java b/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/config/FeignConfig.java new file mode 100644 index 0000000..e0ba1cc --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/config/FeignConfig.java @@ -0,0 +1,20 @@ +package com.heibaiying.consumer.config; + +import feign.Retryer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import static java.util.concurrent.TimeUnit.SECONDS; + +/** + * @author : heibaiying + * @description : feign 配置 + */ +@Configuration +public class FeignConfig { + + @Bean + public Retryer retryer(){ + //重试间隔为 100ms,最大重试时间为 1s, 重试次数为 5 次 + return new Retryer.Default(100,SECONDS.toMillis(1),5); + } +} diff --git a/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/controller/SellController.java b/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/controller/SellController.java new file mode 100644 index 0000000..88cf933 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/controller/SellController.java @@ -0,0 +1,48 @@ +package com.heibaiying.consumer.controller; + + +import com.heibaiying.common.bean.Product; +import com.heibaiying.consumer.feign.CProductFeign; +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; +import java.util.stream.Collectors; + +/** + * @author : heibaiying + */ +@Controller +@RequestMapping("sell") +public class SellController { + + @Autowired + private CProductFeign cproductFeign; + + @GetMapping("products") + public String productList(Model model) { + List products = cproductFeign.productList(); + model.addAttribute("products", products); + return "products"; + } + + + @GetMapping("product/{id}") + public String productDetail(@PathVariable int id, Model model) { + Product product = cproductFeign.productDetail(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); + cproductFeign.save(product); + return "redirect:products"; + } +} diff --git a/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/feign/CProductFeign.java b/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/feign/CProductFeign.java new file mode 100644 index 0000000..9dcbff5 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/feign/CProductFeign.java @@ -0,0 +1,15 @@ +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,fallback = CProductFeignImpl.class) +public interface CProductFeign extends ProductFeign { + +} diff --git a/spring-cloud/spring-cloud-zuul/consumer/src/main/java/com/heibaiying/consumer/feign/impl/CProductFeignImpl.java b/spring-cloud/spring-cloud-zuul/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-zuul/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-zuul/consumer/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul/consumer/src/main/resources/application.yml new file mode 100644 index 0000000..784d0d6 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/consumer/src/main/resources/application.yml @@ -0,0 +1,15 @@ +server: + port: 8080 +# 指定服务命名 +spring: + application: + name: consumer +# 指定注册中心地址 +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8010/eureka/ +feign: + hystrix: + # 如果为true,则OpenFign客户端将使用Hystrix断路器进行封装 默认为false + enabled: true diff --git a/spring-cloud/spring-cloud-zuul/consumer/src/main/resources/templates/product.ftl b/spring-cloud/spring-cloud-zuul/consumer/src/main/resources/templates/product.ftl new file mode 100644 index 0000000..729f516 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/consumer/src/main/resources/templates/products.ftl b/spring-cloud/spring-cloud-zuul/consumer/src/main/resources/templates/products.ftl new file mode 100644 index 0000000..c83dc5d --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/consumer/src/test/java/com/heibaiying/consumer/ConsumerApplicationTests.java b/spring-cloud/spring-cloud-zuul/consumer/src/test/java/com/heibaiying/consumer/ConsumerApplicationTests.java new file mode 100644 index 0000000..82f5399 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/eureka/pom.xml b/spring-cloud/spring-cloud-zuul/eureka/pom.xml new file mode 100644 index 0000000..8b23599 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/eureka/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + + com.heibaiying.zuul + spring-cloud-zuul + 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-zuul/eureka/src/main/java/com/heibaiying/eureka/EurekaApplication.java b/spring-cloud/spring-cloud-zuul/eureka/src/main/java/com/heibaiying/eureka/EurekaApplication.java new file mode 100644 index 0000000..bd54938 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/eureka/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul/eureka/src/main/resources/application.yml new file mode 100644 index 0000000..817356d --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/eureka/src/test/java/com/heibaiying/eureka/EurekaApplicationTests.java b/spring-cloud/spring-cloud-zuul/eureka/src/test/java/com/heibaiying/eureka/EurekaApplicationTests.java new file mode 100644 index 0000000..b3e2d73 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/pom.xml b/spring-cloud/spring-cloud-zuul/pom.xml new file mode 100644 index 0000000..c05b16a --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + pom + + + org.springframework.boot + spring-boot-starter-parent + 2.1.2.RELEASE + + + + com.heibaiying.zuul + spring-cloud-zuul + 0.0.1-SNAPSHOT + spring-cloud-zuul + zuul project for Spring Boot + + + eureka + common + consumer + producer + + + + 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-zuul/producer/pom.xml b/spring-cloud/spring-cloud-zuul/producer/pom.xml new file mode 100644 index 0000000..d4f84a9 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/producer/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + + com.heibaiying.zuul + spring-cloud-zuul + 0.0.1-SNAPSHOT + + + producer + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + + com.heibaiying.zuul + common + 0.0.1-SNAPSHOT + compile + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud/spring-cloud-zuul/producer/src/main/java/com/heibaiying/producer/ProducerApplication.java b/spring-cloud/spring-cloud-zuul/producer/src/main/java/com/heibaiying/producer/ProducerApplication.java new file mode 100644 index 0000000..cb8e8fc --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/producer/src/main/java/com/heibaiying/producer/controller/ProducerController.java b/spring-cloud/spring-cloud-zuul/producer/src/main/java/com/heibaiying/producer/controller/ProducerController.java new file mode 100644 index 0000000..7827491 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/producer/src/main/java/com/heibaiying/producer/controller/ProducerController.java @@ -0,0 +1,35 @@ +package com.heibaiying.producer.controller; + + +import com.heibaiying.common.bean.Product; +import com.heibaiying.common.feign.ProductFeign; +import com.heibaiying.producer.service.IProductService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author : heibaiying + */ +@RestController +public class ProducerController implements ProductFeign { + + @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-zuul/producer/src/main/java/com/heibaiying/producer/service/IProductService.java b/spring-cloud/spring-cloud-zuul/producer/src/main/java/com/heibaiying/producer/service/IProductService.java new file mode 100644 index 0000000..0a55013 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/producer/src/main/java/com/heibaiying/producer/service/IProductService.java @@ -0,0 +1,13 @@ +package com.heibaiying.producer.service; + +import com.heibaiying.common.bean.Product; + +import java.util.List; +public interface IProductService { + + Product queryProductById(int id) ; + + List queryAllProducts(); + + void saveProduct(Product product); +} diff --git a/spring-cloud/spring-cloud-zuul/producer/src/main/java/com/heibaiying/producer/service/impl/ProductService.java b/spring-cloud/spring-cloud-zuul/producer/src/main/java/com/heibaiying/producer/service/impl/ProductService.java new file mode 100644 index 0000000..caef1cf --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/producer/src/main/java/com/heibaiying/producer/service/impl/ProductService.java @@ -0,0 +1,44 @@ +package com.heibaiying.producer.service.impl; + +import com.heibaiying.common.bean.Product; +import com.heibaiying.producer.service.IProductService; +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.stream.Collectors; + +/** + * @author : heibaiying + * @description : 产品提供接口实现类 + */ +@Service +public class ProductService implements IProductService, ApplicationListener { + + private static List productList = new ArrayList<>(); + + public Product queryProductById(int id) { + return productList.stream().filter(p->p.getId()==id).collect(Collectors.toList()).get(0); + } + + + public List queryAllProducts() { + 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)); + } + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul/producer/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul/producer/src/main/resources/application.yml new file mode 100644 index 0000000..5ca7302 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/producer/src/main/resources/application.yml @@ -0,0 +1,12 @@ +server: + port: 8020 +# 指定服务命名 +spring: + application: + name: producer +# 指定注册中心地址 +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8010/eureka/ + diff --git a/spring-cloud/spring-cloud-zuul/producer/src/test/java/com/heibaiying/producer/ProducerApplicationTests.java b/spring-cloud/spring-cloud-zuul/producer/src/test/java/com/heibaiying/producer/ProducerApplicationTests.java new file mode 100644 index 0000000..54cac2d --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/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-zuul/zuul/pom.xml b/spring-cloud/spring-cloud-zuul/zuul/pom.xml new file mode 100644 index 0000000..b56467b --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/zuul/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + + + org.springframework.boot + spring-boot-starter-parent + 2.0.8.RELEASE + + + + zuul + + + 1.8 + Finchley.SR2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-freemarker + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + + org.springframework.cloud + spring-cloud-starter-netflix-zuul + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + diff --git a/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/ZuulApplication.java b/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/ZuulApplication.java new file mode 100644 index 0000000..ba19b9d --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/ZuulApplication.java @@ -0,0 +1,18 @@ +package com.heibaiying.zuul; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.netflix.zuul.EnableZuulProxy; + +@SpringBootApplication +@EnableZuulProxy +@EnableDiscoveryClient +public class ZuulApplication { + + public static void main(String[] args) { + SpringApplication.run(ZuulApplication.class, args); + } + +} + diff --git a/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/config/CustomZuulFallbackProvider.java b/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/config/CustomZuulFallbackProvider.java new file mode 100644 index 0000000..0955398 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/config/CustomZuulFallbackProvider.java @@ -0,0 +1,81 @@ +package com.heibaiying.zuul.config; + +import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Component; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * @author : heibaiying + * @description : zuul 的熔断器 + */ +@Component +public class CustomZuulFallbackProvider implements FallbackProvider { + + /* + * 定义熔断将用于哪些路由的服务 + */ + @Override + public String getRoute() { + return "consumer"; + } + + @Override + public ClientHttpResponse fallbackResponse(String route, Throwable cause) { + return new ClientHttpResponse() { + + /** + * 返回响应的HTTP状态代码 + */ + @Override + public HttpStatus getStatusCode() throws IOException { + return HttpStatus.SERVICE_UNAVAILABLE; + } + + /** + * 返回HTTP状态代码 + */ + @Override + public int getRawStatusCode() throws IOException { + return HttpStatus.SERVICE_UNAVAILABLE.value(); + } + + /** + * 返回响应的HTTP状态文本 + */ + @Override + public String getStatusText() throws IOException { + return HttpStatus.SERVICE_UNAVAILABLE.getReasonPhrase(); + } + + @Override + public void close() { + + } + + /** + * 将消息正文作为输入流返回 + */ + @Override + public InputStream getBody() throws IOException { + return new ByteArrayInputStream("商城崩溃了,请稍后重试!".getBytes()); + } + + /** + * 将消息正文作为输入流返回 + */ + @Override + public HttpHeaders getHeaders() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + return httpHeaders; + } + }; + } +} diff --git a/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/controller/LoginController.java b/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/controller/LoginController.java new file mode 100644 index 0000000..0c5d75d --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/controller/LoginController.java @@ -0,0 +1,26 @@ +package com.heibaiying.zuul.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.http.HttpSession; +import java.util.Random; + +/** + * @author : heibaiying + * @description : 登录 + */ +@Controller +public class LoginController { + + @RequestMapping("index") + public String login(){ + return "index"; + } + + @RequestMapping("login") + public String login(String username,HttpSession session){ + session.setAttribute("code",username+String.valueOf(new Random().nextInt(10*1000))); + return "redirect:/consumer/sell/products"; + } +} diff --git a/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/filter/CustomZuulFilter.java b/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/filter/CustomZuulFilter.java new file mode 100644 index 0000000..70c9036 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/zuul/src/main/java/com/heibaiying/zuul/filter/CustomZuulFilter.java @@ -0,0 +1,71 @@ +package com.heibaiying.zuul.filter; + +import com.netflix.zuul.ZuulFilter; +import com.netflix.zuul.context.RequestContext; +import com.netflix.zuul.exception.ZuulException; +import org.omg.CORBA.Request; +import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author : heibaiying + * @description : 自定义filter过滤器 + */ + +@Component +public class CustomZuulFilter extends ZuulFilter { + + /** + * 返回过滤器的类型 + */ + @Override + public String filterType() { + return FilterConstants.PRE_TYPE; + } + + /** + * 返回过滤器的优先级顺序 + */ + @Override + public int filterOrder() { + return 0; + } + + /** + * 从此方法返回“true”意味着应该调用下面的 run()方法 + */ + @Override + public boolean shouldFilter() { + return true; + } + + /** + * ZuulFilter的核心校验方法 + */ + @Override + public Object run() throws ZuulException { + RequestContext currentContext = RequestContext.getCurrentContext(); + HttpServletRequest request = currentContext.getRequest(); + String code = (String)request.getSession().getAttribute("code"); + if (StringUtils.isEmpty(code)){ + // 设置值为false 不将请求转发到对应的服务上 + currentContext.setSendZuulResponse(false); + // 设置返回的状态码 + currentContext.setResponseStatusCode(HttpStatus.NON_AUTHORITATIVE_INFORMATION.value()); + HttpServletResponse response = currentContext.getResponse(); + try { + // 跳转到登录页面 + response.sendRedirect("/index"); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } +} diff --git a/spring-cloud/spring-cloud-zuul/zuul/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul/zuul/src/main/resources/application.yml new file mode 100644 index 0000000..22fdfaa --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/zuul/src/main/resources/application.yml @@ -0,0 +1,22 @@ +server: + port: 8090 +# 指定服务命名 +spring: + application: + name: zuul +# 指定注册中心地址 +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8010/eureka/ +# 网关的路由 +zuul: + routes: + xxxx: #这个地方的值是可以任意的字符串 + path: /producer/** + serviceId: producer + consumer: + path: /consumer/** + serviceId: consumer + # 指定前缀 + # prefix: /v1 diff --git a/spring-cloud/spring-cloud-zuul/zuul/src/main/resources/templates/index.ftl b/spring-cloud/spring-cloud-zuul/zuul/src/main/resources/templates/index.ftl new file mode 100644 index 0000000..a6e2308 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/zuul/src/main/resources/templates/index.ftl @@ -0,0 +1,12 @@ + + + + Title + + +
+ + +
+ + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul/zuul/src/test/java/com/heibaiying/zuul/ZuulApplicationTests.java b/spring-cloud/spring-cloud-zuul/zuul/src/test/java/com/heibaiying/zuul/ZuulApplicationTests.java new file mode 100644 index 0000000..488c93a --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/zuul/src/test/java/com/heibaiying/zuul/ZuulApplicationTests.java @@ -0,0 +1,17 @@ +package com.heibaiying.zuul; + +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 ZuulApplicationTests { + + @Test + public void contextLoads() { + } + +} +