diff --git a/spring-cloud-zuul/pom.xml b/spring-cloud-zuul/pom.xml
new file mode 100644
index 0000000..dacec2a
--- /dev/null
+++ b/spring-cloud-zuul/pom.xml
@@ -0,0 +1,55 @@
+
+
+ 4.0.0
+ com.neo
+ spring-cloud-parent
+ 1.0.0.BUILD-SNAPSHOT
+
+
+ spring-cloud-zuul
+ spring-cloud-eureka
+ spring-cloud-producer
+ spring-cloud-producer-2
+
+
+ pom
+ Spring cloud zuul
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.9.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ Edgware.SR1
+
+
+
+
+ org.projectlombok
+ lombok
+ false
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-zuul/spring-cloud-eureka/pom.xml b/spring-cloud-zuul/spring-cloud-eureka/pom.xml
new file mode 100644
index 0000000..d90397c
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-eureka/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ com.neo
+ spring-cloud-parent
+ 1.0.0.BUILD-SNAPSHOT
+
+ 4.0.0
+
+ spring-cloud-eureka
+ jar
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka-server
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/spring-cloud-zuul/spring-cloud-eureka/src/main/java/com/neo/EurekaApplication.java b/spring-cloud-zuul/spring-cloud-eureka/src/main/java/com/neo/EurekaApplication.java
new file mode 100644
index 0000000..9b56040
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-eureka/src/main/java/com/neo/EurekaApplication.java
@@ -0,0 +1,14 @@
+package com.neo;
+
+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-zuul/spring-cloud-eureka/src/main/resources/application.properties b/spring-cloud-zuul/spring-cloud-eureka/src/main/resources/application.properties
new file mode 100644
index 0000000..5599f2c
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-eureka/src/main/resources/application.properties
@@ -0,0 +1,6 @@
+spring.application.name=spring-cloud-eureka
+server.port=8761
+eureka.client.register-with-eureka=false
+eureka.client.fetch-registry=false
+
+eureka.client.service-url.defaultZone=http://localhost:8761/eureka
diff --git a/spring-cloud-zuul/spring-cloud-eureka/src/test/java/com/neo/EurekaApplicationTests.java b/spring-cloud-zuul/spring-cloud-eureka/src/test/java/com/neo/EurekaApplicationTests.java
new file mode 100644
index 0000000..c5bc7be
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-eureka/src/test/java/com/neo/EurekaApplicationTests.java
@@ -0,0 +1,16 @@
+package com.neo;
+
+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-zuul/spring-cloud-producer-2/pom.xml b/spring-cloud-zuul/spring-cloud-producer-2/pom.xml
new file mode 100644
index 0000000..9a48e1b
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer-2/pom.xml
@@ -0,0 +1,34 @@
+
+
+ 4.0.0
+
+ com.neo
+ spring-cloud-parent
+ 1.0.0.BUILD-SNAPSHOT
+
+ spring-cloud-producer-2
+ jar
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/spring-cloud-zuul/spring-cloud-producer-2/src/main/java/com/neo/ProducerApplication.java b/spring-cloud-zuul/spring-cloud-producer-2/src/main/java/com/neo/ProducerApplication.java
new file mode 100644
index 0000000..d6275cd
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer-2/src/main/java/com/neo/ProducerApplication.java
@@ -0,0 +1,14 @@
+package com.neo;
+
+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-zuul/spring-cloud-producer-2/src/main/java/com/neo/controller/HelloController.java b/spring-cloud-zuul/spring-cloud-producer-2/src/main/java/com/neo/controller/HelloController.java
new file mode 100644
index 0000000..2deea84
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer-2/src/main/java/com/neo/controller/HelloController.java
@@ -0,0 +1,24 @@
+package com.neo.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HelloController {
+ private final Logger logger = LoggerFactory.getLogger(FallbackProvider.class);
+
+ @RequestMapping("/hello")
+ public String index(@RequestParam String name) {
+ logger.info("request two name is "+name);
+ try{
+ Thread.sleep(1000000);
+ }catch ( Exception e){
+ logger.error(" hello two error",e);
+ }
+ return "hello "+name+",this is two messge";
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud-zuul/spring-cloud-producer-2/src/main/resources/application.properties b/spring-cloud-zuul/spring-cloud-producer-2/src/main/resources/application.properties
new file mode 100644
index 0000000..fae5bf9
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer-2/src/main/resources/application.properties
@@ -0,0 +1,4 @@
+spring.application.name=spring-cloud-producer
+server.port=9001
+eureka.client.service-url.defaultZone=http://localhost:8761/eureka
+
diff --git a/spring-cloud-zuul/spring-cloud-producer-2/src/test/java/com/neo/ProducerApplicationTests.java b/spring-cloud-zuul/spring-cloud-producer-2/src/test/java/com/neo/ProducerApplicationTests.java
new file mode 100644
index 0000000..677161e
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer-2/src/test/java/com/neo/ProducerApplicationTests.java
@@ -0,0 +1,16 @@
+package com.neo;
+
+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-zuul/spring-cloud-producer/pom.xml b/spring-cloud-zuul/spring-cloud-producer/pom.xml
new file mode 100644
index 0000000..b747709
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+ com.neo
+ spring-cloud-parent
+ 1.0.0.BUILD-SNAPSHOT
+
+
+ spring-cloud-producer
+ jar
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/spring-cloud-zuul/spring-cloud-producer/src/main/java/com/neo/ProducerApplication.java b/spring-cloud-zuul/spring-cloud-producer/src/main/java/com/neo/ProducerApplication.java
new file mode 100644
index 0000000..d6275cd
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer/src/main/java/com/neo/ProducerApplication.java
@@ -0,0 +1,14 @@
+package com.neo;
+
+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-zuul/spring-cloud-producer/src/main/java/com/neo/controller/HelloController.java b/spring-cloud-zuul/spring-cloud-producer/src/main/java/com/neo/controller/HelloController.java
new file mode 100644
index 0000000..80085c3
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer/src/main/java/com/neo/controller/HelloController.java
@@ -0,0 +1,19 @@
+package com.neo.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HelloController {
+ private final Logger logger = LoggerFactory.getLogger(FallbackProvider.class);
+
+ @RequestMapping("/hello")
+ public String index(@RequestParam String name) {
+ logger.info("request one name is "+name);
+ return "hello "+name+",this is first messge";
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud-zuul/spring-cloud-producer/src/main/resources/application.properties b/spring-cloud-zuul/spring-cloud-producer/src/main/resources/application.properties
new file mode 100644
index 0000000..7b4952a
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer/src/main/resources/application.properties
@@ -0,0 +1,4 @@
+spring.application.name=spring-cloud-producer
+server.port=9000
+eureka.client.service-url.defaultZone=http://localhost:8761/eureka
+
diff --git a/spring-cloud-zuul/spring-cloud-producer/src/test/java/com/neo/ProducerApplicationTests.java b/spring-cloud-zuul/spring-cloud-producer/src/test/java/com/neo/ProducerApplicationTests.java
new file mode 100644
index 0000000..677161e
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-producer/src/test/java/com/neo/ProducerApplicationTests.java
@@ -0,0 +1,16 @@
+package com.neo;
+
+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-zuul/spring-cloud-zuul/pom.xml b/spring-cloud-zuul/spring-cloud-zuul/pom.xml
new file mode 100644
index 0000000..3fbf099
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-zuul/pom.xml
@@ -0,0 +1,43 @@
+
+
+
+ com.neo
+ spring-cloud-parent
+ 1.0.0.BUILD-SNAPSHOT
+
+ 4.0.0
+
+ spring-cloud-zuul
+ jar
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zuul
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+
+
+ org.springframework.retry
+ spring-retry
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/spring-cloud-zuul/spring-cloud-zuul/src/main/java/com/neo/ZuulApplication.java b/spring-cloud-zuul/spring-cloud-zuul/src/main/java/com/neo/ZuulApplication.java
new file mode 100644
index 0000000..0c7bfad
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-zuul/src/main/java/com/neo/ZuulApplication.java
@@ -0,0 +1,24 @@
+package com.neo;
+
+import com.neo.filter.TokenFilter;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+//@EnableCircuitBreaker
+@EnableZuulProxy
+public class ZuulApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ZuulApplication.class, args);
+ }
+
+ @Bean
+ public TokenFilter tokenFilter() {
+ return new TokenFilter();
+ }
+
+}
diff --git a/spring-cloud-zuul/spring-cloud-zuul/src/main/java/com/neo/fallback/ProducerFallback.java b/spring-cloud-zuul/spring-cloud-zuul/src/main/java/com/neo/fallback/ProducerFallback.java
new file mode 100644
index 0000000..6b00925
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-zuul/src/main/java/com/neo/fallback/ProducerFallback.java
@@ -0,0 +1,71 @@
+package com.neo.fallback;
+
+import com.neo.filter.TokenFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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;
+
+@Component
+public class ProducerFallback implements FallbackProvider {
+ private final Logger logger = LoggerFactory.getLogger(FallbackProvider.class);
+
+ //指定要处理的 service。
+ @Override
+ public String getRoute() {
+ return "spring-cloud-producer";
+ }
+
+ public ClientHttpResponse fallbackResponse() {
+ return new ClientHttpResponse() {
+ @Override
+ public HttpStatus getStatusCode() throws IOException {
+ return HttpStatus.OK;
+ }
+
+ @Override
+ public int getRawStatusCode() throws IOException {
+ return 200;
+ }
+
+ @Override
+ public String getStatusText() throws IOException {
+ return "OK";
+ }
+
+ @Override
+ public void close() {
+
+ }
+
+ @Override
+ public InputStream getBody() throws IOException {
+ return new ByteArrayInputStream("Producer service unavailable".getBytes());
+ }
+
+ @Override
+ public HttpHeaders getHeaders() {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+ return headers;
+ }
+ };
+ }
+
+ @Override
+ public ClientHttpResponse fallbackResponse(Throwable cause) {
+ if (cause != null && cause.getCause() != null) {
+ String reason = cause.getCause().getMessage();
+ logger.info("Excption {}",reason);
+ }
+ return fallbackResponse();
+ }
+}
diff --git a/spring-cloud-zuul/spring-cloud-zuul/src/main/java/com/neo/filter/TokenFilter.java b/spring-cloud-zuul/spring-cloud-zuul/src/main/java/com/neo/filter/TokenFilter.java
new file mode 100644
index 0000000..81b2c28
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-zuul/src/main/java/com/neo/filter/TokenFilter.java
@@ -0,0 +1,53 @@
+package com.neo.filter;
+
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class TokenFilter extends ZuulFilter {
+
+ private final Logger logger = LoggerFactory.getLogger(TokenFilter.class);
+
+ @Override
+ public String filterType() {
+ return "pre"; // 可以在请求被路由之前调用
+ }
+
+ @Override
+ public int filterOrder() {
+ return 0; // filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低
+ }
+
+ @Override
+ public boolean shouldFilter() {
+ return true;// 是否执行该过滤器,此处为true,说明需要过滤
+ }
+
+ @Override
+ public Object run() {
+ RequestContext ctx = RequestContext.getCurrentContext();
+ HttpServletRequest request = ctx.getRequest();
+
+ logger.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());
+
+ String token = request.getParameter("token");// 获取请求的参数
+
+ if (StringUtils.isNotBlank(token)) {
+ ctx.setSendZuulResponse(true); //对请求进行路由
+ ctx.setResponseStatusCode(200);
+ ctx.set("isSuccess", true);
+ return null;
+ } else {
+ ctx.setSendZuulResponse(false); //不对其进行路由
+ ctx.setResponseStatusCode(400);
+ ctx.setResponseBody("token is empty");
+ ctx.set("isSuccess", false);
+ return null;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/spring-cloud-zuul/spring-cloud-zuul/src/main/resources/application.properties b/spring-cloud-zuul/spring-cloud-zuul/src/main/resources/application.properties
new file mode 100644
index 0000000..32ea01b
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-zuul/src/main/resources/application.properties
@@ -0,0 +1,11 @@
+spring.application.name=gateway-service-zuul
+server.port=8888
+
+eureka.client.service-url.defaultZone=http://localhost:8761/eureka
+
+#是否开启重试功能
+zuul.retryable=true
+#对当前服务的重试次数
+ribbon.MaxAutoRetries=2
+#切换相同Server的次数
+ribbon.MaxAutoRetriesNextServer=0
\ No newline at end of file
diff --git a/spring-cloud-zuul/spring-cloud-zuul/src/test/java/com/neo/ZuulApplicationTests.java b/spring-cloud-zuul/spring-cloud-zuul/src/test/java/com/neo/ZuulApplicationTests.java
new file mode 100644
index 0000000..06146d8
--- /dev/null
+++ b/spring-cloud-zuul/spring-cloud-zuul/src/test/java/com/neo/ZuulApplicationTests.java
@@ -0,0 +1,16 @@
+package com.neo;
+
+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() {
+ }
+
+}