Spring Cloud 分布式事件驱动编程
TOC
[TOC]
课件
本期议题
- Java 标准事件
- Spring 标准事件
- Spring Cloud 分布式事件
架构图
本地事件
远程事件
本次事件
Java 标准事件
- 标准事件
java.util.EventObject
- 标准监听器
java.util.EventListener
Java 的 MourseEvent 事件, Java 标准的方式
在 MQ 中,事件的载体运用了消息。
HTTP,是 同步的事件,Request,Response
Spring 标准事件
- 标准事件
org.springframework.context.ApplicationEvent
- 标准监听器
org.springframework.context.ApplicationListener
- 事件发布器
org.springframework.context.ApplicationEventPublisher
ApplicationFailEvent
本地的事件
ApplicationEvent
ApplicationContextEvent
ContextRefreshedEvent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import org.springframework.context.PayloadApplicationEvent;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/***
* XML 形式的 Application Demo
*
* @author <a href="mailto:[email protected]">Darian</a>
* @date 2020/5/26 3:14
*/
public class XmlApplicationContextDemo {
public static void main(String[] args) {
ClassPathXmlApplicationContext xmlApplicationContext = new ClassPathXmlApplicationContext();
xmlApplicationContext.addApplicationListener(event -> {
if (event instanceof PayloadApplicationEvent) {
PayloadApplicationEvent payloadApplicationEvent = PayloadApplicationEvent.class.cast(event);
System.err.println(payloadApplicationEvent.getPayload());
} else {
System.err.println(event);
}
});
xmlApplicationContext.refresh();
// Spring 萨汗国那下文是一个 事件发布器,非 ApplicationEvent, 是 PayLoadApplicationEvent
xmlApplicationContext.publishEvent("Hello, World!");
xmlApplicationContext.publishEvent(156456);
}
}
1
2
3
4
org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@52525845: startup date [Tue May 26 03:31:09 CST 2020]; root of context hierarchy]
03:31:09.370 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source
Hello, World!
156456
Spring Cloud 分布式事件
- 分布式事件
org.springframework.cloud.bus.event.RemoteApplicationEvent
实现类org.springframework.cloud.bus.event.EnvironmentChangeRemoteApplicationEvent
org.springframework.cloud.bus.event.**RefreshRemoteApplicationEvent
从谁发给谁?,是同步还是异步?
1
2
3
4
5
public abstract class RemoteApplicationEvent extends ApplicationEvent {
private static final Object TRANSIENT_SOURCE = new Object();
private final String originService;
private final String destinationService;
private final String id;
Spring Cloud Bus
Spring Cloud Bus links the nodes of a distributed system with a lightweight message broker. This broker can then be used to broadcast state changes (such as configuration changes) or other management instructions. A key idea is that the bus is like a distributed actuator for a Spring Boot application that is scaled out. However, it can also be used as a communication channel between apps. This project provides starters for either an AMQP broker or Kafka as the transport.
…
…
…
The bus currently supports sending messages to all nodes listening or all nodes for a particular service (as defined by Eureka). The
/bus/*
actuator namespace has some HTTP endpoints. Currently, two are implemented. The first,/bus/env
, sends key/value pairs to update each node’s Spring Environment. The second,/bus/refresh
, reloads each application’s configuration, as though they had all been pinged on their/refresh
endpoint.
Spring Cloud Bus 通过 轻量级的 message broker ,来进行实现应用之间的通信。
Bus 只是告诉了你一个端口,没有告诉你往哪里走,
“/bus/refresh?destination=customers.**”
提供者的发送端口,事件源在哪里,没有告诉你 IP,所以必须进行依赖于服务发现
1
2
3
4
5
6
7
+------------------------+ +-------+ +------------------------+
| | JSON | | JSON | |
| RemoteApplicationEvent | ------> | Kafka | ----> | RemoteApplicationEvent |
| A | | | | B |
+------------------------+ +-------+ +------------------------+
EventObject
(JDK)
ApplicationEvent
(Spring)RemoteApplicationEvent
(Spring-cloud)MessageRemoteApplicationEvent
(Customized)
Kafka 和 zookeeper 版本最好对应
http://localhost:8080/send/sync/event?message=ss&destinationService=localhost:8081
curl