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() { + } + +}