From b05623d6f9a87c234a648df71bff0df37f0ffd9d Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Mon, 24 Feb 2020 23:51:14 +0800
Subject: [PATCH 01/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
labx-08/labx-08-sc-gateway-demo01/pom.xml | 58 +++++++++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 +++++
.../src/main/resources/application.yaml | 19 ++++++
labx-08/pom.xml | 19 ++++++
pom.xml | 1 +
5 files changed, 110 insertions(+)
create mode 100644 labx-08/labx-08-sc-gateway-demo01/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo01/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml
create mode 100644 labx-08/pom.xml
diff --git a/labx-08/labx-08-sc-gateway-demo01/pom.xml b/labx-08/labx-08-sc-gateway-demo01/pom.xml
new file mode 100644
index 00000000..c1d97988
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo01/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo01
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo01/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo01/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo01/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml
new file mode 100644
index 00000000..bcb22089
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml
@@ -0,0 +1,19 @@
+server:
+ port: 8888
+
+spring:
+ cloud:
+ gateway:
+ routes:
+ - id: yudaoyuanma # 路由的编号
+ uri: http://www.iocoder.cn # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/blog
+ filters:
+ - StripPrefix=1
+ - id: oschina
+ uri: https://www.oschina.net # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/oschina
+ filters:
+ - StripPrefix=1
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
new file mode 100644
index 00000000..d12e861e
--- /dev/null
+++ b/labx-08/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08
+ pom
+
+ labx-08-sc-gateway-demo01
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 8601221e..febd103f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -67,6 +67,7 @@
labx-05
labx-06
labx-07
+ labx-08
From 96c5b98208d7c6e24a8983035657a3566af1b3a8 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Tue, 25 Feb 2020 01:49:44 +0800
Subject: [PATCH 02/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B=20?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E9=97=B4=E4=B8=89=E8=BF=9E!?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 19 +++++++++-
.../target/classes/bootstrap.yaml | 13 -------
.../target/classes/application.yml | 38 -------------------
.../target/classes/application.yml | 31 ---------------
.../target/classes/application.yml | 28 --------------
.../target/classes/application.yml | 29 --------------
.../src/main/resources/application.yaml | 8 ++--
7 files changed, 22 insertions(+), 144 deletions(-)
delete mode 100644 labx-05/labx-05-sca-nacos-config-auto-refresh/target/classes/bootstrap.yaml
delete mode 100644 labx-06/labx-06-sca-stream-rocketmq-consumer-actuator/target/classes/application.yml
delete mode 100644 labx-06/labx-06-sca-stream-rocketmq-consumer-error-handler/target/classes/application.yml
delete mode 100644 labx-06/labx-06-sca-stream-rocketmq-consumer-orderly/target/classes/application.yml
delete mode 100644 labx-06/labx-06-sca-stream-rocketmq-producer-orderly/target/classes/application.yml
diff --git a/README.md b/README.md
index 968ab9b8..1f6f11c8 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,14 @@
+一个涵盖四个主流技术栈的**正经**仓库:
+* [《Spring Boot 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-boot-%E4%B8%93%E6%A0%8F)
+* [《Spring Cloud Alibaba 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-cloud-alibaba-%E4%B8%93%E6%A0%8F)
+* [《Spring Cloud 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-cloud-%E4%B8%93%E6%A0%8F)
+* [《Dubbo 专栏》](https://github.com/YunaiV/SpringBoot-Labs#Dubbo-%E4%B8%93%E6%A0%8F)
+
+作为一个热爱**深夜**撸码的 18 岁秃头的可爱小男孩,希望大佬能够**一间三连**。
+
+
+
+~~交流~~**装逼群**,请点击[传送门](http://www.iocoder.cn/mall-user-group/?vip&gitee),进行引导加入。**亲,一间三连啊**
# Spring Boot 专栏
@@ -136,9 +147,8 @@
* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02)
* [《芋道 Spring Cloud 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Cloud/Feign/?github) 对应 [labx-03](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-03)
-* 《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》
+* [《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Gateway/?github) 对应 [labx-08](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-08)
* 《芋道 Spring Cloud 链路追踪 SkyWalking 入门》
-
* TODO 监控
# Spring Cloud 专栏
@@ -179,6 +189,11 @@
* 《芋道 Spring Cloud 链路追踪 Sleuth 入门》
* 《芋道 Spring Cloud 链路追踪 SkyWalking 入门》
+# Dubbo 专栏
+
+* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github) 对应 [lab-30](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-30)
+* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07)
+
---------
如下是草稿目录,未来需要整理下
diff --git a/labx-05/labx-05-sca-nacos-config-auto-refresh/target/classes/bootstrap.yaml b/labx-05/labx-05-sca-nacos-config-auto-refresh/target/classes/bootstrap.yaml
deleted file mode 100644
index fb5bb9ec..00000000
--- a/labx-05/labx-05-sca-nacos-config-auto-refresh/target/classes/bootstrap.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-spring:
- application:
- name: demo-application
-
- cloud:
- nacos:
- # Nacos Config 配置项,对应 NacosConfigProperties 配置属性类
- config:
- server-addr: 127.0.0.1:8848 # Nacos 服务器地址
- namespace: # 使用的 Nacos 的命名空间,默认为 null
- group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
- name: # 使用的 Nacos 配置集的 dataId,默认为 spring.application.name
- file-extension: yaml # 使用的 Nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties
diff --git a/labx-06/labx-06-sca-stream-rocketmq-consumer-actuator/target/classes/application.yml b/labx-06/labx-06-sca-stream-rocketmq-consumer-actuator/target/classes/application.yml
deleted file mode 100644
index b4e95deb..00000000
--- a/labx-06/labx-06-sca-stream-rocketmq-consumer-actuator/target/classes/application.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-spring:
- application:
- name: demo-consumer-application
- cloud:
- # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
- stream:
- # Binding 配置项,对应 BindingProperties Map
- bindings:
- demo01-input:
- destination: DEMO-TOPIC-01 # 目的地。这里使用 RocketMQ Topic
- content-type: application/json # 内容格式。这里使用 JSON
- group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
- # Spring Cloud Stream RocketMQ 配置项
- rocketmq:
- # RocketMQ Binder 配置项,对应 RocketMQBinderConfigurationProperties 类
- binder:
- name-server: 127.0.0.1:9876 # RocketMQ Namesrv 地址
- # RocketMQ 自定义 Binding 配置项,对应 RocketMQBindingProperties Map
- bindings:
- demo01-input:
- # RocketMQ Consumer 配置项,对应 RocketMQConsumerProperties 类
- consumer:
- enabled: true # 是否开启消费,默认为 true
- broadcasting: false # 是否使用广播消费,默认为 false 使用集群消费
-
-server:
- port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
-
-management:
- endpoints:
- web:
- exposure:
- include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
- endpoint:
- # Health 端点配置项,对应 HealthProperties 配置类
- health:
- enabled: true # 是否开启。默认为 true 开启。
- show-details: ALWAYS # 何时显示完整的健康信息。默认为 NEVER 都不展示。可选 WHEN_AUTHORIZED 当经过授权的用户;可选 ALWAYS 总是展示。
diff --git a/labx-06/labx-06-sca-stream-rocketmq-consumer-error-handler/target/classes/application.yml b/labx-06/labx-06-sca-stream-rocketmq-consumer-error-handler/target/classes/application.yml
deleted file mode 100644
index 4544fc74..00000000
--- a/labx-06/labx-06-sca-stream-rocketmq-consumer-error-handler/target/classes/application.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-spring:
- application:
- name: demo-consumer-application
- cloud:
- # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
- stream:
- # Binding 配置项,对应 BindingProperties Map
- bindings:
- demo01-input:
- destination: DEMO-TOPIC-01 # 目的地。这里使用 RocketMQ Topic
- content-type: application/json # 内容格式。这里使用 JSON
- group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
- # Consumer 配置项,对应 ConsumerProperties 类
- consumer:
- max-attempts: 1
- # Spring Cloud Stream RocketMQ 配置项
- rocketmq:
- # RocketMQ Binder 配置项,对应 RocketMQBinderConfigurationProperties 类
- binder:
- name-server: 127.0.0.1:9876 # RocketMQ Namesrv 地址
- # RocketMQ 自定义 Binding 配置项,对应 RocketMQBindingProperties Map
- bindings:
- demo01-input:
- # RocketMQ Consumer 配置项,对应 RocketMQConsumerProperties 类
- consumer:
- enabled: true # 是否开启消费,默认为 true
- broadcasting: false # 是否使用广播消费,默认为 false 使用集群消费
- delay-level-when-next-consume: 0 # 异步消费消息模式下消费失败重试策略,默认为 0
-
-server:
- port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
diff --git a/labx-06/labx-06-sca-stream-rocketmq-consumer-orderly/target/classes/application.yml b/labx-06/labx-06-sca-stream-rocketmq-consumer-orderly/target/classes/application.yml
deleted file mode 100644
index e3672922..00000000
--- a/labx-06/labx-06-sca-stream-rocketmq-consumer-orderly/target/classes/application.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-spring:
- application:
- name: demo-consumer-application
- cloud:
- # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
- stream:
- # Binding 配置项,对应 BindingProperties Map
- bindings:
- demo01-input:
- destination: DEMO-TOPIC-01 # 目的地。这里使用 RocketMQ Topic
- content-type: application/json # 内容格式。这里使用 JSON
- group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
- # Spring Cloud Stream RocketMQ 配置项
- rocketmq:
- # RocketMQ Binder 配置项,对应 RocketMQBinderConfigurationProperties 类
- binder:
- name-server: 127.0.0.1:9876 # RocketMQ Namesrv 地址
- # RocketMQ 自定义 Binding 配置项,对应 RocketMQBindingProperties Map
- bindings:
- demo01-input:
- # RocketMQ Consumer 配置项,对应 RocketMQConsumerProperties 类
- consumer:
- enabled: true # 是否开启消费,默认为 true
- broadcasting: false # 是否使用广播消费,默认为 false 使用集群消费
- orderly: true # 是否顺序消费,默认为 false 并发消费。
-
-server:
- port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
diff --git a/labx-06/labx-06-sca-stream-rocketmq-producer-orderly/target/classes/application.yml b/labx-06/labx-06-sca-stream-rocketmq-producer-orderly/target/classes/application.yml
deleted file mode 100644
index 897f4bd7..00000000
--- a/labx-06/labx-06-sca-stream-rocketmq-producer-orderly/target/classes/application.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-spring:
- application:
- name: demo-producer-application
- cloud:
- # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
- stream:
- # Binding 配置项,对应 BindingProperties Map
- bindings:
- demo01-output:
- destination: DEMO-TOPIC-01 # 目的地。这里使用 RocketMQ Topic
- content-type: application/json # 内容格式。这里使用 JSON
- # Producer 配置项,对应 ProducerProperties 类
- producer:
- partition-key-expression: payload['id'] # 分区 key 表达式。该表达式基于 Spring EL,从消息中获得分区 key。
- # Spring Cloud Stream RocketMQ 配置项
- rocketmq:
- # RocketMQ Binder 配置项,对应 RocketMQBinderConfigurationProperties 类
- binder:
- name-server: 127.0.0.1:9876 # RocketMQ Namesrv 地址
- # RocketMQ 自定义 Binding 配置项,对应 RocketMQBindingProperties Map
- bindings:
- demo01-output:
- # RocketMQ Producer 配置项,对应 RocketMQProducerProperties 类
- producer:
- group: test # 生产者分组
- sync: true # 是否同步发送消息,默认为 false 异步。
-
-server:
- port: 18080
diff --git a/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml
index bcb22089..0441e120 100644
--- a/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml
+++ b/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml
@@ -3,7 +3,9 @@ server:
spring:
cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
gateway:
+ # 路由配置项,对应 RouteDefinition 数组
routes:
- id: yudaoyuanma # 路由的编号
uri: http://www.iocoder.cn # 路由到的目标地址
@@ -11,9 +13,9 @@ spring:
- Path=/blog
filters:
- StripPrefix=1
- - id: oschina
- uri: https://www.oschina.net # 路由到的目标地址
+ - id: oschina # 路由的编号
+ uri: https://www.oschina.net # 路由的目标地址
predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
- Path=/oschina
- filters:
+ filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
- StripPrefix=1
From bc9749107ff172801eebf24bd22331506ad04810 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Tue, 25 Feb 2020 20:00:20 +0800
Subject: [PATCH 03/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 4 +-
.../pom.xml | 64 +++++++++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 ++++
.../src/main/resources/application.yaml | 31 +++++++++
labx-08/labx-08-sc-user-service/pom.xml | 64 +++++++++++++++++++
.../userservice/UserServiceApplication.java | 13 ++++
.../controller/UserController.java | 23 +++++++
.../labx08/userservice/dto/UserAddDTO.java | 37 +++++++++++
.../labx08/userservice/dto/UserDTO.java | 49 ++++++++++++++
.../src/main/resources/application.yaml | 12 ++++
labx-08/pom.xml | 3 +
11 files changed, 311 insertions(+), 2 deletions(-)
create mode 100644 labx-08/labx-08-sc-gateway-demo02-registry/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo02-registry/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo02-registry/src/main/resources/application.yaml
create mode 100644 labx-08/labx-08-sc-user-service/pom.xml
create mode 100644 labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/UserServiceApplication.java
create mode 100644 labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/controller/UserController.java
create mode 100644 labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/dto/UserAddDTO.java
create mode 100644 labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/dto/UserDTO.java
create mode 100644 labx-08/labx-08-sc-user-service/src/main/resources/application.yaml
diff --git a/README.md b/README.md
index 1f6f11c8..ced5a94a 100644
--- a/README.md
+++ b/README.md
@@ -4,11 +4,11 @@
* [《Spring Cloud 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-cloud-%E4%B8%93%E6%A0%8F)
* [《Dubbo 专栏》](https://github.com/YunaiV/SpringBoot-Labs#Dubbo-%E4%B8%93%E6%A0%8F)
-作为一个热爱**深夜**撸码的 18 岁秃头的可爱小男孩,希望大佬能够**一间三连**。
+作为一个热爱**深夜**撸码的 18 岁秃头的可爱小男孩,希望大佬能够**一键三连**。

-~~交流~~**装逼群**,请点击[传送门](http://www.iocoder.cn/mall-user-group/?vip&gitee),进行引导加入。**亲,一间三连啊**
+> ~~交流~~**装逼群**,请点击[传送门](http://www.iocoder.cn/mall-user-group/?vip&gitee),进行引导加入。**亲,一键三连啊**
# Spring Boot 专栏
diff --git a/labx-08/labx-08-sc-gateway-demo02-registry/pom.xml b/labx-08/labx-08-sc-gateway-demo02-registry/pom.xml
new file mode 100644
index 00000000..7ae7c813
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo02-registry/pom.xml
@@ -0,0 +1,64 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo02-registry
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo02-registry/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo02-registry/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo02-registry/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo02-registry/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo02-registry/src/main/resources/application.yaml
new file mode 100644
index 00000000..1e130765
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo02-registry/src/main/resources/application.yaml
@@ -0,0 +1,31 @@
+server:
+ port: 8888
+
+spring:
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+ - id: yudaoyuanma # 路由的编号
+ uri: http://www.iocoder.cn # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/blog
+ filters:
+ - StripPrefix=1
+ - id: oschina # 路由的编号
+ uri: https://www.oschina.net # 路由的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/oschina
+ filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
+ - StripPrefix=1
+ # 与 Spring Cloud 注册中心的集成,对应 DiscoveryLocatorProperties 类
+ discovery:
+ locator:
+ enabled: true # 是否开启,默认为 false 关闭
+ url-expression: "'lb://' + serviceId" # 路由的目标地址的表达式,默认为 "'lb://' + serviceId"
+
+ # Nacos 作为注册中心的配置项
+ nacos:
+ discovery:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址
diff --git a/labx-08/labx-08-sc-user-service/pom.xml b/labx-08/labx-08-sc-user-service/pom.xml
new file mode 100644
index 00000000..3ed72cce
--- /dev/null
+++ b/labx-08/labx-08-sc-user-service/pom.xml
@@ -0,0 +1,64 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-user-service
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
diff --git a/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/UserServiceApplication.java b/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/UserServiceApplication.java
new file mode 100644
index 00000000..94da95e8
--- /dev/null
+++ b/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/UserServiceApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.userservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class UserServiceApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(UserServiceApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/controller/UserController.java b/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/controller/UserController.java
new file mode 100644
index 00000000..e576e559
--- /dev/null
+++ b/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/controller/UserController.java
@@ -0,0 +1,23 @@
+package cn.iocoder.springcloud.labx08.userservice.controller;
+
+import cn.iocoder.springcloud.labx08.userservice.dto.UserAddDTO;
+import cn.iocoder.springcloud.labx08.userservice.dto.UserDTO;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+ @GetMapping("/get")
+ public UserDTO get(@RequestParam("id") Integer id) {
+ return new UserDTO().setId(id)
+ .setName("没有昵称:" + id)
+ .setGender(id % 2 + 1); // 1 - 男;2 - 女
+ }
+
+ @PostMapping("/add")
+ public Integer add(UserAddDTO addDTO) {
+ return (int) (System.currentTimeMillis() / 1000); // 嘿嘿,随便返回一个 id
+ }
+
+}
diff --git a/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/dto/UserAddDTO.java b/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/dto/UserAddDTO.java
new file mode 100644
index 00000000..2dbfedce
--- /dev/null
+++ b/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/dto/UserAddDTO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.springcloud.labx08.userservice.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户添加 DTO
+ */
+public class UserAddDTO implements Serializable {
+
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public String getName() {
+ return name;
+ }
+
+ public UserAddDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserAddDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+
+}
diff --git a/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/dto/UserDTO.java b/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/dto/UserDTO.java
new file mode 100644
index 00000000..8c911e70
--- /dev/null
+++ b/labx-08/labx-08-sc-user-service/src/main/java/cn/iocoder/springcloud/labx08/userservice/dto/UserDTO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.springcloud.labx08.userservice.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户信息 DTO
+ */
+public class UserDTO implements Serializable {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserDTO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public UserDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+}
diff --git a/labx-08/labx-08-sc-user-service/src/main/resources/application.yaml b/labx-08/labx-08-sc-user-service/src/main/resources/application.yaml
new file mode 100644
index 00000000..e9b70d31
--- /dev/null
+++ b/labx-08/labx-08-sc-user-service/src/main/resources/application.yaml
@@ -0,0 +1,12 @@
+spring:
+ application:
+ name: user-service # Spring 应用名
+ cloud:
+ nacos:
+ # Nacos 作为注册中心的配置项
+ discovery:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址 "'lb://'+serviceId"
+
+server:
+ port: ${random.int[10000,19999]} # 服务器端口。默认为 8080
+# port: 18080 # 服务器端口。默认为 8080
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index d12e861e..4c0a8f0b 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -13,6 +13,9 @@
pom
labx-08-sc-gateway-demo01
+ labx-08-sc-gateway-demo02-registry
+
+ labx-08-sc-user-service
From 5b11085045755f4703e04fab044f647f02a20134 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Tue, 25 Feb 2020 23:59:00 +0800
Subject: [PATCH 04/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 73 +++++++++++
.../gatewaydemo/GatewayApplication.java | 13 ++
.../GatewayPropertiesRefresher.java | 124 ++++++++++++++++++
.../src/main/resources/application.yaml | 26 ++++
labx-08/pom.xml | 2 +
5 files changed, 238 insertions(+)
create mode 100644 labx-08/labx-08-sc-gateway-demo03-config-apollo/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
create mode 100644 labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/resources/application.yaml
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-apollo/pom.xml b/labx-08/labx-08-sc-gateway-demo03-config-apollo/pom.xml
new file mode 100644
index 00000000..c261dea5
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo03-config-apollo/pom.xml
@@ -0,0 +1,73 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo03-config-apollo
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.ctrip.framework.apollo
+ apollo-client
+ 1.5.1
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java b/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
new file mode 100644
index 00000000..996aeebb
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
@@ -0,0 +1,124 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import com.ctrip.framework.apollo.enums.PropertyChangeType;
+import com.ctrip.framework.apollo.model.ConfigChange;
+import com.ctrip.framework.apollo.model.ConfigChangeEvent;
+import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
+import org.springframework.cloud.gateway.config.GatewayProperties;
+import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
+import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.ApplicationEventPublisherAware;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+
+@Component
+public class GatewayPropertiesRefresher implements ApplicationContextAware, ApplicationEventPublisherAware {
+
+ private static final Logger logger = LoggerFactory.getLogger(GatewayPropertiesRefresher.class);
+
+ private static final String ID_PATTERN = "spring\\.cloud\\.gateway\\.routes\\[\\d+\\]\\.id";
+
+ private static final String DEFAULT_FILTER_PATTERN = "spring\\.cloud\\.gateway\\.default-filters\\[\\d+\\]\\.name";
+
+ private ApplicationContext applicationContext;
+
+ private ApplicationEventPublisher publisher;
+
+ @Autowired
+ private GatewayProperties gatewayProperties;
+
+ @Autowired
+ private RouteDefinitionWriter routeDefinitionWriter;
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ this.applicationContext = applicationContext;
+ }
+
+
+ @Override
+ public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
+ this.publisher = applicationEventPublisher;
+ }
+
+ @ApolloConfigChangeListener(interestedKeyPrefixes = "spring.cloud.gateway.")
+ public void onChange(ConfigChangeEvent changeEvent) {
+ refreshGatewayProperties(changeEvent);
+ }
+
+ /***
+ * 刷新org.springframework.cloud.gateway.config.PropertiesRouteDefinitionLocator中定义的routes
+ *
+ * @param changeEvent
+ * @return void
+ * @author ksewen
+ * @date 2019/5/21 2:13 PM
+ */
+ private void refreshGatewayProperties(ConfigChangeEvent changeEvent) {
+ logger.info("Refreshing GatewayProperties!");
+ preDestroyGatewayProperties(changeEvent);
+ this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
+ refreshGatewayRouteDefinition();
+ logger.info("GatewayProperties refreshed!");
+ }
+
+ /***
+ * GatewayProperties没有@PreDestroy和destroy方法
+ * org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder#rebind(java.lang.String)中destroyBean时不会销毁当前对象
+ * 如果把spring.cloud.gateway.前缀的配置项全部删除(例如需要动态删除最后一个路由的场景),initializeBean时也无法创建新的bean,则return当前bean
+ * 若仍保留有spring.cloud.gateway.routes[n]或spring.cloud.gateway.default-filters[n]等配置,initializeBean时会注入新的属性替换已有的bean
+ * 这个方法提供了类似@PreDestroy的操作,根据配置文件的实际情况把org.springframework.cloud.gateway.config.GatewayProperties#routes
+ * 和org.springframework.cloud.gateway.config.GatewayProperties#defaultFilters两个集合清空
+ *
+ * @param
+ * @return void
+ * @author ksewen
+ * @date 2019/5/21 2:13 PM
+ */
+ private synchronized void preDestroyGatewayProperties(ConfigChangeEvent changeEvent) {
+ logger.info("Pre Destroy GatewayProperties!");
+ final boolean needClearRoutes = this.checkNeedClear(changeEvent, ID_PATTERN, this.gatewayProperties.getRoutes().size());
+ if (needClearRoutes) {
+ this.gatewayProperties.setRoutes(new ArrayList<>());
+ }
+ final boolean needClearDefaultFilters = this.checkNeedClear(changeEvent, DEFAULT_FILTER_PATTERN, this.gatewayProperties.getDefaultFilters().size());
+ if (needClearDefaultFilters) {
+ this.gatewayProperties.setRoutes(new ArrayList<>());
+ }
+ logger.info("Pre Destroy GatewayProperties finished!");
+ }
+
+ private void refreshGatewayRouteDefinition() {
+ logger.info("Refreshing Gateway RouteDefinition!");
+ this.publisher.publishEvent(new RefreshRoutesEvent(this));
+ logger.info("Gateway RouteDefinition refreshed!");
+ }
+
+ /***
+ * 根据changeEvent和定义的pattern匹配key,如果所有对应PropertyChangeType为DELETED则需要清空GatewayProperties里相关集合
+ *
+ * @param changeEvent
+ * @param pattern
+ * @param existSize
+ * @return boolean
+ * @author ksewen
+ * @date 2019/5/23 2:18 PM
+ */
+ private boolean checkNeedClear(ConfigChangeEvent changeEvent, String pattern, int existSize) {
+ return changeEvent.changedKeys().stream().filter(key -> key.matches(pattern))
+ .filter(key -> {
+ ConfigChange change = changeEvent.getChange(key);
+ return PropertyChangeType.DELETED.equals(change.getChangeType());
+ }).count() == existSize;
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/resources/application.yaml
new file mode 100644
index 00000000..2de7aed3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/resources/application.yaml
@@ -0,0 +1,26 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,全部配置在 Apollo 中
+# gateway:
+
+ # Nacos 作为注册中心的配置项
+ nacos:
+ discovery:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址
+
+# Apollo 相关配置项
+app:
+ id: ${spring.application.name} # 使用的 Apollo 的项目(应用)编号
+apollo:
+ meta: http://127.0.0.1:8080 # Apollo Meta Server 地址
+ bootstrap:
+ enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。
+ eagerLoad:
+ enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。
+ namespaces: application # 使用的 Apollo 的命名空间,默认为 application。
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index 4c0a8f0b..e12d5e84 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -15,6 +15,8 @@
labx-08-sc-gateway-demo01
labx-08-sc-gateway-demo02-registry
+ labx-08-sc-gateway-demo03-config-apollo
+
labx-08-sc-user-service
From 0626cc3d818bcd6aac271c3d46270d21a93515a0 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Wed, 26 Feb 2020 20:52:46 +0800
Subject: [PATCH 05/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/resources/application.yaml | 3 +
.../src/main/resources/application.yaml | 3 +
.../GatewayPropertiesRefresher.java | 10 +-
.../pom.xml | 72 ++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 +++
.../GatewayPropertiesRefresher.java | 103 ++++++++++++++++++
.../src/main/resources/application.yaml | 24 ++++
.../src/main/resources/bootstrap.yaml | 13 +++
labx-08/pom.xml | 1 +
9 files changed, 241 insertions(+), 1 deletion(-)
create mode 100644 labx-08/labx-08-sc-gateway-demo03-config-nacos/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
create mode 100644 labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/application.yaml
create mode 100644 labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/bootstrap.yaml
diff --git a/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml
index 0441e120..8e7ac23f 100644
--- a/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml
+++ b/labx-08/labx-08-sc-gateway-demo01/src/main/resources/application.yaml
@@ -2,6 +2,9 @@ server:
port: 8888
spring:
+ application:
+ name: gateway-application
+
cloud:
# Spring Cloud Gateway 配置项,对应 GatewayProperties 类
gateway:
diff --git a/labx-08/labx-08-sc-gateway-demo02-registry/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo02-registry/src/main/resources/application.yaml
index 1e130765..29530ca3 100644
--- a/labx-08/labx-08-sc-gateway-demo02-registry/src/main/resources/application.yaml
+++ b/labx-08/labx-08-sc-gateway-demo02-registry/src/main/resources/application.yaml
@@ -2,6 +2,9 @@ server:
port: 8888
spring:
+ application:
+ name: gateway-application
+
cloud:
# Spring Cloud Gateway 配置项,对应 GatewayProperties 类
gateway:
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java b/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
index 996aeebb..54e4eec6 100644
--- a/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
+++ b/labx-08/labx-08-sc-gateway-demo03-config-apollo/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
@@ -20,6 +20,9 @@ import org.springframework.stereotype.Component;
import java.util.ArrayList;
+/**
+ * 由 https://github.com/ctripcorp/apollo-use-cases/tree/master/spring-cloud-gateway 提供代码,感谢~
+ */
@Component
public class GatewayPropertiesRefresher implements ApplicationContextAware, ApplicationEventPublisherAware {
@@ -44,7 +47,6 @@ public class GatewayPropertiesRefresher implements ApplicationContextAware, Appl
this.applicationContext = applicationContext;
}
-
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher;
@@ -65,8 +67,11 @@ public class GatewayPropertiesRefresher implements ApplicationContextAware, Appl
*/
private void refreshGatewayProperties(ConfigChangeEvent changeEvent) {
logger.info("Refreshing GatewayProperties!");
+ // <1>
preDestroyGatewayProperties(changeEvent);
+ // <2>
this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
+ // <3>
refreshGatewayRouteDefinition();
logger.info("GatewayProperties refreshed!");
}
@@ -86,10 +91,12 @@ public class GatewayPropertiesRefresher implements ApplicationContextAware, Appl
*/
private synchronized void preDestroyGatewayProperties(ConfigChangeEvent changeEvent) {
logger.info("Pre Destroy GatewayProperties!");
+ // 判断 `spring.cloud.gateway.routes` 配置项,是否被全部删除。如果是,则置空 GatewayProperties 的 `routes` 属性
final boolean needClearRoutes = this.checkNeedClear(changeEvent, ID_PATTERN, this.gatewayProperties.getRoutes().size());
if (needClearRoutes) {
this.gatewayProperties.setRoutes(new ArrayList<>());
}
+ // 判断 `spring.cloud.gateway.default-filters` 配置项,是否被全部删除。如果是,则置空 GatewayProperties 的 `defaultFilters` 属性
final boolean needClearDefaultFilters = this.checkNeedClear(changeEvent, DEFAULT_FILTER_PATTERN, this.gatewayProperties.getDefaultFilters().size());
if (needClearDefaultFilters) {
this.gatewayProperties.setRoutes(new ArrayList<>());
@@ -113,6 +120,7 @@ public class GatewayPropertiesRefresher implements ApplicationContextAware, Appl
* @author ksewen
* @date 2019/5/23 2:18 PM
*/
+ // 判断是否清除的标准,是通过指定配置项被删除的数量,是否和内存中的该配置项的数量一样。如果一样,说明被清空了
private boolean checkNeedClear(ConfigChangeEvent changeEvent, String pattern, int existSize) {
return changeEvent.changedKeys().stream().filter(key -> key.matches(pattern))
.filter(key -> {
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-nacos/pom.xml b/labx-08/labx-08-sc-gateway-demo03-config-nacos/pom.xml
new file mode 100644
index 00000000..dbb8dd34
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo03-config-nacos/pom.xml
@@ -0,0 +1,72 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo03-config-nacos
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
new file mode 100644
index 00000000..e586225c
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
@@ -0,0 +1,103 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
+import org.springframework.cloud.gateway.config.GatewayProperties;
+import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
+import org.springframework.context.*;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+
+@Component
+public class GatewayPropertiesRefresher implements ApplicationListener,
+ ApplicationContextAware, ApplicationEventPublisherAware, EnvironmentAware {
+
+ private static final Logger logger = LoggerFactory.getLogger(GatewayPropertiesRefresher.class);
+
+ private static final String ID_PATTERN = "spring.cloud.gateway.routes";
+
+ private static final String DEFAULT_FILTER_PATTERN = "spring.cloud.gateway.default-filters";
+
+ private ApplicationContext applicationContext;
+
+ private ApplicationEventPublisher publisher;
+
+ private Environment environment;
+
+ @Autowired
+ private GatewayProperties gatewayProperties;
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ this.applicationContext = applicationContext;
+ }
+
+ @Override
+ public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
+ this.publisher = publisher;
+ }
+
+ @Override
+ public void setEnvironment(Environment environment) {
+ this.environment = environment;
+ }
+
+ @Override
+ public void onApplicationEvent(EnvironmentChangeEvent changeEvent) {
+ if (true) {
+ return;
+ }
+ // <0> 只处理 `spring.cloud.gateway` 配置项的变更
+ if (!isGatewayConfigChanged(changeEvent)) {
+ return;
+ }
+ // <1>
+ preDestroyGatewayProperties(changeEvent);
+ // <2> 貌似不用添加。添加了就死循环了。
+// this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.getKeys()));
+ // <3>
+// refreshGatewayRouteDefinition();
+ }
+
+ private boolean isGatewayConfigChanged(EnvironmentChangeEvent changeEvent) {
+ for (String key : changeEvent.getKeys()) {
+ if (key.contains(ID_PATTERN)
+ || key.contains(DEFAULT_FILTER_PATTERN)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private synchronized void preDestroyGatewayProperties(EnvironmentChangeEvent changeEvent) {
+ logger.info("Pre Destroy GatewayProperties!");
+ // 判断 `spring.cloud.gateway.routes` 配置项,是否被全部删除。如果是,则置空 GatewayProperties 的 `routes` 属性
+ final boolean needClearRoutes = this.checkNeedClear(ID_PATTERN);
+ if (needClearRoutes) {
+ this.gatewayProperties.setRoutes(new ArrayList<>());
+ }
+ // 判断 `spring.cloud.gateway.default-filters` 配置项,是否被全部删除。如果是,则置空 GatewayProperties 的 `defaultFilters` 属性
+ final boolean needClearDefaultFilters = this.checkNeedClear(DEFAULT_FILTER_PATTERN);
+ if (needClearDefaultFilters) {
+ this.gatewayProperties.setRoutes(new ArrayList<>());
+ }
+ logger.info("Pre Destroy GatewayProperties finished!");
+ }
+
+ private void refreshGatewayRouteDefinition() {
+ logger.info("Refreshing Gateway RouteDefinition!");
+ this.publisher.publishEvent(new RefreshRoutesEvent(this));
+ logger.info("Gateway RouteDefinition refreshed!");
+ }
+
+ // 判断是否清除的标准,判断指定属性是否为空。如果是,则说明被清空了。
+ private boolean checkNeedClear(String pattern) {
+ return environment.getProperty(pattern) == null;
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/application.yaml
new file mode 100644
index 00000000..fb709beb
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/application.yaml
@@ -0,0 +1,24 @@
+server:
+ port: 8888
+
+spring:
+
+ cloud:
+ # Spring Cloud Gateway 配置项,全部配置在 Apollo 中
+# gateway:
+
+ # Nacos 作为注册中心的配置项
+ nacos:
+ discovery:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址
+
+# Apollo 相关配置项
+app:
+ id: ${spring.application.name} # 使用的 Apollo 的项目(应用)编号
+apollo:
+ meta: http://127.0.0.1:8080 # Apollo Meta Server 地址
+ bootstrap:
+ enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。
+ eagerLoad:
+ enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。
+ namespaces: application # 使用的 Apollo 的命名空间,默认为 application。
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/bootstrap.yaml b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/bootstrap.yaml
new file mode 100644
index 00000000..7c0386d7
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/bootstrap.yaml
@@ -0,0 +1,13 @@
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ nacos:
+ # Nacos Config 配置项,对应 NacosConfigProperties 配置属性类
+ config:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址
+ namespace: # 使用的 Nacos 的命名空间,默认为 null
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ name: # 使用的 Nacos 配置集的 dataId,默认为 spring.application.name
+ file-extension: yaml # 使用的 Nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index e12d5e84..ac22d241 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -16,6 +16,7 @@
labx-08-sc-gateway-demo02-registry
labx-08-sc-gateway-demo03-config-apollo
+ labx-08-sc-gateway-demo03-config-nacos
labx-08-sc-user-service
From 77417c7a665ddf4306ec2bbf6e51fce93e2f827f Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Thu, 27 Feb 2020 23:13:21 +0800
Subject: [PATCH 06/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../GatewayPropertiesRefresher.java | 103 ------------------
.../src/main/resources/application.yaml | 13 +--
labx-08/labx-08-sc-gateway-demo04/pom.xml | 58 ++++++++++
.../gatewaydemo/GatewayApplication.java | 13 +++
.../src/main/resources/application.yaml | 22 ++++
labx-08/pom.xml | 2 +
6 files changed, 96 insertions(+), 115 deletions(-)
delete mode 100644 labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
create mode 100644 labx-08/labx-08-sc-gateway-demo04/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo04/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo04/src/main/resources/application.yaml
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
deleted file mode 100644
index e586225c..00000000
--- a/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayPropertiesRefresher.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package cn.iocoder.springcloud.labx08.gatewaydemo;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
-import org.springframework.cloud.gateway.config.GatewayProperties;
-import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
-import org.springframework.context.*;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-
-@Component
-public class GatewayPropertiesRefresher implements ApplicationListener,
- ApplicationContextAware, ApplicationEventPublisherAware, EnvironmentAware {
-
- private static final Logger logger = LoggerFactory.getLogger(GatewayPropertiesRefresher.class);
-
- private static final String ID_PATTERN = "spring.cloud.gateway.routes";
-
- private static final String DEFAULT_FILTER_PATTERN = "spring.cloud.gateway.default-filters";
-
- private ApplicationContext applicationContext;
-
- private ApplicationEventPublisher publisher;
-
- private Environment environment;
-
- @Autowired
- private GatewayProperties gatewayProperties;
-
- @Override
- public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
- this.applicationContext = applicationContext;
- }
-
- @Override
- public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
- this.publisher = publisher;
- }
-
- @Override
- public void setEnvironment(Environment environment) {
- this.environment = environment;
- }
-
- @Override
- public void onApplicationEvent(EnvironmentChangeEvent changeEvent) {
- if (true) {
- return;
- }
- // <0> 只处理 `spring.cloud.gateway` 配置项的变更
- if (!isGatewayConfigChanged(changeEvent)) {
- return;
- }
- // <1>
- preDestroyGatewayProperties(changeEvent);
- // <2> 貌似不用添加。添加了就死循环了。
-// this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.getKeys()));
- // <3>
-// refreshGatewayRouteDefinition();
- }
-
- private boolean isGatewayConfigChanged(EnvironmentChangeEvent changeEvent) {
- for (String key : changeEvent.getKeys()) {
- if (key.contains(ID_PATTERN)
- || key.contains(DEFAULT_FILTER_PATTERN)) {
- return true;
- }
- }
- return false;
- }
-
- private synchronized void preDestroyGatewayProperties(EnvironmentChangeEvent changeEvent) {
- logger.info("Pre Destroy GatewayProperties!");
- // 判断 `spring.cloud.gateway.routes` 配置项,是否被全部删除。如果是,则置空 GatewayProperties 的 `routes` 属性
- final boolean needClearRoutes = this.checkNeedClear(ID_PATTERN);
- if (needClearRoutes) {
- this.gatewayProperties.setRoutes(new ArrayList<>());
- }
- // 判断 `spring.cloud.gateway.default-filters` 配置项,是否被全部删除。如果是,则置空 GatewayProperties 的 `defaultFilters` 属性
- final boolean needClearDefaultFilters = this.checkNeedClear(DEFAULT_FILTER_PATTERN);
- if (needClearDefaultFilters) {
- this.gatewayProperties.setRoutes(new ArrayList<>());
- }
- logger.info("Pre Destroy GatewayProperties finished!");
- }
-
- private void refreshGatewayRouteDefinition() {
- logger.info("Refreshing Gateway RouteDefinition!");
- this.publisher.publishEvent(new RefreshRoutesEvent(this));
- logger.info("Gateway RouteDefinition refreshed!");
- }
-
- // 判断是否清除的标准,判断指定属性是否为空。如果是,则说明被清空了。
- private boolean checkNeedClear(String pattern) {
- return environment.getProperty(pattern) == null;
- }
-
-}
diff --git a/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/application.yaml
index fb709beb..c8a543ea 100644
--- a/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/application.yaml
+++ b/labx-08/labx-08-sc-gateway-demo03-config-nacos/src/main/resources/application.yaml
@@ -4,21 +4,10 @@ server:
spring:
cloud:
- # Spring Cloud Gateway 配置项,全部配置在 Apollo 中
+ # Spring Cloud Gateway 配置项,全部配置在 Nacos 中
# gateway:
# Nacos 作为注册中心的配置项
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
-
-# Apollo 相关配置项
-app:
- id: ${spring.application.name} # 使用的 Apollo 的项目(应用)编号
-apollo:
- meta: http://127.0.0.1:8080 # Apollo Meta Server 地址
- bootstrap:
- enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。
- eagerLoad:
- enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。
- namespaces: application # 使用的 Apollo 的命名空间,默认为 application。
diff --git a/labx-08/labx-08-sc-gateway-demo04/pom.xml b/labx-08/labx-08-sc-gateway-demo04/pom.xml
new file mode 100644
index 00000000..a197b6eb
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo04/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo04
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo04/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo04/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo04/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo04/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo04/src/main/resources/application.yaml
new file mode 100644
index 00000000..ca7f104f
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo04/src/main/resources/application.yaml
@@ -0,0 +1,22 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+ - id: user-service-prod
+ uri: http://www.iocoder.cn
+ predicates:
+ - Path=/**
+ - Weight=user-service, 90
+ - id: user-service-canary
+ uri: https://www.oschina.net
+ predicates:
+ - Path=/**
+ - Weight=user-service, 10
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index ac22d241..aff50d4c 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -18,6 +18,8 @@
labx-08-sc-gateway-demo03-config-apollo
labx-08-sc-gateway-demo03-config-nacos
+ labx-08-sc-gateway-demo04
+
labx-08-sc-user-service
From e58deef8eef751e170dd095c7e65db8996a563b1 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Fri, 28 Feb 2020 18:45:01 +0800
Subject: [PATCH 07/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 60 ++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 +++
.../filter/AuthGatewayFilterFactory.java | 98 +++++++++++++++++++
.../src/main/resources/application.yaml | 29 ++++++
.../target/classes/application.yaml | 29 ++++++
labx-08/pom.xml | 2 +
6 files changed, 231 insertions(+)
create mode 100644 labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/filter/AuthGatewayFilterFactory.java
create mode 100644 labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/resources/application.yaml
create mode 100644 labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/target/classes/application.yaml
diff --git a/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/pom.xml b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/pom.xml
new file mode 100644
index 00000000..860c0774
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/pom.xml
@@ -0,0 +1,60 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo05-custom-gateway-filter
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/filter/AuthGatewayFilterFactory.java b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/filter/AuthGatewayFilterFactory.java
new file mode 100644
index 00000000..f54c3e0b
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/filter/AuthGatewayFilterFactory.java
@@ -0,0 +1,98 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo.filter;
+
+import org.springframework.cloud.gateway.filter.GatewayFilter;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory {
+
+ public AuthGatewayFilterFactory() {
+ super(AuthGatewayFilterFactory.Config.class);
+ }
+
+ @Override
+ public GatewayFilter apply(Config config) {
+ // token 和 userId 的映射
+ Map tokenMap = new HashMap<>();
+ tokenMap.put("yunai", 1);
+
+ // 创建 GatewayFilter 对象
+ return new GatewayFilter() {
+
+ @Override
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ // 获得 token
+ ServerHttpRequest request = exchange.getRequest();
+ HttpHeaders headers = request.getHeaders();
+ String token = headers.getFirst(config.getTokenHeaderName());
+
+ // 如果没有 token,则不进行认证。因为可能是无需认证的 API 接口
+ if (!StringUtils.hasText(token)) {
+ return chain.filter(exchange);
+ }
+
+ // 进行认证
+ ServerHttpResponse response = exchange.getResponse();
+ Integer userId = tokenMap.get(token);
+
+ // 通过 token 获取不到 userId,说明认证不通过
+ if (userId == null) {
+ // 响应 401 状态码
+ response.setStatusCode(HttpStatus.UNAUTHORIZED);
+ // 响应提示
+ DataBuffer buffer = exchange.getResponse().bufferFactory().wrap("认证不通过".getBytes());
+ return response.writeWith(Flux.just(buffer));
+ }
+
+ // 认证通过,将 userId 添加到 Header 中
+ request = request.mutate().header(config.getUserIdHeaderName(), String.valueOf(userId))
+ .build();
+ return chain.filter(exchange.mutate().request(request).build());
+ }
+
+ };
+ }
+
+ public static class Config {
+
+ private static final String DEFAULT_TOKEN_HEADER_NAME = "token";
+ private static final String DEFAULT_HEADER_NAME = "user-id";
+
+ private String tokenHeaderName = DEFAULT_TOKEN_HEADER_NAME;
+ private String userIdHeaderName = DEFAULT_HEADER_NAME;
+
+ public String getTokenHeaderName() {
+ return tokenHeaderName;
+ }
+
+ public String getUserIdHeaderName() {
+ return userIdHeaderName;
+ }
+
+ public Config setTokenHeaderName(String tokenHeaderName) {
+ this.tokenHeaderName = tokenHeaderName;
+ return this;
+ }
+
+ public Config setUserIdHeaderName(String userIdHeaderName) {
+ this.userIdHeaderName = userIdHeaderName;
+ return this;
+ }
+
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/resources/application.yaml
new file mode 100644
index 00000000..f9d50ef0
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/src/main/resources/application.yaml
@@ -0,0 +1,29 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+ - id: yudaoyuanma # 路由的编号
+ uri: http://www.iocoder.cn # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/blog
+ filters:
+ - StripPrefix=1
+ - id: oschina # 路由的编号
+ uri: https://www.oschina.net # 路由的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/oschina
+ filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
+ - StripPrefix=1
+ # 默认过滤器,对应 FilterDefinition 数组
+ default-filters:
+ - name: Auth
+ args:
+ token-header-name: access-token
diff --git a/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/target/classes/application.yaml b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/target/classes/application.yaml
new file mode 100644
index 00000000..f9d50ef0
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo05-custom-gateway-filter/target/classes/application.yaml
@@ -0,0 +1,29 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+ - id: yudaoyuanma # 路由的编号
+ uri: http://www.iocoder.cn # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/blog
+ filters:
+ - StripPrefix=1
+ - id: oschina # 路由的编号
+ uri: https://www.oschina.net # 路由的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/oschina
+ filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
+ - StripPrefix=1
+ # 默认过滤器,对应 FilterDefinition 数组
+ default-filters:
+ - name: Auth
+ args:
+ token-header-name: access-token
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index aff50d4c..0dca5840 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -20,6 +20,8 @@
labx-08-sc-gateway-demo04
+ labx-08-sc-gateway-demo05-custom-gateway-filter
+
labx-08-sc-user-service
From 6942001c854e6f16c5466298ac193c35b58b52b7 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Fri, 28 Feb 2020 23:19:14 +0800
Subject: [PATCH 08/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 66 +++++++++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 ++++
.../gatewaydemo/config/GatewayConfig.java | 25 +++++++
.../src/main/resources/application.yaml | 34 ++++++++++
labx-08/pom.xml | 2 +
5 files changed, 140 insertions(+)
create mode 100644 labx-08/labx-08-sc-gateway-demo06-rate-limiter/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java
create mode 100644 labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/resources/application.yaml
diff --git a/labx-08/labx-08-sc-gateway-demo06-rate-limiter/pom.xml b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/pom.xml
new file mode 100644
index 00000000..199db95e
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/pom.xml
@@ -0,0 +1,66 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo06-rate-limiter
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java
new file mode 100644
index 00000000..9822fa87
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java
@@ -0,0 +1,25 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo.config;
+
+import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+@Configuration
+public class GatewayConfig {
+
+ @Bean
+ public KeyResolver ipKeyResolver() {
+ return new KeyResolver() {
+
+ @Override
+ public Mono resolve(ServerWebExchange exchange) {
+ // 获取请求的 IP
+ return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
+ }
+
+ };
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/resources/application.yaml
new file mode 100644
index 00000000..80ebe810
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/src/main/resources/application.yaml
@@ -0,0 +1,34 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+ - id: yudaoyuanma # 路由的编号
+ uri: http://www.iocoder.cn # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/blog
+ filters:
+ - StripPrefix=1
+ - name: RequestRateLimiter
+ args:
+ redis-rate-limiter.replenishRate: 1 # 令牌桶的每秒放的数量
+ redis-rate-limiter.burstCapacity: 2 # 令牌桶的最大令牌数
+ key-resolver: "#{@ipKeyResolver}" # 获取限流 KEY 的 Bean 的名字
+ - id: oschina # 路由的编号
+ uri: https://www.oschina.net # 路由的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/oschina
+ filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
+ - StripPrefix=1
+
+ # Redis 配置项
+ redis:
+ host: 127.0.0.1
+ port: 6379
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index 0dca5840..c3d84b13 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -22,6 +22,8 @@
labx-08-sc-gateway-demo05-custom-gateway-filter
+ labx-08-sc-gateway-demo06-rate-limiter
+
labx-08-sc-user-service
From 41c8092f3a0614754f9440ce2eb19e8c2261dc15 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sat, 29 Feb 2020 01:14:29 +0800
Subject: [PATCH 09/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../labx-08-sc-gateway-demo07-hystrix/pom.xml | 64 +++++++++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 ++++
.../controller/FallbackController.java | 24 +++++++
.../src/main/resources/application.yaml | 21 ++++++
labx-08/pom.xml | 2 +
5 files changed, 124 insertions(+)
create mode 100644 labx-08/labx-08-sc-gateway-demo07-hystrix/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/controller/FallbackController.java
create mode 100644 labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/resources/application.yaml
diff --git a/labx-08/labx-08-sc-gateway-demo07-hystrix/pom.xml b/labx-08/labx-08-sc-gateway-demo07-hystrix/pom.xml
new file mode 100644
index 00000000..2d6ee395
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-hystrix/pom.xml
@@ -0,0 +1,64 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo07-hystrix
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-hystrix
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/controller/FallbackController.java b/labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/controller/FallbackController.java
new file mode 100644
index 00000000..ad97a80c
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/controller/FallbackController.java
@@ -0,0 +1,24 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.server.ServerWebExchange;
+
+@RestController
+public class FallbackController {
+
+ private Logger logger = LoggerFactory.getLogger(FallbackController.class);
+
+ @GetMapping("/fallback")
+ public String fallback(ServerWebExchange exchange) {
+// URI requestUrl = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);
+ Throwable executionException = exchange.getAttribute(ServerWebExchangeUtils.HYSTRIX_EXECUTION_EXCEPTION_ATTR);
+ logger.error("[fallback][发生异常]", executionException);
+
+ return "服务降级..." + executionException.getMessage();
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/resources/application.yaml
new file mode 100644
index 00000000..cbe1dba3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-hystrix/src/main/resources/application.yaml
@@ -0,0 +1,21 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+ - id: hystrix_test
+ uri: http://127.0.0.1:18181
+ predicates:
+ - Path=/**
+ filters:
+ - name: Hystrix
+ args:
+ name: fallbackcmd # 对应的 Hystrix Command 名字
+ fallbackUri: forward:/fallback # 处理 Hystrix fallback 的情况,重定向到指定地址
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index c3d84b13..fe37468f 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -24,6 +24,8 @@
labx-08-sc-gateway-demo06-rate-limiter
+ labx-08-sc-gateway-demo07-hystrix
+
labx-08-sc-user-service
From dfb2b76549075e003df9a26deaae6f63bb140a9d Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sat, 29 Feb 2020 10:15:14 +0800
Subject: [PATCH 10/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 68 +++++++++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 ++++
.../src/main/resources/application.yaml | 37 ++++++++++
.../main/resources/sentinel-gw-api-group.json | 23 +++++++
.../src/main/resources/sentinel-gw-flow.json | 10 +++
labx-08/pom.xml | 1 +
6 files changed, 152 insertions(+)
create mode 100644 labx-08/labx-08-sc-gateway-demo07-sentinel/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml
create mode 100644 labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/sentinel-gw-api-group.json
create mode 100644 labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/sentinel-gw-flow.json
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/pom.xml b/labx-08/labx-08-sc-gateway-demo07-sentinel/pom.xml
new file mode 100644
index 00000000..84065d8f
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/pom.xml
@@ -0,0 +1,68 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo07-sentinel
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-sentinel-gateway
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml
new file mode 100644
index 00000000..c636d4f7
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml
@@ -0,0 +1,37 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+ - id: yudaoyuanma # 路由的编号
+ uri: http://www.iocoder.cn # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/**
+
+ sentinel:
+ eager: true # 是否饥饿加载。默认为 false 关闭
+ transport:
+ dashboard: localhost:7070
+ filter:
+ enabled: true
+ datasource:
+ ds2.file:
+ file: "classpath: sentinel-gw-flow.json"
+ ruleType: gw-flow
+ ds1.file:
+ file: "classpath: sentinel-gw-api-group.json"
+ ruleType: gw-api-group
+ scg:
+ order: -100
+ fallback:
+ mode: response
+ response-status: 444
+ response-body: 123
+
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/sentinel-gw-api-group.json b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/sentinel-gw-api-group.json
new file mode 100644
index 00000000..0e47591b
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/sentinel-gw-api-group.json
@@ -0,0 +1,23 @@
+[
+ {
+ "apiName": "yudaoyuanma_customized_api",
+ "predicateItems": [
+ {
+ "pattern": "/categories/**",
+ "matchStrategy": 1
+ },
+ {
+ "items": [
+ {
+ "pattern": "/Dubbo/good-collection/",
+ "matchStrategy": 0
+ },
+ {
+ "pattern": "/SkyWalking/**",
+ "matchStrategy": 1
+ }
+ ]
+ }
+ ]
+ }
+]
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/sentinel-gw-flow.json b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/sentinel-gw-flow.json
new file mode 100644
index 00000000..8a53df34
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/sentinel-gw-flow.json
@@ -0,0 +1,10 @@
+[
+ {
+ "resource": "yudaoyuanma",
+ "count": 3
+ },
+ {
+ "resource": "yudaoyuanma_customized_api",
+ "count": 1
+ }
+]
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index fe37468f..95b68923 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -25,6 +25,7 @@
labx-08-sc-gateway-demo06-rate-limiter
labx-08-sc-gateway-demo07-hystrix
+ labx-08-sc-gateway-demo07-sentinel
labx-08-sc-user-service
From 2ff9136d1c3dfc7520544c1c18cfd4c7261acad4 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sat, 29 Feb 2020 10:36:33 +0800
Subject: [PATCH 11/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 2 ++
.../CustomBlockRequestHandler.java | 23 +++++++++++++++++++
.../src/main/resources/application.yaml | 23 +++++++++++--------
3 files changed, 38 insertions(+), 10 deletions(-)
create mode 100644 labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/CustomBlockRequestHandler.java
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/pom.xml b/labx-08/labx-08-sc-gateway-demo07-sentinel/pom.xml
index 84065d8f..e2d82ac3 100644
--- a/labx-08/labx-08-sc-gateway-demo07-sentinel/pom.xml
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/pom.xml
@@ -12,6 +12,8 @@
labx-08-sc-gateway-demo07-sentinel
+ 1.8
+ 1.8
2.2.4.RELEASE
Hoxton.SR1
2.2.0.RELEASE
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/CustomBlockRequestHandler.java b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/CustomBlockRequestHandler.java
new file mode 100644
index 00000000..41dc9191
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/CustomBlockRequestHandler.java
@@ -0,0 +1,23 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+@Component
+public class CustomBlockRequestHandler implements BlockRequestHandler {
+
+ private static final String DEFAULT_BLOCK_MSG_PREFIX = "HAHAHA ~ Blocked by Sentinel: ";
+
+ @Override
+ public Mono handleRequest(ServerWebExchange exchange, Throwable ex) {
+ return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)
+ .contentType(MediaType.TEXT_PLAIN)
+ .bodyValue(DEFAULT_BLOCK_MSG_PREFIX + ex.getClass().getSimpleName());
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml
index c636d4f7..d3f93177 100644
--- a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml
@@ -18,20 +18,23 @@ spring:
sentinel:
eager: true # 是否饥饿加载。默认为 false 关闭
transport:
- dashboard: localhost:7070
- filter:
- enabled: true
+ dashboard: localhost:7070 # 是否饥饿加载。默认为 false 关闭
+ # 数据源的配置项
datasource:
- ds2.file:
+ ds1.file:
file: "classpath: sentinel-gw-flow.json"
ruleType: gw-flow
- ds1.file:
+ ds2.file:
file: "classpath: sentinel-gw-api-group.json"
ruleType: gw-api-group
+ # Sentinel 对 Spring Cloud Gateway 的专属配置项,对应 SentinelGatewayProperties 类
scg:
- order: -100
+ order:
fallback:
- mode: response
- response-status: 444
- response-body: 123
-
+ mode: # fallback 模式,目前有三种:response、redirect、空
+ # 专属 response 模式
+ response-status: 429 # 响应状态码,默认为 429
+ response-body: 你被 block 了... # 响应内容,默认为空
+ content-type: application/json # 内容类型,默认为 application/json
+ # 专属 redirect 模式
+ redirect: http://www.baidu.com
From 04bc047b334dc2c981ee96691caa8e7647c33173 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sat, 29 Feb 2020 13:23:54 +0800
Subject: [PATCH 12/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../gatewaydemo/CustomBlockRequestHandler.java | 6 +++---
.../labx08/gatewaydemo/GatewayApplication.java | 2 ++
.../src/main/resources/application.yaml | 18 +++++++++---------
3 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/CustomBlockRequestHandler.java b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/CustomBlockRequestHandler.java
index 41dc9191..c3ec62ce 100644
--- a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/CustomBlockRequestHandler.java
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/CustomBlockRequestHandler.java
@@ -15,9 +15,9 @@ public class CustomBlockRequestHandler implements BlockRequestHandler {
@Override
public Mono handleRequest(ServerWebExchange exchange, Throwable ex) {
- return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)
- .contentType(MediaType.TEXT_PLAIN)
- .bodyValue(DEFAULT_BLOCK_MSG_PREFIX + ex.getClass().getSimpleName());
+ return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS) // 状态码
+ .contentType(MediaType.TEXT_PLAIN) // 内容类型为 text/plain 纯文本
+ .bodyValue(DEFAULT_BLOCK_MSG_PREFIX + ex.getClass().getSimpleName()); // 错误提示
}
}
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
index f9575ef3..1ba74349 100644
--- a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -7,6 +7,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
public class GatewayApplication {
public static void main(String[] args) {
+// System.setProperty(SentinelConfig.APP_TYPE, ConfigConstants.APP_TYPE_SCG_GATEWAY);
+// System.setProperty(SentinelConfig.APP_TYPE, "1");
SpringApplication.run(GatewayApplication.class, args);
}
diff --git a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml
index d3f93177..52330eb8 100644
--- a/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml
+++ b/labx-08/labx-08-sc-gateway-demo07-sentinel/src/main/resources/application.yaml
@@ -19,17 +19,17 @@ spring:
eager: true # 是否饥饿加载。默认为 false 关闭
transport:
dashboard: localhost:7070 # 是否饥饿加载。默认为 false 关闭
- # 数据源的配置项
- datasource:
- ds1.file:
- file: "classpath: sentinel-gw-flow.json"
- ruleType: gw-flow
- ds2.file:
- file: "classpath: sentinel-gw-api-group.json"
- ruleType: gw-api-group
+# # 数据源的配置项
+# datasource:
+# ds1.file:
+# file: "classpath: sentinel-gw-flow.json"
+# ruleType: gw-flow
+# ds2.file:
+# file: "classpath: sentinel-gw-api-group.json"
+# ruleType: gw-api-group
# Sentinel 对 Spring Cloud Gateway 的专属配置项,对应 SentinelGatewayProperties 类
scg:
- order:
+ order: -2147483648 # 过滤器顺序,默认为 -2147483648 最高优先级
fallback:
mode: # fallback 模式,目前有三种:response、redirect、空
# 专属 response 模式
From 3ec9130de7263010d5b74364108882e27f516342 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sat, 29 Feb 2020 23:01:27 +0800
Subject: [PATCH 13/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../labx-08-sc-gateway-demo01-test/pom.xml | 60 ++++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 +++
.../gatewaydemo/config/GatewayConfig.java | 46 +++++++++++
.../src/main/resources/application.yaml | 29 +++++++
.../pom.xml | 1 +
.../pom.xml | 79 +++++++++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 +++
.../labx08/gatewaydemo/User03Controller.java | 35 ++++++++
.../config/RestTemplateConfig.java | 19 +++++
.../gatewaydemo/filter/DubboFilter.java | 42 ++++++++++
.../src/main/resources/application.yaml | 39 +++++++++
labx-08/pom.xml | 4 +
12 files changed, 380 insertions(+)
create mode 100644 labx-08/labx-08-sc-gateway-demo01-test/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java
create mode 100644 labx-08/labx-08-sc-gateway-demo01-test/src/main/resources/application.yaml
create mode 100644 labx-08/labx-08-sc-gateway-demo08-custom-global-filter/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/User03Controller.java
create mode 100644 labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/RestTemplateConfig.java
create mode 100644 labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/filter/DubboFilter.java
create mode 100644 labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/resources/application.yaml
diff --git a/labx-08/labx-08-sc-gateway-demo01-test/pom.xml b/labx-08/labx-08-sc-gateway-demo01-test/pom.xml
new file mode 100644
index 00000000..7f948e8a
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo01-test/pom.xml
@@ -0,0 +1,60 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo01-test
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java b/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java
new file mode 100644
index 00000000..84bfe2af
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java
@@ -0,0 +1,46 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import reactor.core.publisher.Mono;
+
+@Configuration
+public class GatewayConfig {
+
+ private Logger logger = LoggerFactory.getLogger(GatewayConfig.class);
+
+ @Bean
+ @Order(1)
+ public GlobalFilter firstGlobalFilter() {
+ return (exchange, chain) -> {
+ logger.info("[first][pre]");
+ return chain.filter(exchange)
+ .then(Mono.fromRunnable(() -> logger.info("[first][post]")));
+ };
+ }
+
+ @Bean
+ @Order(2)
+ public GlobalFilter secondGatewayFilter() {
+ return (exchange, chain) -> {
+ logger.info("[second][pre]");
+ return chain.filter(exchange)
+ .then(Mono.fromRunnable(() -> logger.info("[second][post]")));
+ };
+ }
+
+ @Bean
+ @Order(3)
+ public GlobalFilter thirdGlobalFilter() {
+ return (exchange, chain) -> {
+ logger.info("[third][pre]");
+ return chain.filter(exchange)
+ .then(Mono.fromRunnable(() -> logger.info("[third][post]")));
+ };
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo01-test/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo01-test/src/main/resources/application.yaml
new file mode 100644
index 00000000..1f1bf3e2
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo01-test/src/main/resources/application.yaml
@@ -0,0 +1,29 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+ - id: yudaoyuanma # 路由的编号
+ uri: http://www.iocoder.cn # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/blog
+ filters:
+ - StripPrefix=1
+ - id: oschina # 路由的编号
+ uri: https://www.oschina.net # 路由的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/oschina
+ filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
+ - StripPrefix=100
+# - StripPrefix=200
+# default-filters:
+# - StripPrefix=1
+# - StripPrefix=2
+# - StripPrefix=3
diff --git a/labx-08/labx-08-sc-gateway-demo06-rate-limiter/pom.xml b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/pom.xml
index 199db95e..0534a346 100644
--- a/labx-08/labx-08-sc-gateway-demo06-rate-limiter/pom.xml
+++ b/labx-08/labx-08-sc-gateway-demo06-rate-limiter/pom.xml
@@ -61,6 +61,7 @@
org.springframework.boot
spring-boot-starter-data-redis
+
diff --git a/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/pom.xml b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/pom.xml
new file mode 100644
index 00000000..1b5b7b27
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/pom.xml
@@ -0,0 +1,79 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo08-custom-global-filter
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-dubbo
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/User03Controller.java b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/User03Controller.java
new file mode 100644
index 00000000..2e692303
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/User03Controller.java
@@ -0,0 +1,35 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+@RestController
+@RequestMapping("/user03")
+public class User03Controller {
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+// @GetMapping("/get")
+// public UserDTO get(@RequestParam("id") Integer id) {
+// String url = String.format("http://%s/user/get?id=%d", "demo-provider", id);
+// return restTemplate.getForObject(url, UserDTO.class);
+// }
+//
+// @PostMapping("/add")
+// public Integer add(UserAddDTO addDTO) {
+// // 请求头
+// HttpHeaders headers = new HttpHeaders();
+// headers.setContentType(MediaType.APPLICATION_JSON);
+// // 请求体
+// String body = JSON.toJSONString(addDTO);
+// // 创建 HttpEntity 对象
+// HttpEntity entity = new HttpEntity<>(body, headers);
+// // 执行请求
+// String url = String.format("http://%s/user/add", "demo-provider");
+// return restTemplate.postForObject(url, entity, Integer.class);
+// }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/RestTemplateConfig.java b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/RestTemplateConfig.java
new file mode 100644
index 00000000..2f61f247
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/RestTemplateConfig.java
@@ -0,0 +1,19 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo.config;
+
+import com.alibaba.cloud.dubbo.annotation.DubboTransported;
+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;
+
+@Configuration
+public class RestTemplateConfig {
+
+ @Bean
+ @LoadBalanced
+ @DubboTransported(protocol = "dubbo")
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/filter/DubboFilter.java b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/filter/DubboFilter.java
new file mode 100644
index 00000000..238c44b5
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/filter/DubboFilter.java
@@ -0,0 +1,42 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo.filter;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.net.URI;
+
+import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;
+import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR;
+
+@Component
+public class DubboFilter implements GlobalFilter, Ordered {
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ URI url = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);
+ String schemePrefix = exchange.getAttribute(GATEWAY_SCHEME_PREFIX_ATTR);
+ if (url == null
+ || (!"dubbo".equals(url.getScheme()) && !"dubbo".equals(schemePrefix))) {
+ return chain.filter(exchange);
+ }
+
+ String urlx = String.format("http://%s/user/get?id=%d", "demo-provider", 1);
+// UserDTO result = restTemplate.getForObject(url, UserDTO.class);
+ String result = restTemplate.getForObject(url, String.class);
+
+ return null;
+ }
+
+ public int getOrder() {
+ return 10100;
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/resources/application.yaml
new file mode 100644
index 00000000..96f5a421
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo08-custom-global-filter/src/main/resources/application.yaml
@@ -0,0 +1,39 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+# - id: yudaoyuanma # 路由的编号
+# uri: http://www.iocoder.cn # 路由到的目标地址
+# predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+# - Path=/blog
+# filters:
+# - StripPrefix=1
+# - id: oschina # 路由的编号
+# uri: https://www.oschina.net # 路由的目标地址
+# predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+# - Path=/oschina
+# filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
+# - StripPrefix=1
+ - id: yudaoyuanma # 路由的编号
+ uri: dubbo://demo-provider # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/user/**
+# filters:
+# - StripPrefix=1
+
+# Dubbo 配置项,对应 DubboConfigurationProperties 类
+dubbo:
+ # Dubbo 服务注册中心配置,对应 RegistryConfig 类
+ registry:
+ address: spring-cloud://127.0.0.1:8848 # 指定 Dubbo 服务注册中心的地址
+ # Spring Cloud Alibaba Dubbo 专属配置项,对应 DubboCloudProperties 类
+ cloud:
+ subscribed-services: demo-provider # 设置订阅的应用列表,默认为 * 订阅所有应用。
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index 95b68923..2087c067 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -13,6 +13,8 @@
pom
labx-08-sc-gateway-demo01
+ labx-08-sc-gateway-demo01-test
+
labx-08-sc-gateway-demo02-registry
labx-08-sc-gateway-demo03-config-apollo
@@ -27,6 +29,8 @@
labx-08-sc-gateway-demo07-hystrix
labx-08-sc-gateway-demo07-sentinel
+ labx-08-sc-gateway-demo08-custom-global-filter
+
labx-08-sc-user-service
From c12f2571a0d6f5331f914ebe3e1b79255ba9d626 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sat, 29 Feb 2020 23:58:23 +0800
Subject: [PATCH 14/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 64 +++++++++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 ++++
.../src/main/resources/application.yaml | 35 ++++++++++
labx-08/pom.xml | 2 +
4 files changed, 114 insertions(+)
create mode 100644 labx-08/labx-08-sc-gateway-demo09-actuator/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo09-actuator/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo09-actuator/src/main/resources/application.yaml
diff --git a/labx-08/labx-08-sc-gateway-demo09-actuator/pom.xml b/labx-08/labx-08-sc-gateway-demo09-actuator/pom.xml
new file mode 100644
index 00000000..d3303ca6
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo09-actuator/pom.xml
@@ -0,0 +1,64 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo09-actuator
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo09-actuator/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo09-actuator/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo09-actuator/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo09-actuator/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo09-actuator/src/main/resources/application.yaml
new file mode 100644
index 00000000..e7b53829
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo09-actuator/src/main/resources/application.yaml
@@ -0,0 +1,35 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+# cloud:
+# # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+# gateway:
+# # 路由配置项,对应 RouteDefinition 数组
+# routes:
+# - id: yudaoyuanma # 路由的编号
+# uri: http://www.iocoder.cn # 路由到的目标地址
+# predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+# - Path=/blog
+# filters:
+# - StripPrefix=1
+# - id: oschina # 路由的编号
+# uri: https://www.oschina.net # 路由的目标地址
+# predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+# - Path=/oschina
+# filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
+# - StripPrefix=1
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+ endpoint:
+ # Health 端点配置项,对应 HealthProperties 配置类
+ health:
+ enabled: true # 是否开启。默认为 true 开启。
+ show-details: ALWAYS # 何时显示完整的健康信息。默认为 NEVER 都不展示。可选 WHEN_AUTHORIZED 当经过授权的用户;可选 ALWAYS 总是展示。
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index 2087c067..f078db08 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -31,6 +31,8 @@
labx-08-sc-gateway-demo08-custom-global-filter
+ labx-08-sc-gateway-demo09-actuator
+
labx-08-sc-user-service
From 84a92f94c3fc05a2d5970dd2e6e71ee50e21aa87 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sun, 1 Mar 2020 01:36:12 +0800
Subject: [PATCH 15/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20gat?=
=?UTF-8?q?eway=20=E7=BD=91=E5=85=B3=E7=9A=84=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../gatewaydemo/config/GatewayConfig.java | 3 +-
.../src/main/resources/application.yaml | 11 ++++
.../pom.xml | 58 +++++++++++++++++++
.../gatewaydemo/GatewayApplication.java | 13 +++++
.../src/main/resources/application.yaml | 35 +++++++++++
labx-08/pom.xml | 2 +
6 files changed, 120 insertions(+), 2 deletions(-)
create mode 100644 labx-08/labx-08-sc-gateway-demo10-troubleshooting/pom.xml
create mode 100644 labx-08/labx-08-sc-gateway-demo10-troubleshooting/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
create mode 100644 labx-08/labx-08-sc-gateway-demo10-troubleshooting/src/main/resources/application.yaml
diff --git a/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java b/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java
index 84bfe2af..eca19a8a 100644
--- a/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java
+++ b/labx-08/labx-08-sc-gateway-demo01-test/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/config/GatewayConfig.java
@@ -4,11 +4,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import reactor.core.publisher.Mono;
-@Configuration
+//@Configuration
public class GatewayConfig {
private Logger logger = LoggerFactory.getLogger(GatewayConfig.class);
diff --git a/labx-08/labx-08-sc-gateway-demo01-test/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo01-test/src/main/resources/application.yaml
index 1f1bf3e2..4f641b7f 100644
--- a/labx-08/labx-08-sc-gateway-demo01-test/src/main/resources/application.yaml
+++ b/labx-08/labx-08-sc-gateway-demo01-test/src/main/resources/application.yaml
@@ -27,3 +27,14 @@ spring:
# - StripPrefix=1
# - StripPrefix=2
# - StripPrefix=3
+
+# httpserver:
+# wiretap: true
+# httpclient:
+# wiretap: true
+
+logging:
+ level:
+ reactor.netty: DEBUG
+ org.springframework.cloud.gateway: TRACE
+# org.springframework.web.reactive: TRACE
diff --git a/labx-08/labx-08-sc-gateway-demo10-troubleshooting/pom.xml b/labx-08/labx-08-sc-gateway-demo10-troubleshooting/pom.xml
new file mode 100644
index 00000000..5342efed
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo10-troubleshooting/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-08-sc-gateway-demo10-troubleshooting
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+
diff --git a/labx-08/labx-08-sc-gateway-demo10-troubleshooting/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java b/labx-08/labx-08-sc-gateway-demo10-troubleshooting/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
new file mode 100644
index 00000000..f9575ef3
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo10-troubleshooting/src/main/java/cn/iocoder/springcloud/labx08/gatewaydemo/GatewayApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx08.gatewaydemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/labx-08/labx-08-sc-gateway-demo10-troubleshooting/src/main/resources/application.yaml b/labx-08/labx-08-sc-gateway-demo10-troubleshooting/src/main/resources/application.yaml
new file mode 100644
index 00000000..8aaebf8d
--- /dev/null
+++ b/labx-08/labx-08-sc-gateway-demo10-troubleshooting/src/main/resources/application.yaml
@@ -0,0 +1,35 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: gateway-application
+
+ cloud:
+ # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
+ gateway:
+ # 路由配置项,对应 RouteDefinition 数组
+ routes:
+ - id: yudaoyuanma # 路由的编号
+ uri: http://www.iocoder.cn # 路由到的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/blog
+ filters:
+ - StripPrefix=1
+ - id: oschina # 路由的编号
+ uri: https://www.oschina.net # 路由的目标地址
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/oschina
+ filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
+ - StripPrefix=1
+
+ # Reactor Netty 相关配置
+ httpserver:
+ wiretap: true
+ httpclient:
+ wiretap: true
+
+logging:
+ level:
+ reactor.netty: DEBUG
+ org.springframework.cloud.gateway: TRACE
diff --git a/labx-08/pom.xml b/labx-08/pom.xml
index f078db08..fd190eed 100644
--- a/labx-08/pom.xml
+++ b/labx-08/pom.xml
@@ -33,6 +33,8 @@
labx-08-sc-gateway-demo09-actuator
+ labx-08-sc-gateway-demo10-troubleshooting
+
labx-08-sc-user-service
From c740fd08c5a538a7d421ad3888f97c2775f956b9 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sun, 1 Mar 2020 10:52:34 +0800
Subject: [PATCH 16/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20apo?=
=?UTF-8?q?llo=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 3 ++-
labx-09/pom.xml | 15 +++++++++++++++
pom.xml | 1 +
3 files changed, 18 insertions(+), 1 deletion(-)
create mode 100644 labx-09/pom.xml
diff --git a/README.md b/README.md
index ced5a94a..805f1922 100644
--- a/README.md
+++ b/README.md
@@ -176,7 +176,8 @@
## 配置中心
* [《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Config/?github) 对应 [labx-05](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-05)
-* 《芋道 Spring Cloud 配置中心 Apollo 入门》
+* [《芋道 Spring Cloud 配置中心 Apollo 入门》](http://www.iocoder.cn/Spring-Cloud/Apollo/?github) 对应 [labx-09](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-09)
+
## 消息队列
diff --git a/labx-09/pom.xml b/labx-09/pom.xml
new file mode 100644
index 00000000..3af9b908
--- /dev/null
+++ b/labx-09/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-09
+
+
+
diff --git a/pom.xml b/pom.xml
index febd103f..a8698557 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,6 +68,7 @@
labx-06
labx-07
labx-08
+ labx-09
From e345d149a60e4d17a1bf1b3f99d7424141b4ee5d Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sun, 1 Mar 2020 12:14:35 +0800
Subject: [PATCH 17/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20apo?=
=?UTF-8?q?llo=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/resources/application.yaml | 3 +
.../pom.xml | 69 +++++++++++++++++++
.../labx09/apollodemo/DemoApplication.java | 13 ++++
.../apollodemo/config/OrderProperties.java | 52 ++++++++++++++
.../apollodemo/controller/DemoController.java | 44 ++++++++++++
.../listener/ApolloPropertiesRefresher.java | 27 ++++++++
.../src/main/resources/application.yaml | 12 ++++
labx-09/labx-09-sc-apollo-demo/pom.xml | 69 +++++++++++++++++++
.../labx09/apollodemo/DemoApplication.java | 13 ++++
.../apollodemo/config/OrderProperties.java | 52 ++++++++++++++
.../apollodemo/controller/DemoController.java | 44 ++++++++++++
.../src/main/resources/application.yaml | 12 ++++
labx-09/pom.xml | 6 +-
13 files changed, 415 insertions(+), 1 deletion(-)
create mode 100644 labx-09/labx-09-sc-apollo-demo-auto-refresh/pom.xml
create mode 100644 labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
create mode 100644 labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/config/OrderProperties.java
create mode 100644 labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
create mode 100644 labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/listener/ApolloPropertiesRefresher.java
create mode 100644 labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/resources/application.yaml
create mode 100644 labx-09/labx-09-sc-apollo-demo/pom.xml
create mode 100644 labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
create mode 100644 labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/config/OrderProperties.java
create mode 100644 labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
create mode 100644 labx-09/labx-09-sc-apollo-demo/src/main/resources/application.yaml
diff --git a/lab-45/lab-45-apollo-demo/src/main/resources/application.yaml b/lab-45/lab-45-apollo-demo/src/main/resources/application.yaml
index ee007579..ace5489d 100644
--- a/lab-45/lab-45-apollo-demo/src/main/resources/application.yaml
+++ b/lab-45/lab-45-apollo-demo/src/main/resources/application.yaml
@@ -1,3 +1,6 @@
+server:
+ port: 7070 # 避免和本地的 Apollo Portal 端口冲突
+
app:
id: demo-application # 使用的 Apollo 的项目(应用)编号
apollo:
diff --git a/labx-09/labx-09-sc-apollo-demo-auto-refresh/pom.xml b/labx-09/labx-09-sc-apollo-demo-auto-refresh/pom.xml
new file mode 100644
index 00000000..1efbed71
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-auto-refresh/pom.xml
@@ -0,0 +1,69 @@
+
+
+
+ labx-09
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-09-sc-apollo-demo-auto-refresh
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-commons
+
+
+ org.springframework.cloud
+ spring-cloud-context
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.ctrip.framework.apollo
+ apollo-client
+ 1.5.1
+
+
+
+
diff --git a/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
new file mode 100644
index 00000000..0f011da9
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx09.apollodemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class);
+ }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/config/OrderProperties.java b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/config/OrderProperties.java
new file mode 100644
index 00000000..f5349a41
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/config/OrderProperties.java
@@ -0,0 +1,52 @@
+package cn.iocoder.springcloud.labx09.apollodemo.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "order")
+public class OrderProperties {
+
+ /**
+ * 订单支付超时时长,单位:秒。
+ */
+ private Integer payTimeoutSeconds;
+
+ /**
+ * 订单创建频率,单位:秒
+ */
+ private Integer createFrequencySeconds;
+
+// /**
+// * 配置描述
+// */
+// private String desc;
+
+ public Integer getPayTimeoutSeconds() {
+ return payTimeoutSeconds;
+ }
+
+ public OrderProperties setPayTimeoutSeconds(Integer payTimeoutSeconds) {
+ this.payTimeoutSeconds = payTimeoutSeconds;
+ return this;
+ }
+
+ public Integer getCreateFrequencySeconds() {
+ return createFrequencySeconds;
+ }
+
+ public OrderProperties setCreateFrequencySeconds(Integer createFrequencySeconds) {
+ this.createFrequencySeconds = createFrequencySeconds;
+ return this;
+ }
+
+// public String getDesc() {
+// return desc;
+// }
+//
+// public OrderProperties setDesc(String desc) {
+// this.desc = desc;
+// return this;
+// }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
new file mode 100644
index 00000000..eed5f2ed
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
@@ -0,0 +1,44 @@
+package cn.iocoder.springcloud.labx09.apollodemo.controller;
+
+import cn.iocoder.springcloud.labx09.apollodemo.config.OrderProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @Autowired
+ private OrderProperties orderProperties;
+
+ /**
+ * 测试 @ConfigurationProperties 注解的配置属性类
+ */
+ @GetMapping("/test01")
+ public OrderProperties test01() {
+ return orderProperties;
+ }
+
+ @Value(value = "${order.pay-timeout-seconds}")
+ private Integer payTimeoutSeconds;
+ @Value(value = "${order.create-frequency-seconds}")
+ private Integer createFrequencySeconds;
+
+ /**
+ * 测试 @Value 注解的属性
+ */
+ @GetMapping("/test02")
+ public Map test02() {
+ Map result = new HashMap<>();
+ result.put("payTimeoutSeconds", payTimeoutSeconds);
+ result.put("createFrequencySeconds", createFrequencySeconds);
+ return result;
+ }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/listener/ApolloPropertiesRefresher.java b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/listener/ApolloPropertiesRefresher.java
new file mode 100644
index 00000000..2472ae36
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/listener/ApolloPropertiesRefresher.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springcloud.labx09.apollodemo.listener;
+
+import com.ctrip.framework.apollo.core.ConfigConsts;
+import com.ctrip.framework.apollo.model.ConfigChangeEvent;
+import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
+import org.springframework.beans.BeansException;
+import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ApolloPropertiesRefresher implements ApplicationContextAware {
+
+ private ApplicationContext applicationContext;
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ this.applicationContext = applicationContext;
+ }
+
+ @ApolloConfigChangeListener(value = ConfigConsts.NAMESPACE_APPLICATION)
+ public void onChange(ConfigChangeEvent changeEvent) {
+ this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
+ }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/resources/application.yaml b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/resources/application.yaml
new file mode 100644
index 00000000..ace5489d
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/resources/application.yaml
@@ -0,0 +1,12 @@
+server:
+ port: 7070 # 避免和本地的 Apollo Portal 端口冲突
+
+app:
+ id: demo-application # 使用的 Apollo 的项目(应用)编号
+apollo:
+ meta: http://127.0.0.1:8080 # Apollo Meta Server 地址
+ bootstrap:
+ enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。
+ eagerLoad:
+ enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。
+ namespaces: application # 使用的 Apollo 的命名空间,默认为 application。
diff --git a/labx-09/labx-09-sc-apollo-demo/pom.xml b/labx-09/labx-09-sc-apollo-demo/pom.xml
new file mode 100644
index 00000000..e4c382ca
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo/pom.xml
@@ -0,0 +1,69 @@
+
+
+
+ labx-09
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-09-sc-apollo-demo
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-commons
+
+
+ org.springframework.cloud
+ spring-cloud-context
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.ctrip.framework.apollo
+ apollo-client
+ 1.5.1
+
+
+
+
diff --git a/labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java b/labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
new file mode 100644
index 00000000..0f011da9
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx09.apollodemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class);
+ }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/config/OrderProperties.java b/labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/config/OrderProperties.java
new file mode 100644
index 00000000..f5349a41
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/config/OrderProperties.java
@@ -0,0 +1,52 @@
+package cn.iocoder.springcloud.labx09.apollodemo.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "order")
+public class OrderProperties {
+
+ /**
+ * 订单支付超时时长,单位:秒。
+ */
+ private Integer payTimeoutSeconds;
+
+ /**
+ * 订单创建频率,单位:秒
+ */
+ private Integer createFrequencySeconds;
+
+// /**
+// * 配置描述
+// */
+// private String desc;
+
+ public Integer getPayTimeoutSeconds() {
+ return payTimeoutSeconds;
+ }
+
+ public OrderProperties setPayTimeoutSeconds(Integer payTimeoutSeconds) {
+ this.payTimeoutSeconds = payTimeoutSeconds;
+ return this;
+ }
+
+ public Integer getCreateFrequencySeconds() {
+ return createFrequencySeconds;
+ }
+
+ public OrderProperties setCreateFrequencySeconds(Integer createFrequencySeconds) {
+ this.createFrequencySeconds = createFrequencySeconds;
+ return this;
+ }
+
+// public String getDesc() {
+// return desc;
+// }
+//
+// public OrderProperties setDesc(String desc) {
+// this.desc = desc;
+// return this;
+// }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java b/labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
new file mode 100644
index 00000000..eed5f2ed
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
@@ -0,0 +1,44 @@
+package cn.iocoder.springcloud.labx09.apollodemo.controller;
+
+import cn.iocoder.springcloud.labx09.apollodemo.config.OrderProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @Autowired
+ private OrderProperties orderProperties;
+
+ /**
+ * 测试 @ConfigurationProperties 注解的配置属性类
+ */
+ @GetMapping("/test01")
+ public OrderProperties test01() {
+ return orderProperties;
+ }
+
+ @Value(value = "${order.pay-timeout-seconds}")
+ private Integer payTimeoutSeconds;
+ @Value(value = "${order.create-frequency-seconds}")
+ private Integer createFrequencySeconds;
+
+ /**
+ * 测试 @Value 注解的属性
+ */
+ @GetMapping("/test02")
+ public Map test02() {
+ Map result = new HashMap<>();
+ result.put("payTimeoutSeconds", payTimeoutSeconds);
+ result.put("createFrequencySeconds", createFrequencySeconds);
+ return result;
+ }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo/src/main/resources/application.yaml b/labx-09/labx-09-sc-apollo-demo/src/main/resources/application.yaml
new file mode 100644
index 00000000..ace5489d
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo/src/main/resources/application.yaml
@@ -0,0 +1,12 @@
+server:
+ port: 7070 # 避免和本地的 Apollo Portal 端口冲突
+
+app:
+ id: demo-application # 使用的 Apollo 的项目(应用)编号
+apollo:
+ meta: http://127.0.0.1:8080 # Apollo Meta Server 地址
+ bootstrap:
+ enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。
+ eagerLoad:
+ enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。
+ namespaces: application # 使用的 Apollo 的命名空间,默认为 application。
diff --git a/labx-09/pom.xml b/labx-09/pom.xml
index 3af9b908..3168b79b 100644
--- a/labx-09/pom.xml
+++ b/labx-09/pom.xml
@@ -10,6 +10,10 @@
4.0.0
labx-09
-
+ pom
+
+ labx-09-sc-apollo-demo
+ labx-09-sc-apollo-demo-auto-refresh
+
From f8d73720ce7ba4d08ef59c23c76224f7d8961775 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sun, 1 Mar 2020 14:59:46 +0800
Subject: [PATCH 18/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20apo?=
=?UTF-8?q?llo=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../labx-09-sc-apollo-demo-profiles/pom.xml | 69 +++++++++++++++++++
.../labx09/apollodemo/DemoApplication.java | 13 ++++
.../src/main/resources/application-dev.yaml | 9 +++
.../src/main/resources/application-prod.yaml | 9 +++
.../src/main/resources/application.yaml | 6 ++
labx-09/pom.xml | 1 +
6 files changed, 107 insertions(+)
create mode 100644 labx-09/labx-09-sc-apollo-demo-profiles/pom.xml
create mode 100644 labx-09/labx-09-sc-apollo-demo-profiles/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
create mode 100644 labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application-dev.yaml
create mode 100644 labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application-prod.yaml
create mode 100644 labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application.yaml
diff --git a/labx-09/labx-09-sc-apollo-demo-profiles/pom.xml b/labx-09/labx-09-sc-apollo-demo-profiles/pom.xml
new file mode 100644
index 00000000..76d3e9ac
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-profiles/pom.xml
@@ -0,0 +1,69 @@
+
+
+
+ labx-09
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-09-sc-apollo-demo-profiles
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-commons
+
+
+ org.springframework.cloud
+ spring-cloud-context
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.ctrip.framework.apollo
+ apollo-client
+ 1.5.1
+
+
+
+
diff --git a/labx-09/labx-09-sc-apollo-demo-profiles/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java b/labx-09/labx-09-sc-apollo-demo-profiles/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
new file mode 100644
index 00000000..0f011da9
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-profiles/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx09.apollodemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class);
+ }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application-dev.yaml b/labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application-dev.yaml
new file mode 100644
index 00000000..1cd63581
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application-dev.yaml
@@ -0,0 +1,9 @@
+app:
+ id: demo-application-profiles # 使用的 Apollo 的项目(应用)编号
+apollo:
+ meta: http://127.0.0.1:8080 # Apollo Meta Server 地址
+ bootstrap:
+ enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。
+ eagerLoad:
+ enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。
+ namespaces: application # 使用的 Apollo 的命名空间,默认为 application。
diff --git a/labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application-prod.yaml b/labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application-prod.yaml
new file mode 100644
index 00000000..b017e5aa
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application-prod.yaml
@@ -0,0 +1,9 @@
+app:
+ id: demo-application-profiles # 使用的 Apollo 的项目(应用)编号
+apollo:
+ meta: http://127.0.0.1:18080 # Apollo Meta Server 地址
+ bootstrap:
+ enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。
+ eagerLoad:
+ enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。
+ namespaces: application # 使用的 Apollo 的命名空间,默认为 application。
diff --git a/labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application.yaml b/labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application.yaml
new file mode 100644
index 00000000..001e788a
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-profiles/src/main/resources/application.yaml
@@ -0,0 +1,6 @@
+#server:
+# port: 7070
+
+spring:
+ application:
+ name: demo-application
diff --git a/labx-09/pom.xml b/labx-09/pom.xml
index 3168b79b..5b6b9b17 100644
--- a/labx-09/pom.xml
+++ b/labx-09/pom.xml
@@ -13,6 +13,7 @@
pom
labx-09-sc-apollo-demo
+ labx-09-sc-apollo-demo-profiles
labx-09-sc-apollo-demo-auto-refresh
From dd5ab707b468a6368a343203a1bac39eddb6b046 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sun, 1 Mar 2020 16:50:30 +0800
Subject: [PATCH 19/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20apo?=
=?UTF-8?q?llo=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../labx09/apollodemo/controller/DemoController.java | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
index eed5f2ed..6d950b39 100644
--- a/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
+++ b/labx-09/labx-09-sc-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
@@ -1,6 +1,8 @@
package cn.iocoder.springcloud.labx09.apollodemo.controller;
import cn.iocoder.springcloud.labx09.apollodemo.config.OrderProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
@@ -14,6 +16,8 @@ import java.util.Map;
@RequestMapping("/demo")
public class DemoController {
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
@Autowired
private OrderProperties orderProperties;
@@ -41,4 +45,9 @@ public class DemoController {
return result;
}
+ @GetMapping("/logger")
+ public void logger() {
+ logger.debug("[logger][测试一下]");
+ }
+
}
From 74fc78b0e6d82e1c22824af46cb13e21111958fb Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sun, 1 Mar 2020 17:39:12 +0800
Subject: [PATCH 20/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20apo?=
=?UTF-8?q?llo=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
labx-09/labx-09-sc-apollo-demo-jasypt/pom.xml | 85 +++++++++++++++++++
.../labx09/apollodemo/DemoApplication.java | 13 +++
.../apollodemo/controller/DemoController.java | 20 +++++
.../src/main/resources/application.yaml | 12 +++
.../labx09/apollodemo/JasyptTest.java | 40 +++++++++
labx-09/pom.xml | 1 +
6 files changed, 171 insertions(+)
create mode 100644 labx-09/labx-09-sc-apollo-demo-jasypt/pom.xml
create mode 100644 labx-09/labx-09-sc-apollo-demo-jasypt/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
create mode 100644 labx-09/labx-09-sc-apollo-demo-jasypt/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
create mode 100644 labx-09/labx-09-sc-apollo-demo-jasypt/src/main/resources/application.yaml
create mode 100644 labx-09/labx-09-sc-apollo-demo-jasypt/src/test/java/cn/iocoder/springcloud/labx09/apollodemo/JasyptTest.java
diff --git a/labx-09/labx-09-sc-apollo-demo-jasypt/pom.xml b/labx-09/labx-09-sc-apollo-demo-jasypt/pom.xml
new file mode 100644
index 00000000..ff9e0951
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-jasypt/pom.xml
@@ -0,0 +1,85 @@
+
+
+
+ labx-09
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-09-sc-apollo-demo-jasypt
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-commons
+
+
+ org.springframework.cloud
+ spring-cloud-context
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.ctrip.framework.apollo
+ apollo-client
+ 1.5.1
+
+
+
+
+ com.github.ulisesbocchio
+ jasypt-spring-boot-starter
+ 3.0.2
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
diff --git a/labx-09/labx-09-sc-apollo-demo-jasypt/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java b/labx-09/labx-09-sc-apollo-demo-jasypt/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
new file mode 100644
index 00000000..0f011da9
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-jasypt/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx09.apollodemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class);
+ }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo-jasypt/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java b/labx-09/labx-09-sc-apollo-demo-jasypt/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
new file mode 100644
index 00000000..2c01d017
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-jasypt/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/controller/DemoController.java
@@ -0,0 +1,20 @@
+package cn.iocoder.springcloud.labx09.apollodemo.controller;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @Value("${xxx-password:}")
+ private String xxxPassword;
+
+ @GetMapping("/test")
+ public String test() {
+ return xxxPassword;
+ }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo-jasypt/src/main/resources/application.yaml b/labx-09/labx-09-sc-apollo-demo-jasypt/src/main/resources/application.yaml
new file mode 100644
index 00000000..32e59532
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-jasypt/src/main/resources/application.yaml
@@ -0,0 +1,12 @@
+server:
+ port: 7070 # 避免和本地的 Apollo Portal 端口冲突
+
+app:
+ id: demo-application-jasypt # 使用的 Apollo 的项目(应用)编号
+apollo:
+ meta: http://127.0.0.1:8080 # Apollo Meta Server 地址
+ bootstrap:
+ enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。
+ eagerLoad:
+ enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。
+ namespaces: application # 使用的 Apollo 的命名空间,默认为 application。
diff --git a/labx-09/labx-09-sc-apollo-demo-jasypt/src/test/java/cn/iocoder/springcloud/labx09/apollodemo/JasyptTest.java b/labx-09/labx-09-sc-apollo-demo-jasypt/src/test/java/cn/iocoder/springcloud/labx09/apollodemo/JasyptTest.java
new file mode 100644
index 00000000..e384f392
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-jasypt/src/test/java/cn/iocoder/springcloud/labx09/apollodemo/JasyptTest.java
@@ -0,0 +1,40 @@
+package cn.iocoder.springcloud.labx09.apollodemo;
+
+import org.jasypt.encryption.StringEncryptor;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class JasyptTest {
+
+ @Autowired
+ private StringEncryptor encryptor;
+
+ @Test
+ public void encode() {
+ // 第一个加密
+ String password = "woshimima";
+ System.out.println(encryptor.encrypt(password));
+
+ // 第二个加密
+ password = "bushimima";
+ System.out.println(encryptor.encrypt(password));
+ }
+
+ @Value("${xxx-password:}")
+ private String xxxPassword;
+
+ @Test
+ public void print() {
+ System.out.println(xxxPassword);
+ }
+
+// @Value("${jasypt.encryptor.password}")
+// private String password;
+
+}
diff --git a/labx-09/pom.xml b/labx-09/pom.xml
index 5b6b9b17..9ca6ec30 100644
--- a/labx-09/pom.xml
+++ b/labx-09/pom.xml
@@ -15,6 +15,7 @@
labx-09-sc-apollo-demo
labx-09-sc-apollo-demo-profiles
labx-09-sc-apollo-demo-auto-refresh
+ labx-09-sc-apollo-demo-jasypt
From 3a56e7a58d6d779bc6b39d90d664a12e3f4934c3 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Sun, 1 Mar 2020 19:12:23 +0800
Subject: [PATCH 21/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20apo?=
=?UTF-8?q?llo=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
labx-09/labx-09-sc-apollo-demo-multi/pom.xml | 69 +++++++++++++++++++
.../labx09/apollodemo/DemoApplication.java | 20 ++++++
.../src/main/resources/application.yaml | 12 ++++
labx-09/pom.xml | 1 +
4 files changed, 102 insertions(+)
create mode 100644 labx-09/labx-09-sc-apollo-demo-multi/pom.xml
create mode 100644 labx-09/labx-09-sc-apollo-demo-multi/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
create mode 100644 labx-09/labx-09-sc-apollo-demo-multi/src/main/resources/application.yaml
diff --git a/labx-09/labx-09-sc-apollo-demo-multi/pom.xml b/labx-09/labx-09-sc-apollo-demo-multi/pom.xml
new file mode 100644
index 00000000..4b9b5639
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-multi/pom.xml
@@ -0,0 +1,69 @@
+
+
+
+ labx-09
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-09-sc-apollo-demo-multi
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-commons
+
+
+ org.springframework.cloud
+ spring-cloud-context
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.ctrip.framework.apollo
+ apollo-client
+ 1.5.1
+
+
+
+
diff --git a/labx-09/labx-09-sc-apollo-demo-multi/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java b/labx-09/labx-09-sc-apollo-demo-multi/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
new file mode 100644
index 00000000..8867588b
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-multi/src/main/java/cn/iocoder/springcloud/labx09/apollodemo/DemoApplication.java
@@ -0,0 +1,20 @@
+package cn.iocoder.springcloud.labx09.apollodemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.core.env.Environment;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class);
+
+ // 查看 Environment
+ Environment environment = context.getEnvironment();
+ System.out.println(environment);
+ }
+
+}
diff --git a/labx-09/labx-09-sc-apollo-demo-multi/src/main/resources/application.yaml b/labx-09/labx-09-sc-apollo-demo-multi/src/main/resources/application.yaml
new file mode 100644
index 00000000..cd26fa07
--- /dev/null
+++ b/labx-09/labx-09-sc-apollo-demo-multi/src/main/resources/application.yaml
@@ -0,0 +1,12 @@
+server:
+ port: 7070 # 避免和本地的 Apollo Portal 端口冲突
+
+app:
+ id: demo-application-multi # 使用的 Apollo 的项目(应用)编号
+apollo:
+ meta: http://127.0.0.1:8080 # Apollo Meta Server 地址
+ bootstrap:
+ enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。
+ eagerLoad:
+ enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。
+ namespaces: application, db # 使用的 Apollo 的命名空间,默认为 application。
diff --git a/labx-09/pom.xml b/labx-09/pom.xml
index 9ca6ec30..9989469e 100644
--- a/labx-09/pom.xml
+++ b/labx-09/pom.xml
@@ -16,6 +16,7 @@
labx-09-sc-apollo-demo-profiles
labx-09-sc-apollo-demo-auto-refresh
labx-09-sc-apollo-demo-jasypt
+ labx-09-sc-apollo-demo-multi
From 69f486892011b1168bde73d65de7c04affc405b5 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Mon, 2 Mar 2020 08:22:00 +0800
Subject: [PATCH 22/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20str?=
=?UTF-8?q?eam=20rabbitmq=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 58 +++++++++++++++++++
.../consumerdemo/ConsumerApplication.java | 16 +++++
.../consumerdemo/listener/Demo01Consumer.java | 20 +++++++
.../consumerdemo/listener/MySink.java | 13 +++++
.../consumerdemo/message/Demo01Message.java | 29 ++++++++++
.../src/main/resources/application.yml | 15 +++++
.../pom.xml | 58 +++++++++++++++++++
.../producerdemo/ProducerApplication.java | 16 +++++
.../controller/Demo01Controller.java | 37 ++++++++++++
.../producerdemo/message/Demo01Message.java | 29 ++++++++++
.../producerdemo/message/MySource.java | 11 ++++
.../src/main/resources/application.yml | 29 ++++++++++
labx-10/pom.xml | 20 +++++++
pom.xml | 1 +
14 files changed, 352 insertions(+)
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/pom.xml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-demo/pom.xml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/ProducerApplication.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/controller/Demo01Controller.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/Demo01Message.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/MySource.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/resources/application.yml
create mode 100644 labx-10/pom.xml
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/pom.xml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/pom.xml
new file mode 100644
index 00000000..31ab48b9
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-10
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-10-sc-stream-rabbitmq-consumer-demo
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+
+
+
+
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
new file mode 100644
index 00000000..85330de4
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener.MySink;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+
+@SpringBootApplication
+@EnableBinding(MySink.class)
+public class ConsumerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ConsumerApplication.class, args);
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
new file mode 100644
index 00000000..885dad4b
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
@@ -0,0 +1,20 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.message.Demo01Message;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.messaging.handler.annotation.Payload;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Demo01Consumer {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @StreamListener(MySink.DEMO01_INPUT)
+ public void onMessage(@Payload Demo01Message message) {
+ logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
new file mode 100644
index 00000000..7a894faa
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener;
+
+import org.springframework.cloud.stream.annotation.Input;
+import org.springframework.messaging.SubscribableChannel;
+
+public interface MySink {
+
+ String DEMO01_INPUT = "demo01-input";
+
+ @Input(DEMO01_INPUT)
+ SubscribableChannel demo01Input();
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
new file mode 100644
index 00000000..74c4255d
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
@@ -0,0 +1,29 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.message;
+
+/**
+ * 示例 01 的 Message 消息
+ */
+public class Demo01Message {
+
+ /**
+ * 编号
+ */
+ private Integer id;
+
+ public Demo01Message setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "Demo01Message{" +
+ "id=" + id +
+ '}';
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml
new file mode 100644
index 00000000..063737d1
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml
@@ -0,0 +1,15 @@
+spring:
+ application:
+ name: demo-consumer-application
+ cloud:
+ # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
+ stream:
+ # Binding 配置项,对应 BindingProperties Map
+ bindings:
+ demo01-input:
+ destination: mqTestDefault # 目的地。这里使用 RocketMQ Topic
+ content-type: application/json # 内容格式。这里使用 JSON
+# group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
+
+server:
+ port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/pom.xml b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/pom.xml
new file mode 100644
index 00000000..105a076b
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-10
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-10-sc-stream-rabbitmq-producer-demo
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+
+
+
+
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/ProducerApplication.java b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/ProducerApplication.java
new file mode 100644
index 00000000..c128d2f4
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/ProducerApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message.MySource;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+
+@SpringBootApplication
+@EnableBinding(MySource.class)
+public class ProducerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ProducerApplication.class, args);
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/controller/Demo01Controller.java b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/controller/Demo01Controller.java
new file mode 100644
index 00000000..cfee040e
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/controller/Demo01Controller.java
@@ -0,0 +1,37 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.controller;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message.Demo01Message;
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message.MySource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Random;
+
+@RestController
+@RequestMapping("/demo01")
+public class Demo01Controller {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Autowired
+ private MySource mySource;
+
+ @GetMapping("/send")
+ public boolean send() {
+ // 创建 Message
+ Demo01Message message = new Demo01Message()
+ .setId(new Random().nextInt());
+ // 创建 Spring Message 对象
+ Message springMessage = MessageBuilder.withPayload(message)
+ .build();
+ // 发送消息
+ return mySource.demo01Output().send(springMessage);
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/Demo01Message.java b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/Demo01Message.java
new file mode 100644
index 00000000..7f015623
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/Demo01Message.java
@@ -0,0 +1,29 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message;
+
+/**
+ * 示例 01 的 Message 消息
+ */
+public class Demo01Message {
+
+ /**
+ * 编号
+ */
+ private Integer id;
+
+ public Demo01Message setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "Demo01Message{" +
+ "id=" + id +
+ '}';
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/MySource.java b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/MySource.java
new file mode 100644
index 00000000..64d06834
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/MySource.java
@@ -0,0 +1,11 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message;
+
+import org.springframework.cloud.stream.annotation.Output;
+import org.springframework.messaging.MessageChannel;
+
+public interface MySource {
+
+ @Output("demo01-output")
+ MessageChannel demo01Output();
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/resources/application.yml
new file mode 100644
index 00000000..0bc3de43
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/resources/application.yml
@@ -0,0 +1,29 @@
+spring:
+ application:
+ name: demo-producer-application
+ cloud:
+ # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
+ stream:
+ # Binding 配置项,对应 BindingProperties Map
+ bindings:
+ demo01-output:
+ destination: mqTestDefault # 目的地。这里使用 RabbitMQ Topic
+ content-type: application/json # 内容格式。这里使用 JSON
+# rabbit:
+# binder:
+# connection-name-prefix:
+# # Spring Cloud Stream RocketMQ 配置项
+# rocketmq:
+# # RocketMQ Binder 配置项,对应 RocketMQBinderConfigurationProperties 类
+# binder:
+# name-server: 127.0.0.1:9876 # RocketMQ Namesrv 地址
+# # RocketMQ 自定义 Binding 配置项,对应 RocketMQBindingProperties Map
+# bindings:
+# demo01-output:
+# # RocketMQ Producer 配置项,对应 RocketMQProducerProperties 类
+# producer:
+# group: test # 生产者分组
+# sync: true # 是否同步发送消息,默认为 false 异步。
+
+server:
+ port: 18080
diff --git a/labx-10/pom.xml b/labx-10/pom.xml
new file mode 100644
index 00000000..76e16ea1
--- /dev/null
+++ b/labx-10/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-10
+ pom
+
+ labx-10-sc-stream-rabbitmq-producer-demo
+ labx-10-sc-stream-rabbitmq-consumer-demo
+
+
+
+
diff --git a/pom.xml b/pom.xml
index a8698557..b94e27de 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,6 +69,7 @@
labx-07
labx-08
labx-09
+ labx-10
From 0f9391ba30fb40dd625ff9803fea71bc0a9da26d Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Mon, 2 Mar 2020 09:09:39 +0800
Subject: [PATCH 23/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20str?=
=?UTF-8?q?eam=20rabbitmq=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/resources/application.yml | 17 +++++++++--
.../src/main/resources/application.yml | 30 +++++++++----------
2 files changed, 29 insertions(+), 18 deletions(-)
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml
index 063737d1..bca18438 100644
--- a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml
@@ -4,12 +4,25 @@ spring:
cloud:
# Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
stream:
+ # Binder 配置项,对应 BinderProperties Map
+ binders:
+ rabbit001:
+ type: rabbit # 设置 Binder 的类型
+ environment: # 设置 Binder 的环境配置
+ # 如果是 RabbitMQ 类型的时候,则对应的是 RabbitProperties 类
+ spring:
+ rabbitmq:
+ host: 127.0.0.1 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: guest # RabbitMQ 服务的账号
+ password: guest # RabbitMQ 服务的密码
# Binding 配置项,对应 BindingProperties Map
bindings:
demo01-input:
- destination: mqTestDefault # 目的地。这里使用 RocketMQ Topic
+ destination: DEMO-TOPIC-01 # 目的地。这里使用 RabbitMQ Exchange
content-type: application/json # 内容格式。这里使用 JSON
-# group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
+ group: demo01-consumer-group-DEMO-TOPIC-02 # 消费者分组
+ binder: rabbit001 # 设置使用的 Binder 名字
server:
port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/resources/application.yml
index 0bc3de43..ae514a28 100644
--- a/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/resources/application.yml
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-demo/src/main/resources/application.yml
@@ -4,26 +4,24 @@ spring:
cloud:
# Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
stream:
+ # Binder 配置项,对应 BinderProperties Map
+ binders:
+ rabbit001:
+ type: rabbit # 设置 Binder 的类型
+ environment: # 设置 Binder 的环境配置
+ # 如果是 RabbitMQ 类型的时候,则对应的是 RabbitProperties 类
+ spring:
+ rabbitmq:
+ host: 127.0.0.1 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: guest # RabbitMQ 服务的账号
+ password: guest # RabbitMQ 服务的密码
# Binding 配置项,对应 BindingProperties Map
bindings:
demo01-output:
- destination: mqTestDefault # 目的地。这里使用 RabbitMQ Topic
+ destination: DEMO-TOPIC-01 # 目的地。这里使用 RabbitMQ Exchange
content-type: application/json # 内容格式。这里使用 JSON
-# rabbit:
-# binder:
-# connection-name-prefix:
-# # Spring Cloud Stream RocketMQ 配置项
-# rocketmq:
-# # RocketMQ Binder 配置项,对应 RocketMQBinderConfigurationProperties 类
-# binder:
-# name-server: 127.0.0.1:9876 # RocketMQ Namesrv 地址
-# # RocketMQ 自定义 Binding 配置项,对应 RocketMQBindingProperties Map
-# bindings:
-# demo01-output:
-# # RocketMQ Producer 配置项,对应 RocketMQProducerProperties 类
-# producer:
-# group: test # 生产者分组
-# sync: true # 是否同步发送消息,默认为 false 异步。
+ binder: rabbit001 # 设置使用的 Binder 名字
server:
port: 18080
From d7d68a6771859be7bfe916312235be8ebee53580 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Tue, 3 Mar 2020 09:00:20 +0800
Subject: [PATCH 24/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20str?=
=?UTF-8?q?eam=20rabbitmq=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 4 ++--
.../src/main/resources/application.yml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 805f1922..dc2fb302 100644
--- a/README.md
+++ b/README.md
@@ -182,8 +182,8 @@
## 消息队列
* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06)
-* 《芋道 Spring Cloud Alibaba 消息队列 RabbitMQ 入门》
-* 《芋道 Spring Cloud Alibaba 消息队列 Kafka 入门》
+* [《芋道 Spring Cloud 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/RabbitMQ/?github) 对应 [lab10-06](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-10)
+* 《芋道 Spring Cloud 消息队列 Kafka 入门》
## 链路追踪
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml
index bca18438..a5e02785 100644
--- a/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-demo/src/main/resources/application.yml
@@ -21,7 +21,7 @@ spring:
demo01-input:
destination: DEMO-TOPIC-01 # 目的地。这里使用 RabbitMQ Exchange
content-type: application/json # 内容格式。这里使用 JSON
- group: demo01-consumer-group-DEMO-TOPIC-02 # 消费者分组
+ group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
binder: rabbit001 # 设置使用的 Binder 名字
server:
From 15c79197ddd55590552c8d611d68f24a15e500be Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Tue, 3 Mar 2020 22:04:36 +0800
Subject: [PATCH 25/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20str?=
=?UTF-8?q?eam=20rabbitmq=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 58 +++++++++++++++++++
.../consumerdemo/ConsumerApplication.java | 16 +++++
.../consumerdemo/listener/Demo01Consumer.java | 20 +++++++
.../consumerdemo/listener/MySink.java | 13 +++++
.../consumerdemo/message/Demo01Message.java | 29 ++++++++++
.../src/main/resources/application.yml | 35 +++++++++++
.../target/classes/application.yml | 35 +++++++++++
.../pom.xml | 58 +++++++++++++++++++
.../consumerdemo/ConsumerApplication.java | 16 +++++
.../consumerdemo/listener/Demo01Consumer.java | 22 +++++++
.../consumerdemo/listener/MySink.java | 13 +++++
.../consumerdemo/message/Demo01Message.java | 29 ++++++++++
.../src/main/resources/application.yml | 35 +++++++++++
.../pom.xml | 58 +++++++++++++++++++
.../producerdemo/ProducerApplication.java | 16 +++++
.../controller/Demo01Controller.java | 40 +++++++++++++
.../producerdemo/message/Demo01Message.java | 29 ++++++++++
.../producerdemo/message/MySource.java | 11 ++++
.../src/main/resources/application.yml | 34 +++++++++++
labx-10/pom.xml | 5 ++
20 files changed, 572 insertions(+)
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/pom.xml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/resources/application.yml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/target/classes/application.yml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/pom.xml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/resources/application.yml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-delay/pom.xml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/ProducerApplication.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/controller/Demo01Controller.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/Demo01Message.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/MySource.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/resources/application.yml
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/pom.xml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/pom.xml
new file mode 100644
index 00000000..7be4226e
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-10
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-10-sc-stream-rabbitmq-consumer-delay
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+
+
+
+
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
new file mode 100644
index 00000000..85330de4
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener.MySink;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+
+@SpringBootApplication
+@EnableBinding(MySink.class)
+public class ConsumerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ConsumerApplication.class, args);
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
new file mode 100644
index 00000000..885dad4b
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
@@ -0,0 +1,20 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.message.Demo01Message;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.messaging.handler.annotation.Payload;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Demo01Consumer {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @StreamListener(MySink.DEMO01_INPUT)
+ public void onMessage(@Payload Demo01Message message) {
+ logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
new file mode 100644
index 00000000..7a894faa
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener;
+
+import org.springframework.cloud.stream.annotation.Input;
+import org.springframework.messaging.SubscribableChannel;
+
+public interface MySink {
+
+ String DEMO01_INPUT = "demo01-input";
+
+ @Input(DEMO01_INPUT)
+ SubscribableChannel demo01Input();
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
new file mode 100644
index 00000000..74c4255d
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
@@ -0,0 +1,29 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.message;
+
+/**
+ * 示例 01 的 Message 消息
+ */
+public class Demo01Message {
+
+ /**
+ * 编号
+ */
+ private Integer id;
+
+ public Demo01Message setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "Demo01Message{" +
+ "id=" + id +
+ '}';
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/resources/application.yml
new file mode 100644
index 00000000..9bff11e1
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/src/main/resources/application.yml
@@ -0,0 +1,35 @@
+spring:
+ application:
+ name: demo-consumer-application
+ cloud:
+ # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
+ stream:
+ # Binder 配置项,对应 BinderProperties Map
+ binders:
+ rabbit001:
+ type: rabbit # 设置 Binder 的类型
+ environment: # 设置 Binder 的环境配置
+ # 如果是 RabbitMQ 类型的时候,则对应的是 RabbitProperties 类
+ spring:
+ rabbitmq:
+ host: 127.0.0.1 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: guest # RabbitMQ 服务的账号
+ password: guest # RabbitMQ 服务的密码
+ # Binding 配置项,对应 BindingProperties Map
+ bindings:
+ demo01-input:
+ destination: DEMO-TOPIC-02 # 目的地。这里使用 RabbitMQ Exchange
+ content-type: application/json # 内容格式。这里使用 JSON
+ group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
+ binder: rabbit001 # 设置使用的 Binder 名字
+ # RabbitMQ 自定义 Binding 配置项,对应 RabbitBindingProperties Map
+ rabbit:
+ bindings:
+ demo01-input:
+ # RabbitMQ Consumer 配置项,对应 RabbitConsumerProperties 类
+ consumer:
+ delayed-exchange: true # 是否使用 x-delayed-message 类型的 Exchange,即延迟消息,默认为 false
+
+server:
+ port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/target/classes/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/target/classes/application.yml
new file mode 100644
index 00000000..9bff11e1
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-delay/target/classes/application.yml
@@ -0,0 +1,35 @@
+spring:
+ application:
+ name: demo-consumer-application
+ cloud:
+ # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
+ stream:
+ # Binder 配置项,对应 BinderProperties Map
+ binders:
+ rabbit001:
+ type: rabbit # 设置 Binder 的类型
+ environment: # 设置 Binder 的环境配置
+ # 如果是 RabbitMQ 类型的时候,则对应的是 RabbitProperties 类
+ spring:
+ rabbitmq:
+ host: 127.0.0.1 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: guest # RabbitMQ 服务的账号
+ password: guest # RabbitMQ 服务的密码
+ # Binding 配置项,对应 BindingProperties Map
+ bindings:
+ demo01-input:
+ destination: DEMO-TOPIC-02 # 目的地。这里使用 RabbitMQ Exchange
+ content-type: application/json # 内容格式。这里使用 JSON
+ group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
+ binder: rabbit001 # 设置使用的 Binder 名字
+ # RabbitMQ 自定义 Binding 配置项,对应 RabbitBindingProperties Map
+ rabbit:
+ bindings:
+ demo01-input:
+ # RabbitMQ Consumer 配置项,对应 RabbitConsumerProperties 类
+ consumer:
+ delayed-exchange: true # 是否使用 x-delayed-message 类型的 Exchange,即延迟消息,默认为 false
+
+server:
+ port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/pom.xml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/pom.xml
new file mode 100644
index 00000000..b97e1a5c
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-10
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-10-sc-stream-rabbitmq-consumer-retry
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+
+
+
+
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
new file mode 100644
index 00000000..85330de4
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener.MySink;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+
+@SpringBootApplication
+@EnableBinding(MySink.class)
+public class ConsumerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ConsumerApplication.class, args);
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
new file mode 100644
index 00000000..00e51585
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
@@ -0,0 +1,22 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.message.Demo01Message;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.messaging.handler.annotation.Payload;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Demo01Consumer {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @StreamListener(MySink.DEMO01_INPUT)
+ public void onMessage(@Payload Demo01Message message) {
+ logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
+ // 注意,此处抛出一个 RuntimeException 异常,模拟消费失败
+ throw new RuntimeException("我就是故意抛出一个异常");
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
new file mode 100644
index 00000000..7a894faa
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener;
+
+import org.springframework.cloud.stream.annotation.Input;
+import org.springframework.messaging.SubscribableChannel;
+
+public interface MySink {
+
+ String DEMO01_INPUT = "demo01-input";
+
+ @Input(DEMO01_INPUT)
+ SubscribableChannel demo01Input();
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
new file mode 100644
index 00000000..74c4255d
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
@@ -0,0 +1,29 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.message;
+
+/**
+ * 示例 01 的 Message 消息
+ */
+public class Demo01Message {
+
+ /**
+ * 编号
+ */
+ private Integer id;
+
+ public Demo01Message setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "Demo01Message{" +
+ "id=" + id +
+ '}';
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/resources/application.yml
new file mode 100644
index 00000000..dbbb8087
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/resources/application.yml
@@ -0,0 +1,35 @@
+spring:
+ application:
+ name: demo-consumer-application
+ cloud:
+ # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
+ stream:
+ # Binder 配置项,对应 BinderProperties Map
+ binders:
+ rabbit001:
+ type: rabbit # 设置 Binder 的类型
+ environment: # 设置 Binder 的环境配置
+ # 如果是 RabbitMQ 类型的时候,则对应的是 RabbitProperties 类
+ spring:
+ rabbitmq:
+ host: 127.0.0.1 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: guest # RabbitMQ 服务的账号
+ password: guest # RabbitMQ 服务的密码
+ # Binding 配置项,对应 BindingProperties Map
+ bindings:
+ demo01-input:
+ destination: DEMO-TOPIC-01 # 目的地。这里使用 RabbitMQ Exchange
+ content-type: application/json # 内容格式。这里使用 JSON
+ group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
+ binder: rabbit001 # 设置使用的 Binder 名字
+ # RabbitMQ 自定义 Binding 配置项,对应 RabbitBindingProperties Map
+ rabbit:
+ bindings:
+ demo01-input:
+ # RabbitMQ Consumer 配置项,对应 RabbitConsumerProperties 类
+ consumer:
+ auto-bind-dlq: true
+
+server:
+ port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/pom.xml b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/pom.xml
new file mode 100644
index 00000000..6695ee1d
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-10
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-10-sc-stream-rabbitmq-producer-delay
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+
+
+
+
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/ProducerApplication.java b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/ProducerApplication.java
new file mode 100644
index 00000000..c128d2f4
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/ProducerApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message.MySource;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+
+@SpringBootApplication
+@EnableBinding(MySource.class)
+public class ProducerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ProducerApplication.class, args);
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/controller/Demo01Controller.java b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/controller/Demo01Controller.java
new file mode 100644
index 00000000..aeb8b65d
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/controller/Demo01Controller.java
@@ -0,0 +1,40 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.controller;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message.Demo01Message;
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message.MySource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Random;
+
+@RestController
+@RequestMapping("/demo01")
+public class Demo01Controller {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Autowired
+ private MySource mySource;
+
+ @GetMapping("/send_delay")
+ public boolean sendDelay() {
+ // 创建 Message
+ Demo01Message message = new Demo01Message()
+ .setId(new Random().nextInt());
+ // 创建 Spring Message 对象
+ Message springMessage = MessageBuilder.withPayload(message)
+ .setHeader("x-delay", 5000) // 设置延迟时间,单位:毫秒
+ .build();
+ // 发送消息
+ boolean sendResult = mySource.demo01Output().send(springMessage);
+ logger.info("[sendDelay][发送消息完成, 结果 = {}]", sendResult);
+ return sendResult;
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/Demo01Message.java b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/Demo01Message.java
new file mode 100644
index 00000000..7f015623
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/Demo01Message.java
@@ -0,0 +1,29 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message;
+
+/**
+ * 示例 01 的 Message 消息
+ */
+public class Demo01Message {
+
+ /**
+ * 编号
+ */
+ private Integer id;
+
+ public Demo01Message setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "Demo01Message{" +
+ "id=" + id +
+ '}';
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/MySource.java b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/MySource.java
new file mode 100644
index 00000000..64d06834
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/producerdemo/message/MySource.java
@@ -0,0 +1,11 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.producerdemo.message;
+
+import org.springframework.cloud.stream.annotation.Output;
+import org.springframework.messaging.MessageChannel;
+
+public interface MySource {
+
+ @Output("demo01-output")
+ MessageChannel demo01Output();
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/resources/application.yml
new file mode 100644
index 00000000..ae569793
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-producer-delay/src/main/resources/application.yml
@@ -0,0 +1,34 @@
+spring:
+ application:
+ name: demo-producer-application
+ cloud:
+ # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
+ stream:
+ # Binder 配置项,对应 BinderProperties Map
+ binders:
+ rabbit001:
+ type: rabbit # 设置 Binder 的类型
+ environment: # 设置 Binder 的环境配置
+ # 如果是 RabbitMQ 类型的时候,则对应的是 RabbitProperties 类
+ spring:
+ rabbitmq:
+ host: 127.0.0.1 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: guest # RabbitMQ 服务的账号
+ password: guest # RabbitMQ 服务的密码
+ # Binding 配置项,对应 BindingProperties Map
+ bindings:
+ demo01-output:
+ destination: DEMO-TOPIC-02 # 目的地。这里使用 RabbitMQ Exchange
+ content-type: application/json # 内容格式。这里使用 JSON
+ binder: rabbit001 # 设置使用的 Binder 名字
+ # RabbitMQ 自定义 Binding 配置项,对应 RabbitBindingProperties Map
+ rabbit:
+ bindings:
+ demo01-output:
+ # RabbitMQ Producer 配置项,对应 RabbitProducerProperties 类
+ producer:
+ delayed-exchange: true # 是否使用 x-delayed-message 类型的 Exchange,即延迟消息,默认为 false
+
+server:
+ port: 18080
diff --git a/labx-10/pom.xml b/labx-10/pom.xml
index 76e16ea1..829da381 100644
--- a/labx-10/pom.xml
+++ b/labx-10/pom.xml
@@ -14,6 +14,11 @@
labx-10-sc-stream-rabbitmq-producer-demo
labx-10-sc-stream-rabbitmq-consumer-demo
+
+ labx-10-sc-stream-rabbitmq-producer-delay
+ labx-10-sc-stream-rabbitmq-consumer-delay
+
+ labx-10-sc-stream-rabbitmq-consumer-retry
From 51bcfb76dfd3c322acb361e6e83006d26dce4fcf Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Wed, 4 Mar 2020 08:32:49 +0800
Subject: [PATCH 26/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20str?=
=?UTF-8?q?eam=20rabbitmq=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/resources/application.yml | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/resources/application.yml
index dbbb8087..31556aaf 100644
--- a/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/resources/application.yml
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-retry/src/main/resources/application.yml
@@ -23,13 +23,20 @@ spring:
content-type: application/json # 内容格式。这里使用 JSON
group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
binder: rabbit001 # 设置使用的 Binder 名字
+ # Consumer 配置项,对应 ConsumerProperties 类
+ consumer:
+ max-attempts: 3 # 重试次数,默认为 3 次。
+ back-off-initial-interval: 3000 # 重试间隔的初始值,单位毫秒,默认为 1000
+ back-off-multiplier: 2.0 # 重试间隔的递乘系数,默认为 2.0
+ back-off-max-interval: 10000 # 重试间隔的最大值,单位毫秒,默认为 10000
# RabbitMQ 自定义 Binding 配置项,对应 RabbitBindingProperties Map
rabbit:
bindings:
demo01-input:
# RabbitMQ Consumer 配置项,对应 RabbitConsumerProperties 类
consumer:
- auto-bind-dlq: true
+ auto-bind-dlq: true # 是否创建对应的死信队列,并进行绑定,默认为 false。
+ republish-to-dlq: true # 消费失败的消息发布到对应的死信队列时,是否添加异常异常的信息到消息头
server:
port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
From ab4a54102fbf68a624cb990d59ddb47c3d4e1f33 Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Wed, 4 Mar 2020 09:18:26 +0800
Subject: [PATCH 27/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20spring=20cloud=20str?=
=?UTF-8?q?eam=20rabbitmq=20=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 58 +++++++++++++++++++
.../consumerdemo/ConsumerApplication.java | 16 +++++
.../consumerdemo/listener/Demo01Consumer.java | 39 +++++++++++++
.../consumerdemo/listener/MySink.java | 13 +++++
.../consumerdemo/message/Demo01Message.java | 29 ++++++++++
.../src/main/resources/application.yml | 42 ++++++++++++++
labx-10/pom.xml | 1 +
7 files changed, 198 insertions(+)
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/pom.xml
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
create mode 100644 labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/resources/application.yml
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/pom.xml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/pom.xml
new file mode 100644
index 00000000..b0875e48
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-10
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-10-sc-stream-rabbitmq-consumer-error-handler
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ Hoxton.SR1
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+
+
+
+
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
new file mode 100644
index 00000000..85330de4
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/ConsumerApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener.MySink;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+
+@SpringBootApplication
+@EnableBinding(MySink.class)
+public class ConsumerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ConsumerApplication.class, args);
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
new file mode 100644
index 00000000..b19346cd
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/Demo01Consumer.java
@@ -0,0 +1,39 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener;
+
+import cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.message.Demo01Message;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.context.IntegrationContextUtils;
+import org.springframework.messaging.handler.annotation.Payload;
+import org.springframework.messaging.support.ErrorMessage;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Demo01Consumer {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @StreamListener(MySink.DEMO01_INPUT)
+ public void onMessage(@Payload Demo01Message message) {
+ logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
+ // 注意,此处抛出一个 RuntimeException 异常,模拟消费失败
+ throw new RuntimeException("我就是故意抛出一个异常");
+ }
+
+ @ServiceActivator(inputChannel = "DEMO-TOPIC-01.demo01-consumer-group-DEMO-TOPIC-01.errors")
+ public void handleError(ErrorMessage errorMessage) {
+ logger.error("[handleError][payload:{}]", errorMessage.getPayload().getMessage());
+ logger.error("[handleError][originalMessage:{}]", errorMessage.getOriginalMessage());
+ logger.error("[handleError][headers:{}]", errorMessage.getHeaders());
+ }
+
+ @StreamListener(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME) // errorChannel
+ public void globalHandleError(ErrorMessage errorMessage) {
+ logger.error("[globalHandleError][payload:{}]", errorMessage.getPayload().getMessage());
+ logger.error("[globalHandleError][originalMessage:{}]", errorMessage.getOriginalMessage());
+ logger.error("[globalHandleError][headers:{}]", errorMessage.getHeaders());
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
new file mode 100644
index 00000000..7a894faa
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/listener/MySink.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.listener;
+
+import org.springframework.cloud.stream.annotation.Input;
+import org.springframework.messaging.SubscribableChannel;
+
+public interface MySink {
+
+ String DEMO01_INPUT = "demo01-input";
+
+ @Input(DEMO01_INPUT)
+ SubscribableChannel demo01Input();
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
new file mode 100644
index 00000000..74c4255d
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/java/cn/iocoder/springcloud/labx10/rabbitmqdemo/consumerdemo/message/Demo01Message.java
@@ -0,0 +1,29 @@
+package cn.iocoder.springcloud.labx10.rabbitmqdemo.consumerdemo.message;
+
+/**
+ * 示例 01 的 Message 消息
+ */
+public class Demo01Message {
+
+ /**
+ * 编号
+ */
+ private Integer id;
+
+ public Demo01Message setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "Demo01Message{" +
+ "id=" + id +
+ '}';
+ }
+
+}
diff --git a/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/resources/application.yml b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/resources/application.yml
new file mode 100644
index 00000000..31556aaf
--- /dev/null
+++ b/labx-10/labx-10-sc-stream-rabbitmq-consumer-error-handler/src/main/resources/application.yml
@@ -0,0 +1,42 @@
+spring:
+ application:
+ name: demo-consumer-application
+ cloud:
+ # Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
+ stream:
+ # Binder 配置项,对应 BinderProperties Map
+ binders:
+ rabbit001:
+ type: rabbit # 设置 Binder 的类型
+ environment: # 设置 Binder 的环境配置
+ # 如果是 RabbitMQ 类型的时候,则对应的是 RabbitProperties 类
+ spring:
+ rabbitmq:
+ host: 127.0.0.1 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: guest # RabbitMQ 服务的账号
+ password: guest # RabbitMQ 服务的密码
+ # Binding 配置项,对应 BindingProperties Map
+ bindings:
+ demo01-input:
+ destination: DEMO-TOPIC-01 # 目的地。这里使用 RabbitMQ Exchange
+ content-type: application/json # 内容格式。这里使用 JSON
+ group: demo01-consumer-group-DEMO-TOPIC-01 # 消费者分组
+ binder: rabbit001 # 设置使用的 Binder 名字
+ # Consumer 配置项,对应 ConsumerProperties 类
+ consumer:
+ max-attempts: 3 # 重试次数,默认为 3 次。
+ back-off-initial-interval: 3000 # 重试间隔的初始值,单位毫秒,默认为 1000
+ back-off-multiplier: 2.0 # 重试间隔的递乘系数,默认为 2.0
+ back-off-max-interval: 10000 # 重试间隔的最大值,单位毫秒,默认为 10000
+ # RabbitMQ 自定义 Binding 配置项,对应 RabbitBindingProperties Map
+ rabbit:
+ bindings:
+ demo01-input:
+ # RabbitMQ Consumer 配置项,对应 RabbitConsumerProperties 类
+ consumer:
+ auto-bind-dlq: true # 是否创建对应的死信队列,并进行绑定,默认为 false。
+ republish-to-dlq: true # 消费失败的消息发布到对应的死信队列时,是否添加异常异常的信息到消息头
+
+server:
+ port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
diff --git a/labx-10/pom.xml b/labx-10/pom.xml
index 829da381..c41ffe46 100644
--- a/labx-10/pom.xml
+++ b/labx-10/pom.xml
@@ -19,6 +19,7 @@
labx-10-sc-stream-rabbitmq-consumer-delay
labx-10-sc-stream-rabbitmq-consumer-retry
+ labx-10-sc-stream-rabbitmq-consumer-error-handler