闲来无事,贴zuul框架下的一个类的源码

2022-05-19  本文已影响0人  天草二十六_简村人

对于初学设计模式的小伙伴,试看下,这里使用了哪些设计模式

package com.netflix.zuul.filters;

import com.netflix.zuul.ZuulFilter;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;

public class FilterRegistry {
    private static final FilterRegistry INSTANCE = new FilterRegistry();
    private final ConcurrentHashMap<String, ZuulFilter> filters = new ConcurrentHashMap();

    public static final FilterRegistry instance() {
        return INSTANCE;
    }

    private FilterRegistry() {
    }

    public ZuulFilter remove(String key) {
        return (ZuulFilter)this.filters.remove(key);
    }

    public ZuulFilter get(String key) {
        return (ZuulFilter)this.filters.get(key);
    }

    public void put(String key, ZuulFilter filter) {
        this.filters.putIfAbsent(key, filter);
    }

    public int size() {
        return this.filters.size();
    }

    public Collection<ZuulFilter> getAllFilters() {
        return this.filters.values();
    }
}

自己在使用容器做进程内缓存的时候,当可能遇到并发的场景,考虑ConcurrentHashMap,而不是HashMap。

最后贴出这个类的被调用的写法示例。

ConcurrentHashMap的使用示例.png

这里,它把getFilter和putFilter分开实现。
此外,大量使用了ConcurrentHashMap并发集合。

    private final ConcurrentHashMap<String, Long> filterClassLastModified = new ConcurrentHashMap();
    private final ConcurrentHashMap<String, String> filterClassCode = new ConcurrentHashMap();
    private final ConcurrentHashMap<String, String> filterCheck = new ConcurrentHashMap();
    private final ConcurrentHashMap<String, List<ZuulFilter>> hashFiltersByType = new ConcurrentHashMap();
getFilter.png

ZuulFilter的实现:filter = FILTER_FACTORY.newInstance(clazz); 它这里有两点值得说。

    static FilterFactory FILTER_FACTORY = new DefaultFilterFactory();
    public void setFilterFactory(FilterFactory factory) {
        FILTER_FACTORY = factory;
    }
public interface FilterFactory {
    ZuulFilter newInstance(Class var1) throws Exception;
}

public class DefaultFilterFactory implements FilterFactory {
    public DefaultFilterFactory() {
    }

    public ZuulFilter newInstance(Class clazz) throws InstantiationException, IllegalAccessException {
        return (ZuulFilter)clazz.newInstance();
    }
}
上一篇下一篇

猜你喜欢

热点阅读