diff --git a/labx-26/labx-26-sc-zookeeper-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx26/zookeeperdemo/controller/DemoController.java b/labx-26/labx-26-sc-zookeeper-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx26/zookeeperdemo/controller/DemoController.java
index e45a0442..a0c36f7d 100644
--- a/labx-26/labx-26-sc-zookeeper-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx26/zookeeperdemo/controller/DemoController.java
+++ b/labx-26/labx-26-sc-zookeeper-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx26/zookeeperdemo/controller/DemoController.java
@@ -12,6 +12,7 @@ import java.util.Map;
@RestController
@RequestMapping("/demo")
+@RefreshScope
public class DemoController {
@Autowired
diff --git a/labx-28/labx-28-sc-consul-config-auto-refresh/pom.xml b/labx-28/labx-28-sc-consul-config-auto-refresh/pom.xml
index fa89b96b..30034a28 100644
--- a/labx-28/labx-28-sc-consul-config-auto-refresh/pom.xml
+++ b/labx-28/labx-28-sc-consul-config-auto-refresh/pom.xml
@@ -12,6 +12,8 @@
labx-28-sc-consul-config-auto-refresh
+ 1.8
+ 1.8
2.2.4.RELEASE
Hoxton.SR1
diff --git a/labx-28/labx-28-sc-consul-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx28/consuldemo/controller/DemoController.java b/labx-28/labx-28-sc-consul-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx28/consuldemo/controller/DemoController.java
index 57a4603d..4ada7ce6 100644
--- a/labx-28/labx-28-sc-consul-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx28/consuldemo/controller/DemoController.java
+++ b/labx-28/labx-28-sc-consul-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx28/consuldemo/controller/DemoController.java
@@ -3,6 +3,7 @@ package cn.iocoder.springcloud.labx28.consuldemo.controller;
import cn.iocoder.springcloud.labx28.consuldemo.config.OrderProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -12,6 +13,7 @@ import java.util.Map;
@RestController
@RequestMapping("/demo")
+@RefreshScope
public class DemoController {
@Autowired
diff --git a/labx-28/labx-28-sc-consul-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx28/consuldemo/listener/DemoEnvironmentChangeListener.java b/labx-28/labx-28-sc-consul-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx28/consuldemo/listener/DemoEnvironmentChangeListener.java
new file mode 100644
index 00000000..33683c38
--- /dev/null
+++ b/labx-28/labx-28-sc-consul-config-auto-refresh/src/main/java/cn/iocoder/springcloud/labx28/consuldemo/listener/DemoEnvironmentChangeListener.java
@@ -0,0 +1,26 @@
+package cn.iocoder.springcloud.labx28.consuldemo.listener;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DemoEnvironmentChangeListener implements ApplicationListener {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Autowired
+ private ConfigurableEnvironment environment;
+
+ @Override
+ public void onApplicationEvent(EnvironmentChangeEvent event) {
+ for (String key : event.getKeys()) {
+ logger.info("[onApplicationEvent][key({}) 最新 value 为 {}]", key, environment.getProperty(key));
+ }
+ }
+
+}
diff --git a/labx-28/pom.xml b/labx-28/pom.xml
index a603bb36..002f0069 100644
--- a/labx-28/pom.xml
+++ b/labx-28/pom.xml
@@ -14,6 +14,7 @@
labx-28-sc-consul-config-demo
+ labx-28-sc-consul-config-auto-refresh
diff --git a/labx-28/《芋道 Spring Cloud 配置中心 Consul 入门》.md b/labx-28/《芋道 Spring Cloud 配置中心 Consul 入门》.md
new file mode 100644
index 00000000..2b7a83ae
--- /dev/null
+++ b/labx-28/《芋道 Spring Cloud 配置中心 Consul 入门》.md
@@ -0,0 +1 @@
+
diff --git a/labx-29/labx-29-sc-bus-consul-demo-listener/pom.xml b/labx-29/labx-29-sc-bus-consul-demo-listener/pom.xml
new file mode 100644
index 00000000..81334682
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-listener/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ labx-29
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-29-sc-bus-consul-demo-listener
+
+
+ 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-consul-bus
+
+
+
+
diff --git a/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/java/cn/iocoder/springcloud/labx29/listenerdemo/ListenerDemoApplication.java b/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/java/cn/iocoder/springcloud/labx29/listenerdemo/ListenerDemoApplication.java
new file mode 100644
index 00000000..ef24b9b8
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/java/cn/iocoder/springcloud/labx29/listenerdemo/ListenerDemoApplication.java
@@ -0,0 +1,15 @@
+package cn.iocoder.springcloud.labx29.listenerdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.bus.jackson.RemoteApplicationEventScan;
+
+@SpringBootApplication
+@RemoteApplicationEventScan
+public class ListenerDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ListenerDemoApplication.class, args);
+ }
+
+}
diff --git a/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/java/cn/iocoder/springcloud/labx29/listenerdemo/event/UserRegisterEvent.java b/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/java/cn/iocoder/springcloud/labx29/listenerdemo/event/UserRegisterEvent.java
new file mode 100644
index 00000000..4a25297f
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/java/cn/iocoder/springcloud/labx29/listenerdemo/event/UserRegisterEvent.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springcloud.labx29.listenerdemo.event;
+
+import org.springframework.cloud.bus.event.RemoteApplicationEvent;
+
+/**
+ * 用户注册事件
+ */
+public class UserRegisterEvent extends RemoteApplicationEvent {
+
+ /**
+ * 用户名
+ */
+ private String username;
+
+ public UserRegisterEvent() { // 序列化
+ }
+
+ public UserRegisterEvent(Object source, String originService, String destinationService, String username) {
+ super(source, originService);
+ this.username = username;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+}
diff --git a/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/java/cn/iocoder/springcloud/labx29/listenerdemo/listener/UserRegisterListener.java b/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/java/cn/iocoder/springcloud/labx29/listenerdemo/listener/UserRegisterListener.java
new file mode 100644
index 00000000..a4c52697
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/java/cn/iocoder/springcloud/labx29/listenerdemo/listener/UserRegisterListener.java
@@ -0,0 +1,22 @@
+package cn.iocoder.springcloud.labx29.listenerdemo.listener;
+
+import cn.iocoder.springcloud.labx29.listenerdemo.event.UserRegisterEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * 用户注册事件的监听器
+ */
+@Component
+public class UserRegisterListener implements ApplicationListener {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ public void onApplicationEvent(UserRegisterEvent event) {
+ logger.info("[onApplicationEvent][监听到用户({}) 注册]", event.getUsername());
+ }
+
+}
diff --git a/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/resources/application.yml b/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/resources/application.yml
new file mode 100644
index 00000000..da9aa289
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-listener/src/main/resources/application.yml
@@ -0,0 +1,12 @@
+spring:
+ application:
+ name: listener-demo
+
+ cloud:
+ # Consul
+ consul:
+ host: 127.0.0.1
+ port: 8500
+
+server:
+ port: ${random.int[10000,19999]} # 随机端口,方便启动多个消费者
diff --git a/labx-29/labx-29-sc-bus-consul-demo-publisher/pom.xml b/labx-29/labx-29-sc-bus-consul-demo-publisher/pom.xml
new file mode 100644
index 00000000..c582e50d
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-publisher/pom.xml
@@ -0,0 +1,59 @@
+
+
+
+ labx-29
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-29-sc-bus-consul-demo-publisher
+
+
+ 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
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-consul-bus
+
+
+
+
diff --git a/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/cn/iocoder/springcloud/labx29/publisherdemo/PublisherDemoApplication.java b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/cn/iocoder/springcloud/labx29/publisherdemo/PublisherDemoApplication.java
new file mode 100644
index 00000000..0dd9a255
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/cn/iocoder/springcloud/labx29/publisherdemo/PublisherDemoApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springcloud.labx29.publisherdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+//@RemoteApplicationEventScan
+public class PublisherDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PublisherDemoApplication.class, args);
+ }
+
+}
diff --git a/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/cn/iocoder/springcloud/labx29/publisherdemo/controller/DemoController.java b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/cn/iocoder/springcloud/labx29/publisherdemo/controller/DemoController.java
new file mode 100644
index 00000000..144f7d08
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/cn/iocoder/springcloud/labx29/publisherdemo/controller/DemoController.java
@@ -0,0 +1,36 @@
+package cn.iocoder.springcloud.labx29.publisherdemo.controller;
+
+import cn.iocoder.springcloud.labx29.publisherdemo.event.UserRegisterEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.bus.ServiceMatcher;
+import org.springframework.context.ApplicationEventPublisher;
+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 {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Autowired
+ private ApplicationEventPublisher applicationEventPublisher;
+
+ @Autowired
+ private ServiceMatcher busServiceMatcher;
+
+ @GetMapping("/register")
+ public String register(String username) {
+ // ... 执行注册逻辑
+ logger.info("[register][执行用户({}) 的注册逻辑]", username);
+
+ // ... 发布
+ applicationEventPublisher.publishEvent(new UserRegisterEvent(this, busServiceMatcher.getServiceId(),
+ null, username));
+ return "success";
+ }
+
+}
diff --git a/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/cn/iocoder/springcloud/labx29/publisherdemo/event/UserRegisterEvent.java b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/cn/iocoder/springcloud/labx29/publisherdemo/event/UserRegisterEvent.java
new file mode 100644
index 00000000..6936d8ed
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/cn/iocoder/springcloud/labx29/publisherdemo/event/UserRegisterEvent.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springcloud.labx29.publisherdemo.event;
+
+import org.springframework.cloud.bus.event.RemoteApplicationEvent;
+
+/**
+ * 用户注册事件
+ */
+public class UserRegisterEvent extends RemoteApplicationEvent {
+
+ /**
+ * 用户名
+ */
+ private String username;
+
+ public UserRegisterEvent() { // 序列化
+ }
+
+ public UserRegisterEvent(Object source, String originService, String destinationService, String username) {
+ super(source, originService);
+ this.username = username;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+}
diff --git a/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/org/springframework/cloud/consul/binder/ConsulSendingHandler.java b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/org/springframework/cloud/consul/binder/ConsulSendingHandler.java
new file mode 100644
index 00000000..76ed381e
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/java/org/springframework/cloud/consul/binder/ConsulSendingHandler.java
@@ -0,0 +1,46 @@
+package org.springframework.cloud.consul.binder;
+
+import com.ecwid.consul.v1.ConsulClient;
+import com.ecwid.consul.v1.QueryParams;
+import com.ecwid.consul.v1.Response;
+import com.ecwid.consul.v1.event.model.Event;
+import com.ecwid.consul.v1.event.model.EventParams;
+import org.springframework.integration.handler.AbstractMessageHandler;
+import org.springframework.messaging.Message;
+
+/**
+ * Adapter that converts and sends Messages as Consul events.
+ *
+ * @author Spencer Gibb
+ */
+public class ConsulSendingHandler extends AbstractMessageHandler {
+
+ private final ConsulClient consul;
+
+ private final String eventName;
+
+ public ConsulSendingHandler(ConsulClient consul, String eventName) {
+ this.consul = consul;
+ this.eventName = eventName;
+ }
+
+ @Override
+ protected void handleMessageInternal(Message> message) {
+ if (this.logger.isTraceEnabled()) {
+ this.logger.trace("Publishing message" + message);
+ }
+
+ // 转换成 String
+ Object payload = message.getPayload();
+ if (payload instanceof byte[]) {
+ payload = new String((byte[]) payload);
+ }
+
+ // TODO: support headers
+ // TODO: support consul event filters: NodeFilter, ServiceFilter, TagFilter
+ Response event = this.consul.eventFire(this.eventName, (String) payload,
+ new EventParams(), QueryParams.DEFAULT);
+ // TODO: return event?
+ }
+
+}
diff --git a/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/resources/application.yml b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/resources/application.yml
new file mode 100644
index 00000000..899fc2f2
--- /dev/null
+++ b/labx-29/labx-29-sc-bus-consul-demo-publisher/src/main/resources/application.yml
@@ -0,0 +1,16 @@
+server:
+ port: 8081
+
+spring:
+ application:
+ name: publisher-demo
+
+ cloud:
+ # Consul
+ consul:
+ host: 127.0.0.1
+ port: 8500
+ # Bus 相关配置项,对应 BusProperties
+ bus:
+ enabled: true # 是否开启,默认为 true
+ destination: springCloudBus # 目标消息队列,默认为 springCloudBus
diff --git a/labx-29/pom.xml b/labx-29/pom.xml
new file mode 100644
index 00000000..0fb2f4d1
--- /dev/null
+++ b/labx-29/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-29
+ pom
+
+ labx-29-sc-bus-consul-demo-publisher
+ labx-29-sc-bus-consul-demo-listener
+
+
+
+
diff --git a/pom.xml b/pom.xml
index b0bdadb6..f51d7c63 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,7 +41,7 @@
-
+ lab-31
@@ -103,7 +103,9 @@
+
labx-28
+ labx-29