diff --git a/README.md b/README.md index b46b159..0935a16 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Spring Cloud 使用的各种示例,以最简单、最实用为标准 - [spring-cloud-sleuth-zipkin](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-sleuth-zipkin): 利用Sleuth、Zipkin对Spring Cloud应用进行服务追踪分析 - [spring-boot-admin-eureka](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-boot-admin-eureka): 使用Spring Boot Admin 对Spring Cloud集群进行监控示例 - [spring-cloud-consul](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-consul): Spring Cloud 使用 Consul 作为服务中心示例 -- [spring-cloud-gateway](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-gateway): Spring Cloud 使用 Consul 作为服务中心示例 +- [spring-cloud-gateway](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-gateway): Spring Cloud 使用 gateway 的相关示例 学习系列: @@ -41,7 +41,9 @@ Spring Cloud 使用的各种示例,以最简单、最实用为标准 - [springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪](http://www.ityouknow.com/springcloud/2018/02/02/spring-cloud-sleuth-zipkin.html) - [springcloud(十三):Spring Cloud Consul 使用详解](http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html) - [Spring Cloud (十四):Spring Cloud 开源软件都有哪些?](http://www.ityouknow.com/springcloud/2018/08/06/spring-cloud-open-source.html) -- [springcloud(十五):服务网关 Spring Cloud GateWay 初级篇](http://www.ityouknow.com/springcloud/2018/12/12/spring-cloud-gateway.html) +- [springcloud(十五):服务网关 Spring Cloud GateWay 初级篇](http://www.ityouknow.com/springcloud/2018/12/12/spring-cloud-gateway-start.html) +- [springcloud(十六):服务网关 Spring Cloud GateWay 服务化和过滤器](http://www.ityouknow.com/springcloud/2019/01/19/spring-cloud-gateway-service.html) +- [springcloud(十七):服务网关 Spring Cloud GateWay 熔断、限流、重试](http://www.ityouknow.com/springcloud/2019/01/26/spring-cloud-gateway-limit.html) 综合篇: diff --git a/spring-cloud-gateway/cloud-gateway-eureka/pom.xml b/spring-cloud-gateway/cloud-gateway-eureka/pom.xml new file mode 100644 index 0000000..3e418ba --- /dev/null +++ b/spring-cloud-gateway/cloud-gateway-eureka/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + com.neo + cloud-gateway-eureka + 0.0.1-SNAPSHOT + jar + + cloud-gateway-eureka + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.0.6.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Finchley.SR2 + pom + import + + + + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + org.springframework.cloud + spring-boot-starter-data-redis-reactive + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-cloud-gateway/cloud-gateway-eureka/src/main/java/com/neo/GateWayServiceApplication.java b/spring-cloud-gateway/cloud-gateway-eureka/src/main/java/com/neo/GateWayServiceApplication.java new file mode 100644 index 0000000..856300c --- /dev/null +++ b/spring-cloud-gateway/cloud-gateway-eureka/src/main/java/com/neo/GateWayServiceApplication.java @@ -0,0 +1,16 @@ +package com.neo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication +public class GateWayServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(GateWayServiceApplication.class, args); + } + +} diff --git a/spring-cloud-gateway/cloud-gateway-eureka/src/main/java/com/neo/config/Config.java b/spring-cloud-gateway/cloud-gateway-eureka/src/main/java/com/neo/config/Config.java new file mode 100644 index 0000000..45267ce --- /dev/null +++ b/spring-cloud-gateway/cloud-gateway-eureka/src/main/java/com/neo/config/Config.java @@ -0,0 +1,19 @@ +package com.neo.config; + +import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; +import org.springframework.context.annotation.Bean; +import reactor.core.publisher.Mono; + +public class Config { + + @Bean + public KeyResolver ipKeyResolver() { + return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); + } + + + @Bean + KeyResolver userKeyResolver() { + return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user")); + } +} diff --git a/spring-cloud-gateway/cloud-gateway-eureka/src/main/resources/application.yml b/spring-cloud-gateway/cloud-gateway-eureka/src/main/resources/application.yml new file mode 100644 index 0000000..eaf9ad3 --- /dev/null +++ b/spring-cloud-gateway/cloud-gateway-eureka/src/main/resources/application.yml @@ -0,0 +1,63 @@ +server: + port: 8888 +spring: + application: + name: cloud-gateway-eureka + redis: + host: localhost + password: + port: 6379 + cloud: + gateway: + discovery: + locator: + enabled: true + routes: + - id: nameRoot + uri: lb://spring-cloud-producer + predicates: + - Path=/name/** + filters: + - StripPrefix=2 + - id: add_request_parameter_route +# uri: http://localhost:9000 + uri: lb://spring-cloud-producer + filters: + - AddRequestParameter=foo, bar + predicates: + - Method=GET + - id: requestratelimiter_route + uri: lb://spring-cloud-producer + filters: + - name: RequestRateLimiter + args: + redis-rate-limiter.replenishRate: 10 + redis-rate-limiter.burstCapacity: 20 + key-resolver: "#{@userKeyResolver}" + predicates: + - Method=GET + - id: hystrix_route + uri: lb://spring-cloud-producer + predicates: + - Path=/consumingserviceendpoint + filters: + - name: Hystrix + args: + name: fallbackcmd + fallbackUri: forward:/incaseoffailureusethis + - id: retry_test + uri: lb://spring-cloud-producer + predicates: + - Path=/retry + filters: + - name: Retry + args: + retries: 3 + statuses: BAD_GATEWAY +eureka: + client: + service-url: + defaultZone: http://localhost:8000/eureka/ +logging: + level: + org.springframework.cloud.gateway: debug \ No newline at end of file diff --git a/spring-cloud-gateway/cloud-gateway-eureka/src/test/java/com/neo/GateWayServiceApplicationTests.java b/spring-cloud-gateway/cloud-gateway-eureka/src/test/java/com/neo/GateWayServiceApplicationTests.java new file mode 100644 index 0000000..de8112c --- /dev/null +++ b/spring-cloud-gateway/cloud-gateway-eureka/src/test/java/com/neo/GateWayServiceApplicationTests.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 GateWayServiceApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-cloud-gateway/spring-cloud-eureka/pom.xml b/spring-cloud-gateway/spring-cloud-eureka/pom.xml new file mode 100644 index 0000000..0dcc3ff --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-eureka/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + spring-cloud-eureka + jar + + + org.springframework.boot + spring-boot-starter-parent + 2.0.6.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Finchley.SR2 + pom + import + + + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-server + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-cloud-gateway/spring-cloud-eureka/src/main/java/com/neo/SpringCloudEurekaApplication.java b/spring-cloud-gateway/spring-cloud-eureka/src/main/java/com/neo/SpringCloudEurekaApplication.java new file mode 100644 index 0000000..0c995b0 --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-eureka/src/main/java/com/neo/SpringCloudEurekaApplication.java @@ -0,0 +1,15 @@ +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 SpringCloudEurekaApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCloudEurekaApplication.class, args); + } +} diff --git a/spring-cloud-gateway/spring-cloud-eureka/src/main/resources/application.properties b/spring-cloud-gateway/spring-cloud-eureka/src/main/resources/application.properties new file mode 100644 index 0000000..124b09d --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-eureka/src/main/resources/application.properties @@ -0,0 +1,8 @@ +spring.application.name=spring-cloud-eureka + +server.port=8000 +eureka.client.register-with-eureka=false +eureka.client.fetch-registry=false + +eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/ + diff --git a/spring-cloud-gateway/spring-cloud-eureka/src/test/java/com/neo/SpringCloudEurekaApplicationTests.java b/spring-cloud-gateway/spring-cloud-eureka/src/test/java/com/neo/SpringCloudEurekaApplicationTests.java new file mode 100644 index 0000000..d536a6b --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-eureka/src/test/java/com/neo/SpringCloudEurekaApplicationTests.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 SpringCloudEurekaApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-cloud-gateway/spring-cloud-producer-1/pom.xml b/spring-cloud-gateway/spring-cloud-producer-1/pom.xml new file mode 100644 index 0000000..c5d9f07 --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-producer-1/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + spring-cloud-producer-1 + jar + + + org.springframework.boot + spring-boot-starter-parent + 2.0.6.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Finchley.SR2 + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-cloud-gateway/spring-cloud-producer-1/src/main/java/com/neo/ProducerApplication.java b/spring-cloud-gateway/spring-cloud-producer-1/src/main/java/com/neo/ProducerApplication.java new file mode 100644 index 0000000..d6275cd --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-producer-1/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-gateway/spring-cloud-producer-1/src/main/java/com/neo/controller/HelloController.java b/spring-cloud-gateway/spring-cloud-producer-1/src/main/java/com/neo/controller/HelloController.java new file mode 100644 index 0000000..0f7ff7b --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-producer-1/src/main/java/com/neo/controller/HelloController.java @@ -0,0 +1,19 @@ +package com.neo.controller; + +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 { + + @RequestMapping("/hello") + public String index() { + return "hello world smile!"; + } + + @RequestMapping("/foo") + public String foo(String foo) { + return "hello "+foo+"!!"; + } +} \ No newline at end of file diff --git a/spring-cloud-gateway/spring-cloud-producer-1/src/main/resources/application.properties b/spring-cloud-gateway/spring-cloud-producer-1/src/main/resources/application.properties new file mode 100644 index 0000000..5086230 --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-producer-1/src/main/resources/application.properties @@ -0,0 +1,4 @@ +spring.application.name=spring-cloud-producer +server.port=9001 +eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/ + diff --git a/spring-cloud-gateway/spring-cloud-producer-1/src/test/java/com/neo/ProducerApplicationTests.java b/spring-cloud-gateway/spring-cloud-producer-1/src/test/java/com/neo/ProducerApplicationTests.java new file mode 100644 index 0000000..677161e --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-producer-1/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-gateway/spring-cloud-producer/pom.xml b/spring-cloud-gateway/spring-cloud-producer/pom.xml new file mode 100644 index 0000000..ac0e3bb --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-producer/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + spring-cloud-producer + jar + + + org.springframework.boot + spring-boot-starter-parent + 2.0.6.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Finchley.SR2 + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-cloud-gateway/spring-cloud-producer/src/main/java/com/neo/ProducerApplication.java b/spring-cloud-gateway/spring-cloud-producer/src/main/java/com/neo/ProducerApplication.java new file mode 100644 index 0000000..d6275cd --- /dev/null +++ b/spring-cloud-gateway/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-gateway/spring-cloud-producer/src/main/java/com/neo/controller/HelloController.java b/spring-cloud-gateway/spring-cloud-producer/src/main/java/com/neo/controller/HelloController.java new file mode 100644 index 0000000..e2cfa68 --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-producer/src/main/java/com/neo/controller/HelloController.java @@ -0,0 +1,20 @@ +package com.neo.controller; + +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 { + + @RequestMapping("/hello") + public String index() { + return "hello world!"; + } + + @RequestMapping("/foo") + public String foo(String foo) { + return "hello "+foo+"!"; + } + +} \ No newline at end of file diff --git a/spring-cloud-gateway/spring-cloud-producer/src/main/resources/application.properties b/spring-cloud-gateway/spring-cloud-producer/src/main/resources/application.properties new file mode 100644 index 0000000..7994abc --- /dev/null +++ b/spring-cloud-gateway/spring-cloud-producer/src/main/resources/application.properties @@ -0,0 +1,4 @@ +spring.application.name=spring-cloud-producer +server.port=9000 +eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/ + diff --git a/spring-cloud-gateway/spring-cloud-producer/src/test/java/com/neo/ProducerApplicationTests.java b/spring-cloud-gateway/spring-cloud-producer/src/test/java/com/neo/ProducerApplicationTests.java new file mode 100644 index 0000000..677161e --- /dev/null +++ b/spring-cloud-gateway/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() { + } + +}