dubbo學習筆記 八 dubbo-common

前面學習了config container registry,爲了後面的學習,今天開始學習下dubbo-common


beanutil 

這裏面對class的一些定義和對反射的封裝
public enum JavaBeanAccessor {

    /** Field accessor. */
    FIELD,
    /** Method accessor.*/
    METHOD,
    /** Method prefer to field. */
    ALL;

    public static boolean isAccessByMethod(JavaBeanAccessor accessor) {
        return METHOD.equals(accessor) || ALL.equals(accessor);
    }

    public static boolean isAccessByField(JavaBeanAccessor accessor) {
        return FIELD.equals(accessor) || ALL.equals(accessor);
    }

}



bytecode

核心是proxy和wrapper  動態操作源代碼  proxy 主要是javassist 的實現

wrapper 主要是invokeMethod

public Object invokeMethod(Object o, String n, Class[] p, Object[] v)
			throws java.lang.reflect.InvocationTargetException {
		com.alibaba.dubbo.demo.DemoService w;
		try {
			w = ((com.alibaba.dubbo.demo.DemoService) $1);
		} catch (Throwable e) {
			throw new IllegalArgumentException(e);
		}
		try {
			if ("sayHello".equals($2) && $3.length == 1) {
				return ($w) w.sayHello((java.lang.String) $4[0]);
			}
		} catch (Throwable e) {
			throw new java.lang.reflect.InvocationTargetException(e);
		}
		throw new com.alibaba.dubbo.common.bytecode.NoSuchMethodException(
				"Not found method \"" + $2 + "\" in class com.alibaba.dubbo.demo.DemoService.");
	}


compiler

重點是實現編譯,從源代碼到 Class ,javacompilerjavassist

@SPI("javassist")
public interface Compiler {

	/**
	 * Compile java source code.
	 * 
	 * @param code Java source code
	 * @param classLoader TODO
	 * @return Compiled class
	 */
	Class<?> compile(String code, ClassLoader classLoader);

}

extension

這個包下面的東西是核心,如果通過配置擴展和動態加載實現類,就靠它來是實現,因爲內容較多,單開一節

ExtensionLoader

   public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
        if (type == null)
            throw new IllegalArgumentException("Extension type == null");
        if(!type.isInterface()) {
            throw new IllegalArgumentException("Extension type(" + type + ") is not interface!");
        }
        if(!withExtensionAnnotation(type)) {
            throw new IllegalArgumentException("Extension type(" + type + 
                    ") is not extension, because WITHOUT @" + SPI.class.getSimpleName() + " Annotation!");
        }
        
        ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
        if (loader == null) {
            EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type));
            loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
        }
        return loader;
    }


io

一些btye操作,和reader writer

json

一些對json的封裝

logger

內部logger的封裝,對其他日誌框架留有適配

serialize

dubbo/hessian/java/json/nativejava 各種序列化框架的實現,主要就是 io流和對象的相互轉化

public interface Serialization {

    /**
     * get content type id
     * 
     * @return content type id
     */
    byte getContentTypeId();

    /**
     * get content type
     * 
     * @return content type
     */
    String getContentType();

    /**
     * create serializer
     * @param url 
     * @param output
     * @return serializer
     * @throws IOException
     */
    @Adaptive
    ObjectOutput serialize(URL url, OutputStream output) throws IOException;

    /**
     * create deserializer
     * @param url 
     * @param input
     * @return deserializer
     * @throws IOException
     */
    @Adaptive
    ObjectInput deserialize(URL url, InputStream input) throws IOException;

}

status

dubbo 內部運行狀態的定義

public class Status {
    
    /**
     * Level
     */
    public static enum Level {
        /**
         * OK
         */
        OK, 
        
        /**
         * WARN
         */
        WARN, 
        
        /**
         * ERROR
         */
        ERROR, 
        
        /**
         * UNKNOWN
         */
        UNKNOWN
    }

store

簡單的map存儲類,提供統一的工具類

@SPI("simple")
public interface DataStore {

    /**
     * return a snapshot value of componentName
     */
    Map<String,Object> get(String componentName);

    Object get(String componentName, String key);

    void put(String componentName, String key, Object value);

    void remove(String componentName, String key);

}

threadpool

對java的線程池做了一層封裝,提供出工具類來

@SPI("fixed")
public interface ThreadPool {
    
    /**
     * 線程池
     * 
     * @param url 線程參數
     * @return 線程池
     */
    @Adaptive({Constants.THREADPOOL_KEY})
    Executor getExecutor(URL url);

}

util

提供一些工具類

URL

registry://192.168.1.7:9090/com.alibaba.service1?param1=value1&amp;param2=value2


URL 本來是用來遠程尋址的,dubbo 用它來暴露服務

injvm://127.0.0.1/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=91627&side=provider&timestamp=1482029844843



public final class URL implements Serializable {

    private static final long serialVersionUID = -1985165475234910535L;

    private final String protocol;

	private final String username;

	private final String password;

	private final String host;

	private final int port;

	private final String path;

    private final Map<String, String> parameters;


發佈了111 篇原創文章 · 獲贊 3 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章