前面學習了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 ,javacompiler和javassist
@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&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×tamp=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;