观察者模式
真实场景1:Spring-Cloud-Gateway通过事件刷新路由
public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycle {
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
@Override
public void start() {
if (this.running.compareAndSet(false, true)) {
this.watchFuture = this.taskScheduler.scheduleWithFixedDelay(
this::nacosServicesWatch, this.properties.getWatchDelay());
}
}
//发布心跳事件
public void nacosServicesWatch() {
// nacos doesn't support watch now , publish an event every 30 seconds.
this.publisher.publishEvent(
new HeartbeatEvent(this, nacosWatchIndex.getAndIncrement()));
}
}
public class RouteRefreshListener implements ApplicationListener<ApplicationEvent> {
private final ApplicationEventPublisher publisher;
private HeartbeatMonitor monitor = new HeartbeatMonitor();
/**
* 构造器依赖注入一个ApplicationEventPublisher
* @param publisher
*/
public RouteRefreshListener(ApplicationEventPublisher publisher) {
Assert.notNull(publisher, "publisher may not be null");
this.publisher = publisher;
}
//事件处理
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
ContextRefreshedEvent refreshedEvent = (ContextRefreshedEvent) event;
if (!WebServerApplicationContext.hasServerNamespace(
refreshedEvent.getApplicationContext(), "management")) {
//如果收到上下文刷新事件,直接刷新路由
reset();
}
}
else if (event instanceof RefreshScopeRefreshedEvent
|| event instanceof InstanceRegisteredEvent) {
//如果收到刷新生命周期事件或者实例注册事件,直接刷新路由(Nacos2.0并没有发送这个事件)
reset();
}
else if (event instanceof ParentHeartbeatEvent) {
//如果收到双亲ApplicationContext的心跳事件,判断是否需要刷新路由(其实就是幂等判断,消息内容变化就会刷新)
ParentHeartbeatEvent e = (ParentHeartbeatEvent) event;
resetIfNeeded(e.getValue());
}
else if (event instanceof HeartbeatEvent) {
//如果收到心跳事件,判断是否需要刷新路由(其实就是幂等判断,消息内容变化就会刷新)
HeartbeatEvent e = (HeartbeatEvent) event;
resetIfNeeded(e.getValue());
}
}
//判断是否需要刷新路由
private void resetIfNeeded(Object value) {
if (this.monitor.update(value)) {
reset();
}
}
//发送刷新路由事件
private void reset() {
this.publisher.publishEvent(new RefreshRoutesEvent(this));
}
}
责任链模式
真实场景1:在Servlet#Filter、Spring-Cloud-Gateway#GatewayFilter、Soul#SoulPlugin里面都是使用了责任链的处理模式,下面以Spring-Cloud-Gateway#GatewayFilter为例:
public class FilteringWebHandler implements WebHandler{
@Override
public Mono<Void> handle(ServerWebExchange exchange) {
Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
List<GatewayFilter> gatewayFilters = route.getFilters();
List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
combined.addAll(gatewayFilters);
// TODO: needed or cached?
AnnotationAwareOrderComparator.sort(combined);
if (logger.isDebugEnabled()) {
logger.debug("Sorted gatewayFilterFactories: " + combined);
}
//生成责任链,执行第一个Filter
return new DefaultGatewayFilterChain(combined).filter(exchange);
}
private static class DefaultGatewayFilterChain implements GatewayFilterChain {
private final int index;
private final List<GatewayFilter> filters;
DefaultGatewayFilterChain(List<GatewayFilter> filters) {
this.filters = filters;
this.index = 0;
}
private DefaultGatewayFilterChain(DefaultGatewayFilterChain parent, int index) {
this.filters = parent.getFilters();
this.index = index;
}
public List<GatewayFilter> getFilters() {
return filters;
}
//执行对应当前index的Filter,并生成下一个chain
@Override
public Mono<Void> filter(ServerWebExchange exchange) {
return Mono.defer(() -> {
if (this.index < filters.size()) {
GatewayFilter filter = filters.get(this.index);
DefaultGatewayFilterChain chain = new DefaultGatewayFilterChain(this,
this.index + 1);
return filter.filter(exchange, chain);
}
else {
return Mono.empty(); // complete
}
});
}
}
}
适配器模式
真实场景1:Spring-Cloud-Gateway中GlobalFilter(作用于每个路由)适配成普通GatewayFilter
public interface GlobalFilter {
/**
* Process the Web request and (optionally) delegate to the next {@code WebFilter}
* through the given {@link GatewayFilterChain}.
* @param exchange the current server exchange
* @param chain provides a way to delegate to the next filter
* @return {@code Mono<Void>} to indicate when request processing is complete
*/
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
public interface GatewayFilter extends ShortcutConfigurable {
/**
* Name key.
*/
String NAME_KEY = "name";
/**
* Value key.
*/
String VALUE_KEY = "value";
/**
* Process the Web request and (optionally) delegate to the next {@code WebFilter}
* through the given {@link GatewayFilterChain}.
* @param exchange the current server exchange
* @param chain provides a way to delegate to the next filter
* @return {@code Mono<Void>} to indicate when request processing is complete
*/
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
public class FilteringWebHandler implements WebHandler {
//适配器
private static class GatewayFilterAdapter implements GatewayFilter {
private final GlobalFilter delegate;
GatewayFilterAdapter(GlobalFilter delegate) {
this.delegate = delegate;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return this.delegate.filter(exchange, chain);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("GatewayFilterAdapter{");
sb.append("delegate=").append(delegate);
sb.append('}');
return sb.toString();
}
}
}
真实场景2:WebFlux中WebHandler适配成HttpHandler
public interface HttpHandler {
/**
* Handle the given request and write to the response.
* @param request current request
* @param response current response
* @return indicates completion of request handling
*/
Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response);
}
public interface WebHandler {
//ServerHttpRequest、ServerHttpResponse变成了ServerWebExchange
/**
* Handle the web server exchange.
* @param exchange the current server exchange
* @return {@code Mono<Void>} to indicate when request handling is complete
*/
Mono<Void> handle(ServerWebExchange exchange);
}
//装饰器模式,代码很简单
public class WebHandlerDecorator implements WebHandler {
private final WebHandler delegate;
/**
* Create a {@code WebHandlerDecorator} for the given delegate.
* @param delegate the WebHandler delegate
*/
public WebHandlerDecorator(WebHandler delegate) {
Assert.notNull(delegate, "'delegate' must not be null");
this.delegate = delegate;
}
/**
* Return the wrapped delegate.
*/
public WebHandler getDelegate() {
return this.delegate;
}
@Override
public Mono<Void> handle(ServerWebExchange exchange) {
return this.delegate.handle(exchange);
}
}
//适配器
public class HttpWebHandlerAdapter extends WebHandlerDecorator implements HttpHandler {
@Override
public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
if (this.forwardedHeaderTransformer != null) {
request = this.forwardedHeaderTransformer.apply(request);
}
//创建ServerWebExchange
ServerWebExchange exchange = createExchange(request, response);
LogFormatUtils.traceDebug(logger, traceOn ->
exchange.getLogPrefix() + formatRequest(exchange.getRequest()) +
(traceOn ? ", headers=" + formatHeaders(exchange.getRequest().getHeaders()) : ""));
//执行WebHandlerDecorator#handle
return getDelegate().handle(exchange)
.doOnSuccess(aVoid -> logResponse(exchange))
.onErrorResume(ex -> handleUnresolvedError(exchange, ex))
.then(Mono.defer(response::setComplete));
}
}
单例模式
先列举有哪些正经的单例模式
线程安全的懒汉模式
public class Singleton_02 {
private static Singleton_02 instance;
private Singleton_02() {
}
public static synchronized Singleton_02 getInstance(){
if (null != instance) return instance;
instance = new Singleton_02();
return instance;
}
}
使⽤类的内部类(线程安全)
public class Singleton_04 {
private static class SingletonHolder {
private static Singleton_04 instance = new Singleton_04();
}
private Singleton_04() {
}
public static Singleton_04 getInstance() {
return SingletonHolder.instance;
}
}
双重锁校验(线程安全)
public class Singleton_05 {
private static Singleton_05 instance;
private Singleton_05() {
}
public static Singleton_05 getInstance(){
if(null != instance) return instance;
synchronized (Singleton_05.class){
if (null == instance){
instance = new Singleton_05();
}
}
return instance;
}
}
枚举单例(线程安全)
public enum Singleton_07 {
INSTANCE;
public void test(){
System.out.println("hi~");
}
}
Singleton_07.INSTANCE.test();
真实场景1:soul里面的单例模式
public enum Singleton {
/**
* Inst singleton.
*/
INST;
/**
* The Singles.
*/
private static final Map<String, Object> SINGLES = new ConcurrentHashMap<>();
/**
* Single.
*
* @param clazz the clazz
* @param o the o
*/
public void single(final Class clazz, final Object o) {
SINGLES.put(clazz.getName(), o);
}
/**
* Get t.
*
* @param <T> the type parameter
* @param clazz the clazz
* @return the t
*/
@SuppressWarnings("unchecked")
public <T> T get(final Class<T> clazz) {
return (T) SINGLES.get(clazz.getName());
}
}