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